Selaa lähdekoodia

msm: camera: common: Add private data in mini dump

Each driver can pass private data in mini dump callback register, so
when mini dump is invoked, the mini dump handler will pass the private
data to the callback associated with the driver. With the private data,
ICP driver can determine which mini dump callback corresponds to which
ICP device/hw mgr.

CRs-Fixed: 3353541
Change-Id: I85171aa7ba31f92c5620ddbd8de8a9c168398856
Signed-off-by: Sokchetra Eung <[email protected]>
Sokchetra Eung 2 vuotta sitten
vanhempi
sitoutus
d2e3088296

+ 3 - 2
drivers/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c

@@ -4046,7 +4046,8 @@ static int cam_icp_mgr_release_ctx(struct cam_icp_hw_mgr *hw_mgr, int ctx_id)
 	return 0;
 }
 
-static unsigned long cam_icp_hw_mgr_mini_dump_cb(void *dst, unsigned long len)
+static unsigned long cam_icp_hw_mgr_mini_dump_cb(void *dst, unsigned long len,
+	void *priv_data)
 {
 	struct cam_icp_hw_mini_dump_info   *md;
 	struct cam_icp_hw_ctx_mini_dump    *ctx_md;
@@ -7089,7 +7090,7 @@ int cam_icp_hw_mgr_init(struct device_node *of_node, uint64_t *hw_mgr_hdl,
 
 	init_completion(&icp_hw_mgr.icp_complete);
 	cam_common_register_mini_dump_cb(
-		cam_icp_hw_mgr_mini_dump_cb, "cam_icp");
+		cam_icp_hw_mgr_mini_dump_cb, "cam_icp", NULL);
 
 	cam_icp_test_irq_line_at_probe();
 

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

@@ -14590,7 +14590,8 @@ static void cam_req_mgr_process_workq_cam_ife_worker(struct work_struct *w)
 	cam_req_mgr_process_workq(w);
 }
 
-static unsigned long cam_ife_hw_mgr_mini_dump_cb(void *dst, unsigned long len)
+static unsigned long cam_ife_hw_mgr_mini_dump_cb(void *dst, unsigned long len,
+	void *priv_data)
 {
 	struct cam_ife_hw_mini_dump_data   *mgr_md;
 	struct cam_ife_hw_mini_dump_ctx    *ctx_md;
@@ -15070,7 +15071,7 @@ int cam_ife_hw_mgr_init(struct cam_hw_mgr_intf *hw_mgr_intf, int *iommu_hdl)
 	cam_ife_mgr_count_ife();
 	cam_ife_mgr_count_sfe();
 	cam_common_register_mini_dump_cb(cam_ife_hw_mgr_mini_dump_cb,
-		"CAM_ISP");
+		"CAM_ISP", NULL);
 	cam_ife_mgr_test_irq_lines_at_probe(&g_ife_hw_mgr);
 
 	/* Allocate memory for perf counters */

+ 4 - 2
drivers/cam_jpeg/jpeg_hw/cam_jpeg_hw_mgr.c

@@ -2015,7 +2015,8 @@ static int cam_jpeg_mgr_cmd(void *hw_mgr_priv, void *cmd_args)
 	return rc;
 }
 
-static unsigned long cam_jpeg_hw_mgr_mini_dump_cb(void *dst, unsigned long len)
+static unsigned long cam_jpeg_hw_mgr_mini_dump_cb(void *dst, unsigned long len,
+	void *priv_data)
 {
 	struct cam_jpeg_hw_mini_dump_req *md_req;
 	struct cam_jpeg_hw_mgr_mini_dump *md;
@@ -2315,7 +2316,8 @@ int cam_jpeg_hw_mgr_init(struct device_node *of_node, uint64_t *hw_mgr_hdl,
 	if (iommu_hdl)
 		*iommu_hdl = g_jpeg_hw_mgr.iommu_hdl;
 
-	cam_common_register_mini_dump_cb(cam_jpeg_hw_mgr_mini_dump_cb, "CAM_JPEG");
+	cam_common_register_mini_dump_cb(cam_jpeg_hw_mgr_mini_dump_cb, "CAM_JPEG",
+		NULL);
 	cam_jpeg_mgr_create_debugfs_entry();
 	cam_jpeg_test_irq_line_at_probe();
 

+ 3 - 2
drivers/cam_req_mgr/cam_mem_mgr.c

@@ -61,7 +61,8 @@ static inline void cam_mem_mgr_reset_presil_params(int idx)
 }
 #endif
 
-static unsigned long cam_mem_mgr_mini_dump_cb(void *dst, unsigned long len)
+static unsigned long cam_mem_mgr_mini_dump_cb(void *dst, unsigned long len,
+	void *priv_data)
 {
 	struct cam_mem_table_mini_dump      *md;
 
@@ -252,7 +253,7 @@ int cam_mem_mgr_init(void)
 
 	cam_mem_mgr_create_debug_fs();
 	cam_common_register_mini_dump_cb(cam_mem_mgr_mini_dump_cb,
-		"cam_mem");
+		"cam_mem", NULL);
 
 	return 0;
 put_heaps:

+ 3 - 3
drivers/cam_req_mgr/cam_req_mgr_core.c

@@ -5300,8 +5300,8 @@ end:
 	return 0;
 }
 
