Przeglądaj źródła

msm: camera: isp: Add trace events across ISP

Add trace events for IRQ's on IFE top side and IFE
BUS side in top half. These traces when enabled
will help to gather relative timing information of
the IRQ's with systrace.

CRs-Fixed: 2538876
Change-Id: I856a9df1978f90e260da7c62cadf02fa2fe53202
Signed-off-by: Vishalsingh Hajeri <[email protected]>
Signed-off-by: Pavan Kumar Chilamkurthi <[email protected]>
Vishalsingh Hajeri 5 lat temu
rodzic
commit
a913f342a0

+ 17 - 1
drivers/cam_cdm/cam_cdm_hw_core.c

@@ -23,6 +23,7 @@
 #include "cam_cdm_hw_reg_1_2.h"
 #include "cam_cdm_hw_reg_2_0.h"
 #include "camera_main.h"
+#include "cam_trace.h"
 
 #define CAM_CDM_BL_FIFO_WAIT_TIMEOUT 2000
 #define CAM_CDM_DBG_GEN_IRQ_USR_DATA 0xff
@@ -689,6 +690,8 @@ int cam_hw_cdm_submit_gen_irq(
 		rc = -EIO;
 	}
 
+	trace_cam_log_event("CDM_START", "CDM_START_IRQ", req->data->cookie, 0);
+
 end:
 	return rc;
 }
@@ -1159,7 +1162,20 @@ irqreturn_t cam_hw_cdm_irq(int irq_num, void *data)
 		INIT_WORK((struct work_struct *)&payload[i]->work,
 			cam_hw_cdm_work);
 
