|
@@ -72,6 +72,34 @@ enum sde_dbg_dump_context {
|
|
|
SDE_DBG_DUMP_CLK_ENABLED_CTX,
|
|
|
};
|
|
|
|
|
|
+/*
|
|
|
+ * Define blocks for register write logging.
|
|
|
+ */
|
|
|
+#define SDE_REG_LOG_DEFAULT 0
|
|
|
+#define SDE_REG_LOG_NONE 1
|
|
|
+#define SDE_REG_LOG_CDM 2
|
|
|
+#define SDE_REG_LOG_DSPP 3
|
|
|
+#define SDE_REG_LOG_INTF 4
|
|
|
+#define SDE_REG_LOG_LM 5
|
|
|
+#define SDE_REG_LOG_CTL 6
|
|
|
+#define SDE_REG_LOG_PINGPONG 7
|
|
|
+#define SDE_REG_LOG_SSPP 8
|
|
|
+#define SDE_REG_LOG_WB 9
|
|
|
+#define SDE_REG_LOG_TOP 10
|
|
|
+#define SDE_REG_LOG_VBIF 11
|
|
|
+#define SDE_REG_LOG_DSC 12
|
|
|
+#define SDE_REG_LOG_ROT 13
|
|
|
+#define SDE_REG_LOG_DS 14
|
|
|
+#define SDE_REG_LOG_REGDMA 15
|
|
|
+#define SDE_REG_LOG_UIDLE 16
|
|
|
+#define SDE_REG_LOG_SID 16
|
|
|
+#define SDE_REG_LOG_QDSS 17
|
|
|
+/*
|
|
|
+ * 0-32 are reserved for sde_reg_write due to log masks
|
|
|
+ * Additional blocks are assigned from 33 to avoid conflict
|
|
|
+ */
|
|
|
+#define SDE_REG_LOG_RSCC 33
|
|
|
+
|
|
|
#define SDE_EVTLOG_DEFAULT_ENABLE (SDE_EVTLOG_CRITICAL | SDE_EVTLOG_IRQ | \
|
|
|
SDE_EVTLOG_EXTERNAL)
|
|
|
|
|
@@ -126,6 +154,44 @@ struct sde_dbg_evtlog {
|
|
|
|
|
|
extern struct sde_dbg_evtlog *sde_dbg_base_evtlog;
|
|
|
|
|
|
+/*
|
|
|
+ * reglog keeps this number of entries in memory for debug purpose. This
|
|
|
+ * number must be greater than number of possible writes in at least one
|
|
|
+ * single commit.
|
|
|
+ */
|
|
|
+#define SDE_REGLOG_ENTRY 1024
|
|
|
+
|
|
|
+struct sde_dbg_reglog_log {
|
|
|
+ s64 time;
|
|
|
+ u32 pid;
|
|
|
+ u32 addr;
|
|
|
+ u32 val;
|
|
|
+ u8 blk_id;
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * @last_dump: Index of last entry to be output during reglog dumps
|
|
|
+ * @filter_list: Linked list of currently active filter strings
|
|
|
+ */
|
|
|
+struct sde_dbg_reglog {
|
|
|
+ struct sde_dbg_reglog_log logs[SDE_REGLOG_ENTRY];
|
|
|
+ u32 first;
|
|
|
+ u32 last;
|
|
|
+ u32 last_dump;
|
|
|
+ u32 curr;
|
|
|
+ u32 next;
|
|
|
+ u32 enable;
|
|
|
+ u32 enable_mask;
|
|
|
+ spinlock_t spin_lock;
|
|
|
+};
|
|
|
+
|
|
|
+extern struct sde_dbg_reglog *sde_dbg_base_reglog;
|
|
|
+
|
|
|
+/**
|
|
|
+ * SDE_REG_LOG - Write register write to the register log
|
|
|
+ */
|
|
|
+#define SDE_REG_LOG(blk_id, val, addr) sde_reglog_log(blk_id, val, addr)
|
|
|
+
|
|
|
/**
|
|
|
* SDE_EVT32 - Write a list of 32bit values to the event log, default area
|
|
|
* ... - variable arguments
|
|
@@ -207,6 +273,12 @@ extern struct sde_dbg_evtlog *sde_dbg_base_evtlog;
|
|
|
*/
|
|
|
struct sde_dbg_evtlog *sde_evtlog_init(void);
|
|
|
|
|
|
+/**
|
|
|
+ * sde_reglog_init - allocate a new reg log object
|
|
|
+ * Returns: reglog or -ERROR
|
|
|
+ */
|
|
|
+struct sde_dbg_reglog *sde_reglog_init(void);
|
|
|
+
|
|
|
/**
|
|
|
* sde_evtlog_destroy - destroy previously allocated event log
|
|
|
* @evtlog: pointer to evtlog
|
|
@@ -214,6 +286,13 @@ struct sde_dbg_evtlog *sde_evtlog_init(void);
|
|
|
*/
|
|
|
void sde_evtlog_destroy(struct sde_dbg_evtlog *evtlog);
|
|
|
|
|
|
+/**
|
|
|
+ * sde_reglog_destroy - destroy previously allocated reg log
|
|
|
+ * @reglog: pointer to reglog
|
|
|
+ * Returns: none
|
|
|
+ */
|
|
|
+void sde_reglog_destroy(struct sde_dbg_reglog *reglog);
|
|
|
+
|
|
|
/**
|
|
|
* sde_evtlog_log - log an entry into the event log.
|
|
|
* log collection may be enabled/disabled entirely via debugfs
|
|
@@ -227,6 +306,15 @@ void sde_evtlog_destroy(struct sde_dbg_evtlog *evtlog);
|
|
|
void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line,
|
|
|
int flag, ...);
|
|
|
|
|
|
+/**
|
|
|
+ * sde_reglog_log - log an entry into the reg log.
|
|
|
+ * log collection may be enabled/disabled entirely via debugfs
|
|
|
+ * log area collection may be filtered by user provided flags via debugfs.
|
|
|
+ * @reglog: pointer to evtlog
|
|
|
+ * Returns: none
|
|
|
+ */
|
|
|
+void sde_reglog_log(u8 blk_id, u32 val, u32 addr);
|
|
|
+
|
|
|
/**
|
|
|
* sde_evtlog_dump_all - print all entries in event log to kernel log
|
|
|
* @evtlog: pointer to evtlog
|