-static unsigned long cam_req_mgr_core_mini_dump_cb(void *dst,
-	unsigned long len)
+static unsigned long cam_req_mgr_core_mini_dump_cb(void *dst, unsigned long len,
+	void *priv_data)
 {
 	struct cam_req_mgr_core_link *link;
 	struct cam_req_mgr_core_mini_dump *md;
@@ -5424,7 +5424,7 @@ int cam_req_mgr_core_device_init(void)
 		cam_req_mgr_core_link_reset(&g_links[i]);
 	}
 	cam_common_register_mini_dump_cb(cam_req_mgr_core_mini_dump_cb,
-		"CAM_CRM");
+		"CAM_CRM", NULL);
 
 	return 0;
 }

+ 3 - 2
drivers/cam_smmu/cam_smmu_api.c

@@ -4420,7 +4420,8 @@ static void cam_smmu_mini_dump_entries(
 	}
 }
 
-static unsigned long cam_smmu_mini_dump_cb(void *dst, unsigned long len)
+static unsigned long cam_smmu_mini_dump_cb(void *dst, unsigned long len,
+	void *priv_data)
 {
 	struct cam_smmu_mini_dump_cb_info *cb_md;
 	struct cam_smmu_mini_dump_info     *md;
@@ -4653,7 +4654,7 @@ static int cam_smmu_component_bind(struct device *dev,
 		of_property_read_bool(dev->of_node, "expanded_memory");
 
 	cam_common_register_mini_dump_cb(cam_smmu_mini_dump_cb,
-		"cam_smmu");
+		"cam_smmu", NULL);
 
 	CAM_DBG(CAM_SMMU, "Main component bound successfully");
 	return 0;

+ 8 - 5
drivers/cam_utils/cam_common_util.c

@@ -18,7 +18,7 @@
 #include "cam_hw.h"
 #if IS_REACHABLE(CONFIG_QCOM_VA_MINIDUMP)
 #include <soc/qcom/minidump.h>
-static  struct cam_common_mini_dump_dev_info g_minidump_dev_info;
+static struct cam_common_mini_dump_dev_info g_minidump_dev_info;
 #endif
 
 #define CAM_PRESIL_POLL_DELAY 20
@@ -191,7 +191,7 @@ static void cam_common_mini_dump_handler(void *dst, unsigned long len)
 			strlen(g_minidump_dev_info.name[i]));
 		md->waddr[i] = (void *)waddr;
 		bytes_written = g_minidump_dev_info.dump_cb[i](
-			(void *)waddr, remain_len);
+			(void *)waddr, remain_len, g_minidump_dev_info.priv_data[i]);
 		md->size[i] = bytes_written;
 		if (bytes_written >= len) {
 			CAM_WARN(CAM_UTIL, "No more space to dump");
@@ -234,9 +234,10 @@ static struct notifier_block cam_common_md_notify_blk = {
 
 int cam_common_register_mini_dump_cb(
 	cam_common_mini_dump_cb mini_dump_cb,
-	uint8_t *dev_name)
+	uint8_t *dev_name, void *priv_data)
 {
 	int rc = 0;
+	uint32_t idx;
 
 	if (g_minidump_dev_info.num_devs >= CAM_COMMON_MINI_DUMP_DEV_NUM) {
 		CAM_ERR(CAM_UTIL, "No free index available");
@@ -248,10 +249,12 @@ int cam_common_register_mini_dump_cb(
 		return -EINVAL;
 	}
 
-	g_minidump_dev_info.dump_cb[g_minidump_dev_info.num_devs] =
+	idx = g_minidump_dev_info.num_devs;
+	g_minidump_dev_info.dump_cb[idx] =
 		mini_dump_cb;
-	scnprintf(g_minidump_dev_info.name[g_minidump_dev_info.num_devs],
+	scnprintf(g_minidump_dev_info.name[idx],
 		CAM_COMMON_MINI_DUMP_DEV_NAME_LEN, dev_name);
+	g_minidump_dev_info.priv_data[idx] = priv_data;
 	g_minidump_dev_info.num_devs++;
 	if (!g_minidump_dev_info.is_registered) {
 		rc = qcom_va_md_register("Camera", &cam_common_md_notify_blk);

+ 5 - 3
drivers/cam_utils/cam_common_util.h

@@ -83,7 +83,8 @@
 	rem_jiffies;                                                                         \
 })
 
-typedef unsigned long (*cam_common_mini_dump_cb) (void *dst, unsigned long len);
+typedef unsigned long (*cam_common_mini_dump_cb) (void *dst,
+	unsigned long len, void *priv_data);
 
 /**
  * struct cam_common_mini_dump_dev_info
@@ -96,6 +97,7 @@ struct cam_common_mini_dump_dev_info {
 	cam_common_mini_dump_cb  dump_cb[CAM_COMMON_MINI_DUMP_DEV_NUM];
 	uint8_t                  name[CAM_COMMON_MINI_DUMP_DEV_NUM]
 				    [CAM_COMMON_MINI_DUMP_DEV_NAME_LEN];
+	void                    *priv_data[CAM_COMMON_MINI_DUMP_DEV_NUM];
 	uint8_t                  num_devs;
 	bool                     is_registered;
 };
@@ -347,11 +349,11 @@ void cam_common_util_thread_switch_delay_detect(const char *token,
  */
 #if IS_REACHABLE(CONFIG_QCOM_VA_MINIDUMP)
 int cam_common_register_mini_dump_cb(
-	cam_common_mini_dump_cb mini_dump_cb, uint8_t *name);
+	cam_common_mini_dump_cb mini_dump_cb, uint8_t *dev_name, void *priv_data);
 #else
 static inline int cam_common_register_mini_dump_cb(
 	cam_common_mini_dump_cb mini_dump_cb,
-	uint8_t *dev_name)
+	uint8_t *dev_name, void *priv_data)
 {
 	return 0;
 }