Browse Source

Merge "disp: msm: add rscc wrapper debugbus support"

qctecmdr 4 years ago
parent
commit
3d61ecfa30
1 changed files with 62 additions and 6 deletions
  1. 62 6
      msm/sde_dbg.c

+ 62 - 6
msm/sde_dbg.c

@@ -26,6 +26,7 @@
 #define DEFAULT_DBGBUS_SDE	SDE_DBG_DUMP_IN_MEM
 #define DEFAULT_DBGBUS_SDE	SDE_DBG_DUMP_IN_MEM
 #define DEFAULT_DBGBUS_VBIFRT	SDE_DBG_DUMP_IN_MEM
 #define DEFAULT_DBGBUS_VBIFRT	SDE_DBG_DUMP_IN_MEM
 #define DEFAULT_DBGBUS_DSI	SDE_DBG_DUMP_IN_MEM
 #define DEFAULT_DBGBUS_DSI	SDE_DBG_DUMP_IN_MEM
+#define DEFAULT_DBGBUS_RSC	SDE_DBG_DUMP_IN_MEM
 #define DEFAULT_DBGBUS_LUTDMA	SDE_DBG_DUMP_IN_MEM
 #define DEFAULT_DBGBUS_LUTDMA	SDE_DBG_DUMP_IN_MEM
 #define DEFAULT_BASE_REG_CNT	DEFAULT_MDSS_HW_BLOCK_SIZE
 #define DEFAULT_BASE_REG_CNT	DEFAULT_MDSS_HW_BLOCK_SIZE
 #define GROUP_BYTES		4
 #define GROUP_BYTES		4
@@ -36,6 +37,7 @@
 #define DBGBUS_NAME_SDE		"sde"
 #define DBGBUS_NAME_SDE		"sde"
 #define DBGBUS_NAME_VBIF_RT	"vbif_rt"
 #define DBGBUS_NAME_VBIF_RT	"vbif_rt"
 #define DBGBUS_NAME_DSI		"dsi"
 #define DBGBUS_NAME_DSI		"dsi"
+#define DBGBUS_NAME_RSC		"sde_rsc_wrapper"
 #define DBGBUS_NAME_LUTDMA	"reg_dma"
 #define DBGBUS_NAME_LUTDMA	"reg_dma"
 
 
 /* offsets from LUTDMA top address for the debug buses */
 /* offsets from LUTDMA top address for the debug buses */
@@ -75,6 +77,9 @@
 #define MMSS_VBIF_ERR_INFO_1		0x1a4
 #define MMSS_VBIF_ERR_INFO_1		0x1a4
 #define MMSS_VBIF_CLIENT_NUM		14
 #define MMSS_VBIF_CLIENT_NUM		14
 
 
+#define RSC_WRAPPER_DEBUG_BUS		0x010
+#define RSC_WRAPPER_DEBUG_BUS_DATA	0x014
+
 /* print debug ranges in groups of 4 u32s */
 /* print debug ranges in groups of 4 u32s */
 #define REG_DUMP_ALIGN		16
 #define REG_DUMP_ALIGN		16
 
 