-		work_status = queue_work(
+	trace_cam_log_event("CDM_DONE", "CDM_DONE_IRQ",
+			payload[i]->irq_status,
+			cdm_hw->soc_info.index);
+
+		if (cam_cdm_write_hw_reg(cdm_hw,
+				cdm_core->offsets->irq_reg[i]->irq_clear,
+				payload[i]->irq_status)) {
+			CAM_ERR(CAM_CDM,
+				"Failed to Write CDM HW IRQ Clear");
+			kfree(payload[i]);
+			return IRQ_HANDLED;
+		}
+
+	work_status = queue_work(
 			cdm_core->bl_fifo[i].work_queue,
 			&payload[i]->work);
 

+ 18 - 2
drivers/cam_isp/cam_isp_context.c

@@ -757,15 +757,26 @@ static void __cam_isp_ctx_handle_buf_done_fail_log(
 		"Resource Handles that fail to generate buf_done in prev frame");
 	for (i = 0; i < req_isp->num_fence_map_out; i++) {
 		if (req_isp->fence_map_out[i].sync_id != -1) {
-			if (isp_device_type == CAM_IFE_DEVICE_TYPE)
+			if (isp_device_type == CAM_IFE_DEVICE_TYPE) {
 				handle_type =
 				__cam_isp_resource_handle_id_to_type(
 				req_isp->fence_map_out[i].resource_handle);
-			else
+
+				trace_cam_log_event("Buf_done Congestion",
+				__cam_isp_resource_handle_id_to_type(
+				req_isp->fence_map_out[i].resource_handle),
+				request_id, req_isp->fence_map_out[i].sync_id);
+			} else {
 				handle_type =
 				__cam_isp_tfe_resource_handle_id_to_type(
 				req_isp->fence_map_out[i].resource_handle);
 
+				trace_cam_log_event("Buf_done Congestion",
+				__cam_isp_tfe_resource_handle_id_to_type(
+				req_isp->fence_map_out[i].resource_handle),
+				request_id, req_isp->fence_map_out[i].sync_id);
+			}
+
 			CAM_WARN(CAM_ISP,
 			"Resource_Handle: [%s][0x%x] Sync_ID: [0x%x]",
 			handle_type,
@@ -848,6 +859,9 @@ static int __cam_isp_ctx_handle_buf_done_for_request(
 				"Duplicate BUF_DONE for req %lld : i=%d, j=%d, res=%s",
 				req->request_id, i, j, handle_type);
 
+			trace_cam_log_event("Duplicate BufDone",
+				handle_type, req->request_id, ctx->ctx_id);
+
 			if (done_next_req) {
 				done_next_req->resource_handle
 					[done_next_req->num_handles++] =
@@ -1528,6 +1542,8 @@ static int __cam_isp_ctx_epoch_in_applied(struct cam_isp_context *ctx_isp,
 		CAM_WARN(CAM_ISP,
 			"Notify CRM about Bubble req %lld frame %lld, ctx %u",
 			req->request_id, ctx_isp->frame_id, ctx->ctx_id);
+		trace_cam_log_event("Bubble", "Rcvd epoch in applied state",
+			req->request_id, ctx->ctx_id);
 		ctx->ctx_crm_intf->notify_err(&notify);
 		atomic_set(&ctx_isp->process_bubble, 1);
 	} else {

+ 23 - 2
drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver3.c

@@ -23,6 +23,7 @@
 #include "cam_vfe_soc.h"
 #include "cam_debug_util.h"
 #include "cam_cpas_api.h"
+#include "cam_trace.h"
 
 static const char drv_name[] = "vfe_bus";
 
@@ -918,6 +919,7 @@ static int cam_vfe_bus_ver3_handle_rup_top_half(uint32_t evt_id,
 	struct cam_isp_resource_node               *vfe_out = NULL;
 	struct cam_vfe_bus_ver3_vfe_out_data       *rsrc_data = NULL;
 	struct cam_vfe_bus_irq_evt_payload         *evt_payload;
+	uint32_t irq_status;
 
 	vfe_out = th_payload->handler_priv;
 	if (!vfe_out) {
@@ -946,6 +948,12 @@ static int cam_vfe_bus_ver3_handle_rup_top_half(uint32_t evt_id,
 	evt_payload->evt_id  = evt_id;
 	for (i = 0; i < th_payload->num_registers; i++)
 		evt_payload->irq_reg_val[i] = th_payload->evt_status_arr[i];
+
+	irq_status =
+		th_payload->evt_status_arr[CAM_IFE_IRQ_BUS_VER3_REG_STATUS0];
+
+	trace_cam_log_event("RUP", "RUP_IRQ", irq_status, 0);
+
 	th_payload->evt_payload_priv = evt_payload;
 
 	return rc;
@@ -2240,6 +2248,8 @@ static int cam_vfe_bus_ver3_handle_vfe_out_done_top_half(uint32_t evt_id,
 	struct cam_isp_resource_node               *vfe_out = NULL;
 	struct cam_vfe_bus_ver3_vfe_out_data       *rsrc_data = NULL;
 	struct cam_vfe_bus_irq_evt_payload         *evt_payload;
+	struct cam_vfe_bus_ver3_comp_grp_data      *resource_data;
+	uint32_t                                    status_0;
 
 	vfe_out = th_payload->handler_priv;
 	if (!vfe_out) {
@@ -2248,6 +2258,7 @@ static int cam_vfe_bus_ver3_handle_vfe_out_done_top_half(uint32_t evt_id,
 	}
 
 	rsrc_data = vfe_out->res_priv;
+	resource_data = rsrc_data->comp_grp->res_priv;
 
 	CAM_DBG(CAM_ISP, "VFE:%d Bus IRQ status_0: 0x%X status_1: 0x%X",
 		rsrc_data->common_data->core_index,
@@ -2276,6 +2287,17 @@ static int cam_vfe_bus_ver3_handle_vfe_out_done_top_half(uint32_t evt_id,
 
 	th_payload->evt_payload_priv = evt_payload;
 
+	status_0 = th_payload->evt_status_arr[CAM_IFE_IRQ_BUS_VER3_REG_STATUS0];
+
+	if (status_0 & BIT(resource_data->comp_grp_type +
+		rsrc_data->common_data->comp_done_shift)) {
+		trace_cam_log_event("bufdone", "bufdone_IRQ",
+			status_0, resource_data->comp_grp_type);
+	}
+
+	if (status_0 & 0x1)
+		trace_cam_log_event("UnexpectedRUP", "RUP_IRQ", status_0, 40);
+
 	CAM_DBG(CAM_ISP, "Exit");
 	return rc;
 }
@@ -3759,7 +3781,6 @@ int cam_vfe_bus_ver3_init(
 	struct cam_vfe_bus              *vfe_bus_local;
 	struct cam_vfe_bus_ver3_hw_info *ver3_hw_info = bus_hw_info;
 	struct cam_vfe_soc_private      *soc_private = NULL;
-	static const char rup_controller_name[] = "vfe_bus_rup";
 
 	CAM_DBG(CAM_ISP, "Enter");
 
@@ -3825,7 +3846,7 @@ int cam_vfe_bus_ver3_init(
 		goto free_bus_priv;
 	}
 
-	rc = cam_irq_controller_init(rup_controller_name,
+	rc = cam_irq_controller_init("vfe_bus_rup",
 		bus_priv->common_data.mem_base,
 		&ver3_hw_info->common_reg.irq_reg_info,
 		&bus_priv->common_data.rup_irq_controller, false);

+ 22 - 0
drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_top/cam_vfe_camif_ver3.c

@@ -18,6 +18,7 @@
 #include "cam_debug_util.h"
 #include "cam_cdm_util.h"
 #include "cam_cpas_api.h"
+#include "cam_trace.h"
 
 #define CAM_VFE_CAMIF_IRQ_SOF_DEBUG_CNT_MAX 2
 
@@ -1240,6 +1241,27 @@ static int cam_vfe_camif_ver3_handle_irq_top_half(uint32_t evt_id,
 
 	th_payload->evt_payload_priv = evt_payload;
 
+	if (th_payload->evt_status_arr[CAM_IFE_IRQ_CAMIF_REG_STATUS1]
+			& camif_priv->reg_data->sof_irq_mask) {
+		trace_cam_log_event("SOF", "TOP_HALF",
+		th_payload->evt_status_arr[CAM_IFE_IRQ_CAMIF_REG_STATUS1],
+		camif_node->hw_intf->hw_idx);
+	}
+
+	if (th_payload->evt_status_arr[CAM_IFE_IRQ_CAMIF_REG_STATUS1]
+			& camif_priv->reg_data->epoch0_irq_mask) {
+		trace_cam_log_event("EPOCH0", "TOP_HALF",
+		th_payload->evt_status_arr[CAM_IFE_IRQ_CAMIF_REG_STATUS1],
+		camif_node->hw_intf->hw_idx);
+	}
+
+	if (th_payload->evt_status_arr[CAM_IFE_IRQ_CAMIF_REG_STATUS1]
+			& camif_priv->reg_data->eof_irq_mask) {
+		trace_cam_log_event("EOF", "TOP_HALF",
+		th_payload->evt_status_arr[CAM_IFE_IRQ_CAMIF_REG_STATUS1],
+		camif_node->hw_intf->hw_idx);
+	}
+
 	CAM_DBG(CAM_ISP, "Exit");
 	return rc;
 }

+ 23 - 0
drivers/cam_utils/cam_trace.h

@@ -63,6 +63,29 @@ TRACE_EVENT(cam_isp_activated_irq,
 	)
 );
 
+TRACE_EVENT(cam_log_event,
+	TP_PROTO(const char *string1, const char *string2,
+		uint64_t val1, uint64_t val2),
+	TP_ARGS(string1, string2, val1, val2),
+	TP_STRUCT__entry(
+		__string(string1, string1)
+		__string(string2, string2)
+		__field(uint64_t, val1)
+		__field(uint64_t, val2)
+	),
+	TP_fast_assign(
+		__assign_str(string1, string1);
+		__assign_str(string2, string2);
+		__entry->val1 = val1;
+		__entry->val2 = val2;
+	),
+	TP_printk(
+		"%s: %s val1=%llu val2=%llu",
+			__get_str(string1), __get_str(string2),
+			__entry->val1, __entry->val2
+	)
+);
+
 TRACE_EVENT(cam_icp_fw_dbg,
 	TP_PROTO(char *dbg_message, uint64_t timestamp),
 	TP_ARGS(dbg_message, timestamp),