aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaurav Jindal <gjindal@codeaurora.org>2019-11-04 10:27:47 +0530
committerRaymon Sang <csang@codeaurora.org>2019-11-11 17:38:33 +0800
commit715229b6f9ceb13704ec5f4e3ae0d46a8cf8ae39 (patch)
tree643e0fe6ad1a75a0d2e91445bb36c07e07d8800a
parentf632bfb5a91db4dc3669bcf177d3375f73bbadff (diff)
msm: camera: Add mutex protection while dumping registersLA.UM.8.9.r1-05900-SM6xx.0
During LDAR dump, LRME, FD registers are dumped. Due to race conditions or concurrency, there might be a situation where the hw is in OFF state and still the registers are read. This will cause aborts on core. This commit protects the dumping logic with the hw_mutex for the two drivers. Also it fixes one crash scenario while dumping the FD registers. Change-Id: I9b58b43a005a717b059a1a59d64b1810969004aa Signed-off-by: Gaurav Jindal <gjindal@codeaurora.org>
-rw-r--r--drivers/media/platform/msm/camera/cam_fd/fd_hw_mgr/fd_hw/cam_fd_hw_core.c9
-rw-r--r--drivers/media/platform/msm/camera/cam_lrme/lrme_hw_mgr/lrme_hw/cam_lrme_hw_core.c5
2 files changed, 9 insertions, 5 deletions
diff --git a/drivers/media/platform/msm/camera/cam_fd/fd_hw_mgr/fd_hw/cam_fd_hw_core.c b/drivers/media/platform/msm/camera/cam_fd/fd_hw_mgr/fd_hw/cam_fd_hw_core.c
index 20378cad81a6..ef48e9b5e1bc 100644
--- a/drivers/media/platform/msm/camera/cam_fd/fd_hw_mgr/fd_hw/cam_fd_hw_core.c
+++ b/drivers/media/platform/msm/camera/cam_fd/fd_hw_mgr/fd_hw/cam_fd_hw_core.c
@@ -540,7 +540,6 @@ static int cam_fd_hw_util_processcmd_hw_dump(struct cam_hw_info *fd_hw,
mutex_unlock(&fd_hw->hw_mutex);
return 0;
}
- mutex_unlock(&fd_hw->hw_mutex);
dump_args = (struct cam_fd_hw_dump_args *)args;
soc_info = &fd_hw->soc_info;
@@ -551,6 +550,7 @@ static int cam_fd_hw_util_processcmd_hw_dump(struct cam_hw_info *fd_hw,
if (remain_len < min_len) {
CAM_ERR(CAM_FD, "dump buffer exhaust %d %d",
remain_len, min_len);
+ mutex_unlock(&fd_hw->hw_mutex);
return 0;
}
dst = (char *)dump_args->cpu_addr + dump_args->offset;
@@ -561,14 +561,15 @@ static int cam_fd_hw_util_processcmd_hw_dump(struct cam_hw_info *fd_hw,
addr = (uint32_t *)(dst + sizeof(struct cam_fd_hw_dump_header));
start = addr;
*addr++ = soc_info->index;
- num_reg = soc_info->reg_map[0].size/4;
for (j = 0; j < soc_info->num_reg_map; j++) {
+ num_reg = soc_info->reg_map[j].size/4;
for (i = 0; i < num_reg; i++) {
- *addr++ = soc_info->mem_block[0]->start + i*4;
- *addr++ = cam_io_r(soc_info->reg_map[i].mem_base +
+ *addr++ = soc_info->mem_block[j]->start + i*4;
+ *addr++ = cam_io_r(soc_info->reg_map[j].mem_base +
(i*4));
}
}
+ mutex_unlock(&fd_hw->hw_mutex);
hdr->size = hdr->word_size * (addr - start);
dump_args->offset += hdr->size +
sizeof(struct cam_fd_hw_dump_header);
diff --git a/drivers/media/platform/msm/camera/cam_lrme/lrme_hw_mgr/lrme_hw/cam_lrme_hw_core.c b/drivers/media/platform/msm/camera/cam_lrme/lrme_hw_mgr/lrme_hw/cam_lrme_hw_core.c
index 880eaa4c20a6..4b6f0b9514ff 100644
--- a/drivers/media/platform/msm/camera/cam_lrme/lrme_hw_mgr/lrme_hw/cam_lrme_hw_core.c
+++ b/drivers/media/platform/msm/camera/cam_lrme/lrme_hw_mgr/lrme_hw/cam_lrme_hw_core.c
@@ -90,7 +90,6 @@ static int cam_lrme_hw_dump(struct cam_hw_info *lrme_hw,
mutex_unlock(&lrme_hw->hw_mutex);
return 0;
}
- mutex_unlock(&lrme_hw->hw_mutex);
if (lrme_core->req_submit &&
lrme_core->req_submit->req_id == dump_args->request_id)
req = lrme_core->req_submit;
@@ -100,6 +99,7 @@ static int cam_lrme_hw_dump(struct cam_hw_info *lrme_hw,
if (!req) {
CAM_DBG(CAM_LRME, "LRME req %lld not with hw",
dump_args->request_id);
+ mutex_unlock(&lrme_hw->hw_mutex);
return 0;
}
cam_common_util_get_curr_timestamp(&cur_time);
@@ -112,6 +112,7 @@ static int cam_lrme_hw_dump(struct cam_hw_info *lrme_hw,
req->submit_timestamp.tv_usec,
cur_time.tv_sec,
cur_time.tv_usec);
+ mutex_unlock(&lrme_hw->hw_mutex);
return 0;
}
CAM_INFO(CAM_LRME, "Error req %lld %ld:%06ld %ld:%06ld",
@@ -126,6 +127,7 @@ static int cam_lrme_hw_dump(struct cam_hw_info *lrme_hw,
if (remain_len < min_len) {
CAM_ERR(CAM_LRME, "dump buffer exhaust %d %d",
remain_len, min_len);
+ mutex_unlock(&lrme_hw->hw_mutex);
return 0;
}
dst = (char *)dump_args->cpu_addr + dump_args->offset;
@@ -144,6 +146,7 @@ static int cam_lrme_hw_dump(struct cam_hw_info *lrme_hw,
dump_args->offset += hdr->size +
sizeof(struct cam_lrme_hw_dump_header);
cam_lrme_dump_regs_to_buf(req, lrme_hw, dump_args);
+ mutex_unlock(&lrme_hw->hw_mutex);
return 0;
}