浏览代码

Merge "msm: camera: isp: Add debugfs support for SFE driver" into camera-kernel.lnx.5.0

Camera Software Integration 4 年之前
父节点
当前提交
d94ee28414

+ 60 - 0
drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c

@@ -6215,6 +6215,21 @@ static int cam_ife_mgr_start_hw(void *hw_mgr_priv, void *start_hw_args)
 		}
 	}
 
+	/* set current SFE debug information to SFE HW */
+	for (i = 0; i < CAM_SFE_HW_NUM_MAX; i++) {
+		struct cam_sfe_debug_cfg_params debug_cfg;
+
+		debug_cfg.sfe_debug_cfg = g_ife_hw_mgr.debug_cfg.sfe_debug;
+		debug_cfg.sfe_sensor_sel = g_ife_hw_mgr.debug_cfg.sfe_sensor_diag_cfg;
+		if (g_ife_hw_mgr.sfe_devices[i]) {
+			rc = g_ife_hw_mgr.sfe_devices[i]->hw_ops.process_cmd(
+				g_ife_hw_mgr.sfe_devices[i]->hw_priv,
+				CAM_ISP_HW_CMD_SET_SFE_DEBUG_CFG,
+				&debug_cfg,
+				sizeof(debug_cfg));
+		}
+	}
+
 	if (ctx->flags.need_csid_top_cfg) {
 		list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_csid,
 				list) {
@@ -11099,6 +11114,47 @@ DEFINE_SIMPLE_ATTRIBUTE(cam_ife_camif_debug,
 	cam_ife_get_camif_debug,
 	cam_ife_set_camif_debug, "%16llu");
 
+static int cam_ife_set_sfe_debug(void *data, u64 val)
+{
+	g_ife_hw_mgr.debug_cfg.sfe_debug = (uint32_t)val;
+	CAM_DBG(CAM_ISP, "Set SFE Debug value :%u",
+		g_ife_hw_mgr.debug_cfg.sfe_debug);
+	return 0;
+}
+
+static int cam_ife_get_sfe_debug(void *data, u64 *val)
+{
+	*val = (uint64_t)g_ife_hw_mgr.debug_cfg.sfe_debug;
+	CAM_DBG(CAM_ISP, "Get SFE Debug value :%u",
+		g_ife_hw_mgr.debug_cfg.sfe_debug);
+
+	return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(cam_ife_sfe_debug,
+	cam_ife_get_sfe_debug,
+	cam_ife_set_sfe_debug, "%16llu");
+
+static int cam_ife_set_sfe_sensor_diag_debug(void *data, u64 val)
+{
+	g_ife_hw_mgr.debug_cfg.sfe_sensor_diag_cfg = (uint32_t)val;
+	CAM_DBG(CAM_ISP, "Set SFE Sensor diag value :%u",
+		g_ife_hw_mgr.debug_cfg.sfe_sensor_diag_cfg);
+	return 0;
+}
+
+static int cam_ife_get_sfe_sensor_diag_debug(void *data, u64 *val)
+{
+	*val = (uint64_t)g_ife_hw_mgr.debug_cfg.sfe_sensor_diag_cfg;
+	CAM_DBG(CAM_ISP, "Get SFE Sensor diag value :%u",
+		g_ife_hw_mgr.debug_cfg.sfe_sensor_diag_cfg);
+	return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(cam_ife_sfe_sensor_diag_debug,
+	cam_ife_get_sfe_sensor_diag_debug,
+	cam_ife_set_sfe_sensor_diag_debug, "%16llu");
+
 static int cam_ife_hw_mgr_debug_register(void)
 {
 	int rc = 0;
@@ -11131,6 +11187,10 @@ static int cam_ife_hw_mgr_debug_register(void)
 	dbgfileptr = debugfs_create_bool("disable_ubwc_comp", 0644,
 		g_ife_hw_mgr.debug_cfg.dentry,
 		&g_ife_hw_mgr.debug_cfg.disable_ubwc_comp);
+	dbgfileptr = debugfs_create_file("sfe_debug", 0644,
+		g_ife_hw_mgr.debug_cfg.dentry, NULL, &cam_ife_sfe_debug);
+	dbgfileptr = debugfs_create_file("sfe_sensor_diag_sel", 0644,
+		g_ife_hw_mgr.debug_cfg.dentry, NULL, &cam_ife_sfe_sensor_diag_debug);
 
 	if (IS_ERR(dbgfileptr)) {
 		if (PTR_ERR(dbgfileptr) == -ENODEV)

+ 4 - 1
drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.h

@@ -45,7 +45,8 @@ enum cam_ife_ctx_master_type {
  * @csid_debug:                csid debug information
  * @enable_recovery:           enable recovery
  * @enable_csid_recovery:      enable csid recovery
- * @enable_diag_sensor_status: enable sensor diagnosis status
+ * @sfe_debug:                 sfe debug config
+ * @sfe_sensor_diag_cfg:       sfe sensor diag config
  * @enable_req_dump:           Enable request dump on HW errors
  * @per_req_reg_dump:          Enable per request reg dump
  * @disable_ubwc_comp:         Disable UBWC compression
@@ -57,6 +58,8 @@ struct cam_ife_hw_mgr_debug {
 	uint32_t       enable_recovery;
 	uint32_t       camif_debug;
 	uint32_t       enable_csid_recovery;
+	uint32_t       sfe_debug;
+	uint32_t       sfe_sensor_diag_cfg;
 	bool           enable_req_dump;
 	bool           per_req_reg_dump;
 	bool           disable_ubwc_comp;

+ 7 - 5
drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_bus/cam_sfe_bus_rd.c

@@ -935,6 +935,10 @@ static int cam_sfe_bus_start_bus_rd(
 	for (i = 0; i < rsrc_data->num_rm; i++)
 		rc = cam_sfe_bus_start_rm(rsrc_data->rm_res[i]);
 
+	/* Remove after driver stabilizes */
+	common_data->sfe_debug_cfg |=
+		SFE_DEBUG_ENABLE_RD_DONE_IRQ;
+
 	if (common_data->sfe_debug_cfg &
 		SFE_DEBUG_ENABLE_RD_DONE_IRQ) {
 
@@ -1340,12 +1344,12 @@ static int cam_sfe_bus_rd_set_debug_cfg(
 	struct cam_sfe_debug_cfg_params *debug_cfg;
 
 	debug_cfg = (struct cam_sfe_debug_cfg_params *)cmd_args;
-	bus_priv->common_data.sfe_debug_cfg =
-		debug_cfg->sfe_debug_cfg;
 
+	bus_priv->common_data.sfe_debug_cfg = debug_cfg->sfe_debug_cfg;
 	return 0;
 }
 
+
 static int cam_sfe_bus_rd_process_cmd(
 	void *priv, uint32_t cmd_type,
 	void *cmd_args, uint32_t arg_size)
@@ -1478,10 +1482,8 @@ int cam_sfe_bus_rd_init(
 	sfe_bus_local->hw_ops.process_cmd  = cam_sfe_bus_rd_process_cmd;
 
 	*sfe_bus = sfe_bus_local;
+	bus_priv->common_data.sfe_debug_cfg = 0;
 
-	/* Remove after driver stabilizes */
-	bus_priv->common_data.sfe_debug_cfg |=
-		SFE_DEBUG_ENABLE_RD_DONE_IRQ;
 	return rc;
 
 deinit_sfe_bus_rd:

+ 21 - 1
drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_bus/cam_sfe_bus_wr.c

@@ -91,6 +91,8 @@ struct cam_sfe_bus_wr_common_data {
 	uint32_t                                    line_done_cfg;
 	bool                                        err_irq_subscribe;
 	cam_hw_mgr_event_cb_func                    event_cb;
+
+	uint32_t                                    sfe_debug_cfg;
 };
 
 struct cam_sfe_wr_scratch_buf_info {
@@ -2584,6 +2586,19 @@ static int __cam_sfe_bus_wr_process_cmd(
 		cmd_args, arg_size);
 }
 
+static int cam_sfe_bus_wr_set_debug_cfg(
+	void *priv, void *cmd_args)
+{
+	struct cam_sfe_bus_wr_priv *bus_priv =
+		(struct cam_sfe_bus_wr_priv  *) priv;
+	struct cam_sfe_debug_cfg_params *debug_cfg;
+
+	debug_cfg = (struct cam_sfe_debug_cfg_params *)cmd_args;
+
+	bus_priv->common_data.sfe_debug_cfg = debug_cfg->sfe_debug_cfg;
+	return 0;
+}
+
 static int cam_sfe_bus_wr_process_cmd(
 	struct cam_isp_resource_node *priv,
 	uint32_t cmd_type, void *cmd_args,
@@ -2642,6 +2657,9 @@ static int cam_sfe_bus_wr_process_cmd(
 		rc = 0;
 	}
 		break;
+	case CAM_ISP_HW_CMD_SET_SFE_DEBUG_CFG:
+		rc = cam_sfe_bus_wr_set_debug_cfg(priv, cmd_args);
+		break;
 	default:
 		CAM_ERR_RATE_LIMIT(CAM_SFE, "Invalid HW command type:%d",
 			cmd_type);
@@ -2735,7 +2753,7 @@ int cam_sfe_bus_wr_init(
 		false);
 	if (rc) {
 		CAM_ERR(CAM_SFE, "Init bus_irq_controller failed");
-		goto free_bus_priv;
+		goto free_sfe_out;
 	}
 
 	INIT_LIST_HEAD(&bus_priv->free_comp_grp);
@@ -2798,6 +2816,8 @@ deinit_comp_grp:
 		i = bus_priv->num_comp_grp;
 	for (--i; i >= 0; i--)
 		cam_sfe_bus_deinit_comp_grp(&bus_priv->comp_grp[i]);
+
+free_sfe_out:
 	kfree(bus_priv->sfe_out);
 
 free_comp_grp:

+ 3 - 3
drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_top/cam_sfe_top.c

@@ -1493,6 +1493,9 @@ int cam_sfe_top_start(
 		}
 	}
 
+	/* Remove after driver stabilizes */
+	top_priv->sfe_debug_cfg |= SFE_DEBUG_ENABLE_SOF_EOF_IRQ;
+
 	if ((top_priv->sfe_debug_cfg & SFE_DEBUG_ENABLE_SOF_EOF_IRQ) ||
 		(debug_cfg_enabled)) {
 		if (!path_data->sof_eof_handle) {
@@ -1734,9 +1737,6 @@ int cam_sfe_top_init(
 	top_priv->wr_client_desc = sfe_top_hw_info->wr_client_desc;
 	top_priv->sfe_debug_cfg = 0;
 
-	/* Remove after driver stabilizes */
-	top_priv->sfe_debug_cfg |= SFE_DEBUG_ENABLE_SOF_EOF_IRQ;
-
 	sfe_top->hw_ops.process_cmd = cam_sfe_top_process_cmd;
 	sfe_top->hw_ops.start = cam_sfe_top_start;
 	sfe_top->hw_ops.stop = cam_sfe_top_stop;