瀏覽代碼

msm: camera: isp: Register dump for first request id

First request id not getting dump if early pcr is on.
If early pcr is on need to store the parsed register dump descriptor
for first request id which comes as init packet.

CRs-Fixed: 2595702
Change-Id: Icbf94d65b5c35cdf47044d770c7db7093001d506
Signed-off-by: Ravikishore Pampana <[email protected]>
Signed-off-by: Mukund Madhusudan Atre <[email protected]>
Ravikishore Pampana 5 年之前
父節點
當前提交
05378eff25
共有 2 個文件被更改,包括 32 次插入5 次删除
  1. 16 3
      drivers/cam_isp/cam_isp_context.c
  2. 16 2
      drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c

+ 16 - 3
drivers/cam_isp/cam_isp_context.c

@@ -248,9 +248,11 @@ static int __cam_isp_ctx_enqueue_init_request(
 	struct cam_context *ctx, struct cam_ctx_request *req)
 	struct cam_context *ctx, struct cam_ctx_request *req)
 {
 {
 	int rc = 0;
 	int rc = 0;
-	struct cam_ctx_request           *req_old;
-	struct cam_isp_ctx_req           *req_isp_old;
-	struct cam_isp_ctx_req           *req_isp_new;
+	struct cam_ctx_request                *req_old;
+	struct cam_isp_ctx_req                *req_isp_old;
+	struct cam_isp_ctx_req                *req_isp_new;
+	struct cam_isp_prepare_hw_update_data *req_update_old;
+	struct cam_isp_prepare_hw_update_data *req_update_new;
 
 
 	spin_lock_bh(&ctx->lock);
 	spin_lock_bh(&ctx->lock);
 	if (list_empty(&ctx->pending_req_list)) {
 	if (list_empty(&ctx->pending_req_list)) {
@@ -302,6 +304,17 @@ static int __cam_isp_ctx_enqueue_init_request(
 			memcpy(&req_old->pf_data, &req->pf_data,
 			memcpy(&req_old->pf_data, &req->pf_data,
 				sizeof(struct cam_hw_mgr_dump_pf_data));
 				sizeof(struct cam_hw_mgr_dump_pf_data));
 
 
+			if (req_isp_new->hw_update_data.num_reg_dump_buf) {
+				req_update_new = &req_isp_new->hw_update_data;
+				req_update_old = &req_isp_old->hw_update_data;
+				memcpy(&req_update_old->reg_dump_buf_desc,
+					&req_update_new->reg_dump_buf_desc,
+					sizeof(struct cam_cmd_buf_desc) *
+					req_update_new->num_reg_dump_buf);
+				req_update_old->num_reg_dump_buf =
+					req_update_new->num_reg_dump_buf;
+			}
+
 			req_old->request_id = req->request_id;
 			req_old->request_id = req->request_id;
 
 
 			list_add_tail(&req->list, &ctx->free_req_list);
 			list_add_tail(&req->list, &ctx->free_req_list);

+ 16 - 2
drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c

@@ -2768,6 +2768,7 @@ static int cam_ife_mgr_acquire_hw(void *hw_mgr_priv, void *acquire_hw_args)
 
 
 	acquire_args->ctxt_to_hw_map = ife_ctx;
 	acquire_args->ctxt_to_hw_map = ife_ctx;
 	ife_ctx->ctx_in_use = 1;
 	ife_ctx->ctx_in_use = 1;
+	ife_ctx->num_reg_dump_buf = 0;
 
 
 	acquire_args->valid_acquired_hw =
 	acquire_args->valid_acquired_hw =
 		acquire_hw_info->num_inputs;
 		acquire_hw_info->num_inputs;
@@ -3011,6 +3012,7 @@ static int cam_ife_mgr_acquire_dev(void *hw_mgr_priv, void *acquire_hw_args)
 
 
 	acquire_args->ctxt_to_hw_map = ife_ctx;
 	acquire_args->ctxt_to_hw_map = ife_ctx;
 	ife_ctx->ctx_in_use = 1;
 	ife_ctx->ctx_in_use = 1;
+	ife_ctx->num_reg_dump_buf = 0;
 
 
 	CAM_INFO(CAM_ISP,
 	CAM_INFO(CAM_ISP,
 		"Acquire HW success with total_pix: %u total_rdi: %u is_dual: %u in ctx: %u",
 		"Acquire HW success with total_pix: %u total_rdi: %u is_dual: %u in ctx: %u",
@@ -4175,6 +4177,7 @@ static int cam_ife_mgr_release_hw(void *hw_mgr_priv,
 	ctx->is_rdi_only_context = 0;
 	ctx->is_rdi_only_context = 0;
 	ctx->cdm_handle = 0;
 	ctx->cdm_handle = 0;
 	ctx->cdm_ops = NULL;
 	ctx->cdm_ops = NULL;
+	ctx->num_reg_dump_buf = 0;
 	atomic_set(&ctx->overflow_pending, 0);
 	atomic_set(&ctx->overflow_pending, 0);
 	for (i = 0; i < CAM_IFE_HW_NUM_MAX; i++) {
 	for (i = 0; i < CAM_IFE_HW_NUM_MAX; i++) {
 		ctx->sof_cnt[i] = 0;
 		ctx->sof_cnt[i] = 0;
@@ -5590,13 +5593,24 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv,
 	if (((prepare->packet->header.op_code + 1) & 0xF) ==
 	if (((prepare->packet->header.op_code + 1) & 0xF) ==
 		CAM_ISP_PACKET_INIT_DEV) {
 		CAM_ISP_PACKET_INIT_DEV) {
 		prepare_hw_data->packet_opcode_type = CAM_ISP_PACKET_INIT_DEV;
 		prepare_hw_data->packet_opcode_type = CAM_ISP_PACKET_INIT_DEV;
-		if ((prepare->num_reg_dump_buf) && (prepare->num_reg_dump_buf <
-			CAM_REG_DUMP_MAX_BUF_ENTRIES)) {
+
+		if ((!prepare->num_reg_dump_buf) || (prepare->num_reg_dump_buf >
+			CAM_REG_DUMP_MAX_BUF_ENTRIES))
+			goto end;
+
+		if (!ctx->num_reg_dump_buf) {
 			ctx->num_reg_dump_buf = prepare->num_reg_dump_buf;
 			ctx->num_reg_dump_buf = prepare->num_reg_dump_buf;
 			memcpy(ctx->reg_dump_buf_desc,
 			memcpy(ctx->reg_dump_buf_desc,
 				prepare->reg_dump_buf_desc,
 				prepare->reg_dump_buf_desc,
 				sizeof(struct cam_cmd_buf_desc) *
 				sizeof(struct cam_cmd_buf_desc) *
 				prepare->num_reg_dump_buf);
 				prepare->num_reg_dump_buf);
+		} else {
+			prepare_hw_data->num_reg_dump_buf =
+				prepare->num_reg_dump_buf;
+			memcpy(prepare_hw_data->reg_dump_buf_desc,
+				prepare->reg_dump_buf_desc,
+				sizeof(struct cam_cmd_buf_desc) *
+				prepare_hw_data->num_reg_dump_buf);
 		}
 		}
 
 
 		goto end;
 		goto end;