Browse Source

msm: camera: isp: Update per frame reg dump check

Update check to ensure reg dump is triggered for INIT packets.

CRs-Fixed: 3218412
Change-Id: I6a72838d2f1cfd6854faf4b6dcde68f2dc8adffb
Signed-off-by: Karthik Anantha Ram <[email protected]>
Karthik Anantha Ram 3 years ago
parent
commit
6f94cc3f59
1 changed files with 34 additions and 20 deletions
  1. 34 20
      drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c

+ 34 - 20
drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c

@@ -4791,7 +4791,6 @@ void cam_ife_cam_cdm_callback(uint32_t handle, void *userdata,
 	struct cam_isp_prepare_hw_update_data   *hw_update_data = NULL;
 	struct cam_isp_prepare_hw_update_data   *hw_update_data = NULL;
 	struct cam_ife_hw_mgr_ctx               *ctx = NULL;
 	struct cam_ife_hw_mgr_ctx               *ctx = NULL;
 	struct cam_hw_dump_pf_args              *pf_args = NULL;
 	struct cam_hw_dump_pf_args              *pf_args = NULL;
-	int                                      reg_dump_done;
 	uint64_t                                 req_id;
 	uint64_t                                 req_id;
 
 
 	if (!userdata) {
 	if (!userdata) {
@@ -4805,11 +4804,9 @@ void cam_ife_cam_cdm_callback(uint32_t handle, void *userdata,
 	if (status == CAM_CDM_CB_STATUS_BL_SUCCESS) {
 	if (status == CAM_CDM_CB_STATUS_BL_SUCCESS) {
 		req_id = *(uint64_t *)cookie;
 		req_id = *(uint64_t *)cookie;
 		complete_all(&ctx->config_done_complete);
 		complete_all(&ctx->config_done_complete);
-		reg_dump_done = atomic_read(&ctx->cdm_done);
 		atomic_set(&ctx->cdm_done, 1);
 		atomic_set(&ctx->cdm_done, 1);
 		ctx->last_cdm_done_req = req_id;
 		ctx->last_cdm_done_req = req_id;
-		if ((g_ife_hw_mgr.debug_cfg.per_req_reg_dump) &&
-			(!reg_dump_done)) {
+		if (g_ife_hw_mgr.debug_cfg.per_req_reg_dump) {
 			if (ctx->cdm_userdata.request_id == req_id) {
 			if (ctx->cdm_userdata.request_id == req_id) {
 				cam_ife_mgr_handle_reg_dump(ctx,
 				cam_ife_mgr_handle_reg_dump(ctx,
 					hw_update_data->reg_dump_buf_desc,
 					hw_update_data->reg_dump_buf_desc,
@@ -11415,6 +11412,35 @@ end:
 	return rc;
 	return rc;
 }
 }
 
 
+static void cam_ife_mgr_check_for_per_request_reg_dump(
+	struct cam_hw_prepare_update_args       *prepare,
+	struct cam_isp_prepare_hw_update_data   *prepare_hw_data)
+{
+	int i;
+
+	if ((!prepare->num_reg_dump_buf) || (prepare->num_reg_dump_buf >
+		CAM_REG_DUMP_MAX_BUF_ENTRIES)) {
+		CAM_DBG(CAM_ISP, "Invalid num of reg dump desc: %u for req: %llu",
+			prepare->num_reg_dump_buf, prepare->packet->header.request_id);
+		return;
+	}
+
+	for (i = 0; i < prepare->num_reg_dump_buf; i++) {
+		if (prepare->reg_dump_buf_desc[i].meta_data !=
+			CAM_ISP_PACKET_META_REG_DUMP_PER_REQUEST)
+			continue;
+
+		memcpy(&prepare_hw_data->reg_dump_buf_desc[
+			prepare_hw_data->num_reg_dump_buf],
+			&prepare->reg_dump_buf_desc[i],
+			sizeof(struct cam_cmd_buf_desc));
+		prepare_hw_data->num_reg_dump_buf++;
+		CAM_DBG(CAM_ISP, "Updated per request reg dump for req: %llu",
+			prepare->packet->header.request_id);
+		return;
+	}
+}
+
 static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv,
 static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv,
 	void *prepare_hw_update_args)
 	void *prepare_hw_update_args)
 {
 {
@@ -11627,6 +11653,7 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv,
 			CAM_REG_DUMP_MAX_BUF_ENTRIES))
 			CAM_REG_DUMP_MAX_BUF_ENTRIES))
 			goto end;
 			goto end;
 
 
+		/* Copy reg dump buf desc for error/flush cases */
 		if (!ctx->num_reg_dump_buf) {
 		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;
 
 
@@ -11634,26 +11661,13 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv,
 				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);
 		}
 		}
 
 
+		/* Per req reg dump */
+		cam_ife_mgr_check_for_per_request_reg_dump(prepare, prepare_hw_data);
 		goto end;
 		goto end;
 	} else {
 	} else {
-		prepare_hw_data->num_reg_dump_buf = prepare->num_reg_dump_buf;
-		if ((prepare_hw_data->num_reg_dump_buf) &&
-			(prepare_hw_data->num_reg_dump_buf <
-			CAM_REG_DUMP_MAX_BUF_ENTRIES)) {
-			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);
-		}
+		cam_ife_mgr_check_for_per_request_reg_dump(prepare, prepare_hw_data);
 	}
 	}
 
 
 	/* add reg update commands */
 	/* add reg update commands */