Selaa lähdekoodia

Merge "msm: camera: isp: Register dump for first request id" into camera-kernel.lnx.4.0

Camera Software Integration 5 vuotta sitten
vanhempi
sitoutus
d5fa77dbdd
2 muutettua tiedostoa jossa 32 lisäystä ja 5 poistoa
  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)
 {
 	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);
 	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,
 				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;
 
 			list_add_tail(&req->list, &ctx->free_req_list);

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

@@ -2778,6 +2778,7 @@ static int cam_ife_mgr_acquire_hw(void *hw_mgr_priv, void *acquire_hw_args)
 
 	acquire_args->ctxt_to_hw_map = ife_ctx;
 	ife_ctx->ctx_in_use = 1;
+	ife_ctx->num_reg_dump_buf = 0;
 
 	acquire_args->valid_acquired_hw =
 		acquire_hw_info->num_inputs;
@@ -3021,6 +3022,7 @@ static int cam_ife_mgr_acquire_dev(void *hw_mgr_priv, void *acquire_hw_args)
 
 	acquire_args->ctxt_to_hw_map = ife_ctx;
 	ife_ctx->ctx_in_use = 1;
+	ife_ctx->num_reg_dump_buf = 0;
 
 	CAM_INFO(CAM_ISP,
 		"Acquire HW success with total_pix: %u total_rdi: %u is_dual: %u in ctx: %u",
@@ -4185,6 +4187,7 @@ static int cam_ife_mgr_release_hw(void *hw_mgr_priv,
 	ctx->is_rdi_only_context = 0;
 	ctx->cdm_handle = 0;
 	ctx->cdm_ops = NULL;
+	ctx->num_reg_dump_buf = 0;
 	atomic_set(&ctx->overflow_pending, 0);
 	for (i = 0; i < CAM_IFE_HW_NUM_MAX; i++) {
 		ctx->sof_cnt[i] = 0;
@@ -5655,13 +5658,24 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv,
 	if (((prepare->packet->header.op_code + 1) & 0xF) ==
 		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;
 			memcpy(ctx->reg_dump_buf_desc,
 				prepare->reg_dump_buf_desc,
 				sizeof(struct cam_cmd_buf_desc) *
 				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;