@@ -238,6 +243,7 @@ struct sde_dbg_regbuf {
  * @dbgbus_sde: debug bus structure for the sde
  * @dbgbus_sde: debug bus structure for the sde
  * @dbgbus_vbif_rt: debug bus structure for the realtime vbif
  * @dbgbus_vbif_rt: debug bus structure for the realtime vbif
  * @dbgbus_dsi: debug bus structure for the dsi
  * @dbgbus_dsi: debug bus structure for the dsi
+ * @dbgbus_rsc: debug bus structure for rscc
  * @dbgbus_lutdma: debug bus structure for the lutdma hw
  * @dbgbus_lutdma: debug bus structure for the lutdma hw
  * @dump_all: dump all entries in register dump
  * @dump_all: dump all entries in register dump
  * @dump_secure: dump entries excluding few as it is in secure-session
  * @dump_secure: dump entries excluding few as it is in secure-session
@@ -262,6 +268,7 @@ static struct sde_dbg_base {
 	struct sde_dbg_sde_debug_bus dbgbus_sde;
 	struct sde_dbg_sde_debug_bus dbgbus_sde;
 	struct sde_dbg_sde_debug_bus dbgbus_vbif_rt;
 	struct sde_dbg_sde_debug_bus dbgbus_vbif_rt;
 	struct sde_dbg_sde_debug_bus dbgbus_dsi;
 	struct sde_dbg_sde_debug_bus dbgbus_dsi;
+	struct sde_dbg_sde_debug_bus dbgbus_rsc;
 	struct sde_dbg_sde_debug_bus dbgbus_lutdma;
 	struct sde_dbg_sde_debug_bus dbgbus_lutdma;
 	bool dump_all;
 	bool dump_all;
 	bool dump_secure;
 	bool dump_secure;
@@ -394,6 +401,10 @@ static struct sde_debug_bus_entry dsi_dbg_bus[] = {
 	{DSI_DEBUG_BUS_CTRL, DSI_DEBUG_BUS, 0, 4, 0, 64},
 	{DSI_DEBUG_BUS_CTRL, DSI_DEBUG_BUS, 0, 4, 0, 64},
 };
 };
 
 
+static struct sde_debug_bus_entry rsc_dbg_bus[] = {
+	{RSC_WRAPPER_DEBUG_BUS, RSC_WRAPPER_DEBUG_BUS_DATA, 0, 1, 0, 16},
+};
+
 static struct sde_debug_bus_entry dbg_bus_lutdma[] = {
 static struct sde_debug_bus_entry dbg_bus_lutdma[] = {
 	{ LUTDMA_0_DEBUG_BUS_CTRL, LUTDMA_0_DEBUG_BUS_STATUS, 0, 1, 0, 12 },
 	{ LUTDMA_0_DEBUG_BUS_CTRL, LUTDMA_0_DEBUG_BUS_STATUS, 0, 1, 0, 12 },
 	{ LUTDMA_0_DEBUG_BUS_CTRL, LUTDMA_0_DEBUG_BUS_STATUS, 0, 1, 256, 1 },
 	{ LUTDMA_0_DEBUG_BUS_CTRL, LUTDMA_0_DEBUG_BUS_STATUS, 0, 1, 256, 1 },
@@ -688,6 +699,14 @@ static void _sde_dbg_cmn_clear_test_point(void __iomem *mem_base, u32 wr_addr)
 	writel_relaxed(0, mem_base + wr_addr);
 	writel_relaxed(0, mem_base + wr_addr);
 }
 }
 
 
+static u32 _sde_dbg_rsc_read_test_point(void __iomem *mem_base, u32 wr_addr, u32 rd_addr,
+			u32 block_id, u32 test_id)
+{
+	u32 val = ((test_id & 0xf) << 1) | BIT(0);
+
+	return _sde_dbg_cmn_read_test_point(mem_base, wr_addr, rd_addr, val);
+}
+
 static u32 _sde_dbg_lutdma_read_test_point(void __iomem *mem_base, u32 wr_addr, u32 rd_addr,
 static u32 _sde_dbg_lutdma_read_test_point(void __iomem *mem_base, u32 wr_addr, u32 rd_addr,
 			u32 block_id, u32 test_id)
 			u32 block_id, u32 test_id)
 {
 {
@@ -1008,6 +1027,7 @@ static void _sde_dump_array(struct sde_dbg_reg_base *blk_arr[],
 	if (dump_dbgbus_sde) {
 	if (dump_dbgbus_sde) {
 		_sde_dbg_dump_sde_dbg_bus(&sde_dbg_base.dbgbus_sde);
 		_sde_dbg_dump_sde_dbg_bus(&sde_dbg_base.dbgbus_sde);
 		_sde_dbg_dump_sde_dbg_bus(&sde_dbg_base.dbgbus_lutdma);
 		_sde_dbg_dump_sde_dbg_bus(&sde_dbg_base.dbgbus_lutdma);
+		_sde_dbg_dump_sde_dbg_bus(&sde_dbg_base.dbgbus_rsc);
 	}
 	}
 
 
 	if (dump_dbgbus_vbif_rt)
 	if (dump_dbgbus_vbif_rt)
@@ -1119,12 +1139,10 @@ void sde_dbg_dump(enum sde_dbg_dump_context dump_mode, const char *name, ...)
 	if (dump_mode == SDE_DBG_DUMP_IRQ_CTX) {
 	if (dump_mode == SDE_DBG_DUMP_IRQ_CTX) {
 		/* schedule work to dump later */
 		/* schedule work to dump later */
 		sde_dbg_base.work_panic = do_panic;
 		sde_dbg_base.work_panic = do_panic;
-		sde_dbg_base.dbgbus_sde.cmn.include_in_deferred_work =
-				dump_dbgbus_sde;
-		sde_dbg_base.dbgbus_vbif_rt.cmn.include_in_deferred_work =
-				dump_dbgbus_vbif_rt;
-		sde_dbg_base.dbgbus_dsi.cmn.include_in_deferred_work =
-				dump_dbgbus_dsi;
+		sde_dbg_base.dbgbus_sde.cmn.include_in_deferred_work = dump_dbgbus_sde;
+		sde_dbg_base.dbgbus_vbif_rt.cmn.include_in_deferred_work = dump_dbgbus_vbif_rt;
+		sde_dbg_base.dbgbus_dsi.cmn.include_in_deferred_work = dump_dbgbus_dsi;
+		sde_dbg_base.dbgbus_rsc.cmn.include_in_deferred_work = dump_dbgbus_sde;
 		sde_dbg_base.dump_all = dump_all;
 		sde_dbg_base.dump_all = dump_all;
 		schedule_work(&sde_dbg_base.dump_work);
 		schedule_work(&sde_dbg_base.dump_work);
 	} else {
 	} else {
@@ -1671,6 +1689,27 @@ static const struct file_operations sde_recovery_dsi_dbgbus_fops = {
 	.read = sde_recovery_dbgbus_dump_read,
 	.read = sde_recovery_dbgbus_dump_read,
 };
 };
 
 
+static int sde_recovery_rsc_dbgbus_dump_open(struct inode *inode,
+		struct file *file)
+{
+	if (!inode || !file)
+		return -EINVAL;
+
+	/* non-seekable */
+	file->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
+	file->private_data =  (void *)&sde_dbg_base.dbgbus_rsc.cmn;
+
+	mutex_lock(&sde_dbg_base.mutex);
+	sde_dbg_base.dbgbus_rsc.cmn.content_idx = 0;
+	mutex_unlock(&sde_dbg_base.mutex);
+
+	return 0;
+}
+
+static const struct file_operations sde_recovery_rsc_dbgbus_fops = {
+	.open = sde_recovery_rsc_dbgbus_dump_open,
+	.read = sde_recovery_dbgbus_dump_read,
+};
 
 
 static int sde_recovery_lutdma_dbgbus_dump_open(struct inode *inode,
 static int sde_recovery_lutdma_dbgbus_dump_open(struct inode *inode,
 		struct file *file)
 		struct file *file)
@@ -2118,6 +2157,15 @@ int sde_dbg_debugfs_register(struct device *dev)
 				&dbg->dbgbus_dsi.cmn.enable_mask);
 				&dbg->dbgbus_dsi.cmn.enable_mask);
 	}
 	}
 
 
+	if (dbg->dbgbus_rsc.entries) {
+		debugfs_create_file("recovery_rsc_dbgbus", 0400, debugfs_root,
+				NULL, &sde_recovery_rsc_dbgbus_fops);
+		snprintf(debug_name, sizeof(debug_name), "%s_dbgbus",
+				dbg->dbgbus_rsc.cmn.name);
+		debugfs_create_u32(debug_name, 0600, debugfs_root,
+				&dbg->dbgbus_rsc.cmn.enable_mask);
+	}
+
 	if (dbg->dbgbus_lutdma.entries) {
 	if (dbg->dbgbus_lutdma.entries) {
 		debugfs_create_file("recovery_lutdma_dbgbus", 0400,
 		debugfs_create_file("recovery_lutdma_dbgbus", 0400,
 				debugfs_root, NULL,
 				debugfs_root, NULL,
@@ -2163,6 +2211,7 @@ void sde_dbg_init_dbg_buses(u32 hwversion)
 	memset(&dbg->dbgbus_sde, 0, sizeof(dbg->dbgbus_sde));
 	memset(&dbg->dbgbus_sde, 0, sizeof(dbg->dbgbus_sde));
 	memset(&dbg->dbgbus_vbif_rt, 0, sizeof(dbg->dbgbus_vbif_rt));
 	memset(&dbg->dbgbus_vbif_rt, 0, sizeof(dbg->dbgbus_vbif_rt));
 	memset(&dbg->dbgbus_dsi, 0, sizeof(dbg->dbgbus_dsi));
 	memset(&dbg->dbgbus_dsi, 0, sizeof(dbg->dbgbus_dsi));
+	memset(&dbg->dbgbus_rsc, 0, sizeof(dbg->dbgbus_rsc));
 
 
 	dbg->dbgbus_sde.entries = dbg_bus_sde;
 	dbg->dbgbus_sde.entries = dbg_bus_sde;
 	dbg->dbgbus_sde.cmn.entries_size = ARRAY_SIZE(dbg_bus_sde);
 	dbg->dbgbus_sde.cmn.entries_size = ARRAY_SIZE(dbg_bus_sde);
@@ -2190,6 +2239,13 @@ void sde_dbg_init_dbg_buses(u32 hwversion)
 	dbg->dbgbus_dsi.read_tp = _sde_dbg_dsi_read_test_point;
 	dbg->dbgbus_dsi.read_tp = _sde_dbg_dsi_read_test_point;
 	dbg->dbgbus_dsi.clear_tp = _sde_dbg_cmn_clear_test_point;
 	dbg->dbgbus_dsi.clear_tp = _sde_dbg_cmn_clear_test_point;
 
 
+	dbg->dbgbus_rsc.entries = rsc_dbg_bus;
+	dbg->dbgbus_rsc.cmn.entries_size = ARRAY_SIZE(rsc_dbg_bus);
+	dbg->dbgbus_rsc.cmn.name = DBGBUS_NAME_RSC;
+	dbg->dbgbus_rsc.cmn.enable_mask = DEFAULT_DBGBUS_RSC;
+	dbg->dbgbus_rsc.read_tp = _sde_dbg_rsc_read_test_point;
+	dbg->dbgbus_rsc.clear_tp = _sde_dbg_cmn_clear_test_point;
+
 	if (SDE_HW_REV_MAJOR(hwversion) >= 0x7) {
 	if (SDE_HW_REV_MAJOR(hwversion) >= 0x7) {
 		dbg->dbgbus_lutdma.entries = dbg_bus_lutdma;
 		dbg->dbgbus_lutdma.entries = dbg_bus_lutdma;
 		dbg->dbgbus_lutdma.cmn.name = DBGBUS_NAME_LUTDMA;
 		dbg->dbgbus_lutdma.cmn.name = DBGBUS_NAME_LUTDMA;