diff options
author | Gaurav Jindal <gjindal@codeaurora.org> | 2019-11-04 10:27:47 +0530 |
---|---|---|
committer | Raymon Sang <csang@codeaurora.org> | 2019-11-11 17:38:33 +0800 |
commit | 715229b6f9ceb13704ec5f4e3ae0d46a8cf8ae39 (patch) | |
tree | 643e0fe6ad1a75a0d2e91445bb36c07e07d8800a | |
parent | f632bfb5a91db4dc3669bcf177d3375f73bbadff (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.c | 9 | ||||
-rw-r--r-- | drivers/media/platform/msm/camera/cam_lrme/lrme_hw_mgr/lrme_hw/cam_lrme_hw_core.c | 5 |
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; } |