123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555 |
- #ifndef SDE_DBG_H_
- #define SDE_DBG_H_
- #include <linux/stdarg.h>
- #include <linux/debugfs.h>
- #include <linux/list.h>
- #include <soc/qcom/minidump.h>
- #include <drm/drm_print.h>
- #define SDE_EVTLOG_DATA_LIMITER (0xC0DEBEEF)
- #define SDE_EVTLOG_FUNC_ENTRY 0x1111
- #define SDE_EVTLOG_FUNC_EXIT 0x2222
- #define SDE_EVTLOG_FUNC_CASE1 0x3333
- #define SDE_EVTLOG_FUNC_CASE2 0x4444
- #define SDE_EVTLOG_FUNC_CASE3 0x5555
- #define SDE_EVTLOG_FUNC_CASE4 0x6666
- #define SDE_EVTLOG_FUNC_CASE5 0x7777
- #define SDE_EVTLOG_FUNC_CASE6 0x8888
- #define SDE_EVTLOG_FUNC_CASE7 0x9999
- #define SDE_EVTLOG_FUNC_CASE8 0xaaaa
- #define SDE_EVTLOG_FUNC_CASE9 0xbbbb
- #define SDE_EVTLOG_FUNC_CASE10 0xcccc
- #define SDE_EVTLOG_PANIC 0xdead
- #define SDE_EVTLOG_FATAL 0xbad
- #define SDE_EVTLOG_ERROR 0xebad
- #define SDE_EVTLOG_H32(val) (val >> 32)
- #define SDE_EVTLOG_L32(val) (val & 0xffffffff)
- #define LUTDMA_DBG_NAME "reg_dma"
- #define SDE_DBG_SDE BIT(0)
- #define SDE_DBG_RSC BIT(1)
- #define SDE_DBG_SID BIT(2)
- #define SDE_DBG_LUTDMA BIT(3)
- #define SDE_DBG_VBIF_RT BIT(4)
- #define SDE_DBG_DSI BIT(5)
- #define SDE_DBG_SDE_DBGBUS BIT(12)
- #define SDE_DBG_RSC_DBGBUS BIT(13)
- #define SDE_DBG_LUTDMA_DBGBUS BIT(14)
- #define SDE_DBG_VBIF_RT_DBGBUS BIT(15)
- #define SDE_DBG_DSI_DBGBUS BIT(16)
- #define SDE_DBG_BUILT_IN_ALL 0xffffff
- #define SDE_DBG_DP BIT(24)
- #define SDE_DBG_DP_DBGBUS BIT(25)
- #define SDE_DBG_DUMP_DATA_LIMITER (NULL)
- enum sde_dbg_evtlog_flag {
- SDE_EVTLOG_CRITICAL = BIT(0),
- SDE_EVTLOG_IRQ = BIT(1),
- SDE_EVTLOG_VERBOSE = BIT(2),
- SDE_EVTLOG_EXTERNAL = BIT(3),
- SDE_EVTLOG_ALWAYS = -1
- };
- enum sde_dbg_dump_flag {
- SDE_DBG_DUMP_IN_LOG = BIT(0),
- SDE_DBG_DUMP_IN_MEM = BIT(1),
- SDE_DBG_DUMP_IN_LOG_LIMITED = BIT(2),
- SDE_DBG_DUMP_IN_COREDUMP = BIT(3),
- };
- enum sde_dbg_dump_context {
- SDE_DBG_DUMP_PROC_CTX,
- SDE_DBG_DUMP_IRQ_CTX,
- SDE_DBG_DUMP_CLK_ENABLED_CTX,
- };
- #define SDE_DBG_DEFAULT_DUMP_MODE SDE_DBG_DUMP_IN_MEM
- #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
- #define SDE_REG_LOG_RSCC 33
- #define SDE_EVTLOG_DEFAULT_ENABLE (SDE_EVTLOG_CRITICAL | SDE_EVTLOG_IRQ | SDE_EVTLOG_EXTERNAL)
- #define SDE_EVTLOG_PRINT_ENTRY 256
- #if IS_ENABLED(CONFIG_DRM_MSM_LOW_MEM_FOOTPRINT)
- #define SDE_EVTLOG_ENTRY (SDE_EVTLOG_PRINT_ENTRY * 8)
- #else
- #define SDE_EVTLOG_ENTRY (SDE_EVTLOG_PRINT_ENTRY * 32)
- #endif
- #define SDE_EVTLOG_MAX_DATA 15
- #define SDE_EVTLOG_BUF_MAX 512
- #define SDE_EVTLOG_BUF_ALIGN 32
- struct sde_dbg_power_ctrl {
- void *handle;
- void *client;
- int (*enable_fn)(void *handle, void *client, bool enable);
- };
- struct sde_dbg_evtlog_log {
- s64 time;
- const char *name;
- int line;
- u32 data[SDE_EVTLOG_MAX_DATA];
- u32 data_cnt;
- int pid;
- u8 cpu;
- };
- struct sde_dbg_evtlog {
- struct sde_dbg_evtlog_log logs[SDE_EVTLOG_ENTRY];
- u32 first;
- atomic_t last;
- u32 last_dump;
- atomic_t curr;
- u32 next;
- u32 enable;
- u32 dump_mode;
- char *dumped_evtlog;
- u32 log_size;
- spinlock_t spin_lock;
- struct list_head filter_list;
- };
- extern struct sde_dbg_evtlog *sde_dbg_base_evtlog;
- #if IS_ENABLED(CONFIG_DRM_MSM_LOW_MEM_FOOTPRINT)
- #define SDE_REGLOG_ENTRY 256
- #else
- #define SDE_REGLOG_ENTRY 1024
- #endif
- struct sde_dbg_reglog_log {
- s64 time;
- u32 pid;
- u32 addr;
- u32 val;
- u8 blk_id;
- };
- struct sde_dbg_reglog {
- struct sde_dbg_reglog_log logs[SDE_REGLOG_ENTRY];
- u32 first;
- u32 last;
- u32 last_dump;
- atomic64_t curr;
- u32 next;
- u32 enable;
- u32 enable_mask;
- };
- extern struct sde_dbg_reglog *sde_dbg_base_reglog;
- #define SDE_REG_LOG(blk_id, val, addr) sde_reglog_log(blk_id, val, addr)
- #define SDE_EVT32(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
- __LINE__, SDE_EVTLOG_ALWAYS, ##__VA_ARGS__, \
- SDE_EVTLOG_DATA_LIMITER)
- #define SDE_EVT32_VERBOSE(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
- __LINE__, SDE_EVTLOG_VERBOSE, ##__VA_ARGS__, \
- SDE_EVTLOG_DATA_LIMITER)
- #define SDE_EVT32_IRQ(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
- __LINE__, SDE_EVTLOG_IRQ, ##__VA_ARGS__, \
- SDE_EVTLOG_DATA_LIMITER)
- #define SDE_EVT32_EXTERNAL(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
- __LINE__, SDE_EVTLOG_EXTERNAL, ##__VA_ARGS__, \
- SDE_EVTLOG_DATA_LIMITER)
- #define SDE_DBG_DUMP(dump_blk_mask, ...) sde_dbg_dump(SDE_DBG_DUMP_PROC_CTX, __func__, \
- dump_blk_mask, ##__VA_ARGS__, SDE_DBG_DUMP_DATA_LIMITER)
- #define SDE_DBG_DUMP_WQ(dump_blk_mask, ...) sde_dbg_dump(SDE_DBG_DUMP_IRQ_CTX, __func__, \
- dump_blk_mask, ##__VA_ARGS__, SDE_DBG_DUMP_DATA_LIMITER)
- #define SDE_DBG_DUMP_CLK_EN(dump_blk_mask, ...) sde_dbg_dump(SDE_DBG_DUMP_CLK_ENABLED_CTX, \
- __func__, dump_blk_mask, ##__VA_ARGS__, SDE_DBG_DUMP_DATA_LIMITER)
- #define SDE_DBG_CTRL(...) sde_dbg_ctrl(__func__, ##__VA_ARGS__, \
- SDE_DBG_DUMP_DATA_LIMITER)
- void sde_mini_dump_add_va_region(const char *name, u32 size, void *virt_addr);
- struct sde_dbg_evtlog *sde_evtlog_init(void);
- struct sde_dbg_reglog *sde_reglog_init(void);
- void sde_evtlog_destroy(struct sde_dbg_evtlog *evtlog);
- void sde_reglog_destroy(struct sde_dbg_reglog *reglog);
- void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line,
- int flag, ...);
- void sde_reglog_log(u8 blk_id, u32 val, u32 addr);
- ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
- char *evtlog_buf, ssize_t evtlog_buf_size,
- bool update_last_entry, bool full_dump);
- u32 sde_evtlog_count(struct sde_dbg_evtlog *evtlog);
- bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog, u32 flag);
- ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
- char *evtlog_buf, ssize_t evtlog_buf_size,
- bool update_last_entry, bool full_dump);
- void sde_dbg_init_dbg_buses(u32 hw_rev);
- int sde_dbg_init(struct device *dev);
- int sde_dbg_debugfs_register(struct device *dev);
- void sde_dbg_destroy(void);
- void sde_dbg_dump(enum sde_dbg_dump_context mode, const char *name, u64 dump_blk_mask, ...);
- void sde_dbg_ctrl(const char *name, ...);
- int sde_dbg_reg_register_base(const char *name, void __iomem *base,
- size_t max_offset, unsigned long phys_addr, u64 blk_id);
- int sde_dbg_reg_register_cb(const char *name, void (*cb)(void *), void *ptr);
- void sde_dbg_reg_unregister_cb(const char *name, void (*cb)(void *), void *ptr);
- void sde_dbg_reg_register_dump_range(const char *base_name,
- const char *range_name, u32 offset_start, u32 offset_end,
- uint32_t xin_id);
- int sde_dbg_dsi_ctrl_register(void __iomem *base, const char *name);
- void sde_dbg_set_sde_top_offset(u32 blk_off);
- void sde_dbg_set_hw_ownership_status(bool enable);
- void sde_evtlog_set_filter(struct sde_dbg_evtlog *evtlog, char *filter);
- int sde_evtlog_get_filter(struct sde_dbg_evtlog *evtlog, int index,
- char *buf, size_t bufsz);
- #ifndef CONFIG_DRM_SDE_RSC
- static inline void sde_rsc_debug_dump(u32 mux_sel)
- {
- }
- #else
- void sde_rsc_debug_dump(u32 mux_sel);
- #endif
- void sde_dbg_update_dump_mode(bool enable_coredump);
- #endif
|