Loading drivers/gpu/drm/msm/sde_dbg.c +3 −2 Original line number Diff line number Diff line Loading @@ -2558,6 +2558,7 @@ static void _sde_dump_array(struct sde_dbg_reg_base *blk_arr[], mutex_lock(&sde_dbg_base.mutex); if (dump_all) sde_evtlog_dump_all(sde_dbg_base.evtlog); if (dump_all || !blk_arr || !len) { Loading Loading @@ -2711,7 +2712,7 @@ static ssize_t sde_evtlog_dump_read(struct file *file, char __user *buff, return -EINVAL; len = sde_evtlog_dump_to_buffer(sde_dbg_base.evtlog, evtlog_buf, SDE_EVTLOG_BUF_MAX); SDE_EVTLOG_BUF_MAX, true); if (copy_to_user(buff, evtlog_buf, len)) return -EFAULT; *ppos += len; Loading drivers/gpu/drm/msm/sde_dbg.h +10 −4 Original line number Diff line number Diff line Loading @@ -17,7 +17,8 @@ #include <linux/debugfs.h> #include <linux/list.h> #define SDE_EVTLOG_DATA_LIMITER (-1) /* select an uncommon hex value for the limiter */ #define SDE_EVTLOG_DATA_LIMITER (0xC0DEBEEF) #define SDE_EVTLOG_FUNC_ENTRY 0x1111 #define SDE_EVTLOG_FUNC_EXIT 0x2222 #define SDE_EVTLOG_FUNC_CASE1 0x3333 Loading Loading @@ -66,7 +67,7 @@ enum sde_dbg_dump_flag { * number must be greater than print entry to prevent out of bound evtlog * entry array access. */ #define SDE_EVTLOG_ENTRY (SDE_EVTLOG_PRINT_ENTRY * 4) #define SDE_EVTLOG_ENTRY (SDE_EVTLOG_PRINT_ENTRY * 8) #define SDE_EVTLOG_MAX_DATA 15 #define SDE_EVTLOG_BUF_MAX 512 #define SDE_EVTLOG_BUF_ALIGN 32 Loading @@ -87,12 +88,14 @@ struct sde_dbg_evtlog_log { }; /** * @last_dump: Index of last entry to be output during evtlog dumps * @filter_list: Linked list of currently active filter strings */ struct sde_dbg_evtlog { struct sde_dbg_evtlog_log logs[SDE_EVTLOG_ENTRY]; u32 first; u32 last; u32 last_dump; u32 curr; u32 next; u32 enable; Loading Loading @@ -197,10 +200,12 @@ bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog, u32 flag); * @evtlog: pointer to evtlog * @evtlog_buf: target buffer to print into * @evtlog_buf_size: size of target buffer * @update_last_entry: whether or not to stop at most recent entry * Returns: number of bytes written to buffer */ ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog, char *evtlog_buf, ssize_t evtlog_buf_size); char *evtlog_buf, ssize_t evtlog_buf_size, bool update_last_entry); /** * sde_dbg_init_dbg_buses - initialize debug bus dumping support for the chipset Loading Loading @@ -352,7 +357,8 @@ static inline bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog, } static inline ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog, char *evtlog_buf, ssize_t evtlog_buf_size) char *evtlog_buf, ssize_t evtlog_buf_size, bool update_last_entry) { return 0; } Loading drivers/gpu/drm/msm/sde_dbg_evtlog.c +22 −12 Original line number Diff line number Diff line Loading @@ -105,27 +105,32 @@ void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line, } /* always dump the last entries which are not dumped yet */ static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog) static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog, bool update_last_entry) { if (!evtlog) return false; evtlog->first = evtlog->next; if (evtlog->last == evtlog->first) if (update_last_entry) evtlog->last_dump = evtlog->last; if (evtlog->last_dump == evtlog->first) return false; if (evtlog->last < evtlog->first) { if (evtlog->last_dump < evtlog->first) { evtlog->first %= SDE_EVTLOG_ENTRY; if (evtlog->last < evtlog->first) evtlog->last += SDE_EVTLOG_ENTRY; if (evtlog->last_dump < evtlog->first) evtlog->last_dump += SDE_EVTLOG_ENTRY; } if ((evtlog->last - evtlog->first) > SDE_EVTLOG_PRINT_ENTRY) { if ((evtlog->last_dump - evtlog->first) > SDE_EVTLOG_PRINT_ENTRY) { pr_info("evtlog skipping %d entries, last=%d\n", evtlog->last - evtlog->first - SDE_EVTLOG_PRINT_ENTRY, evtlog->last - 1); evtlog->first = evtlog->last - SDE_EVTLOG_PRINT_ENTRY; evtlog->last_dump - evtlog->first - SDE_EVTLOG_PRINT_ENTRY, evtlog->last_dump - 1); evtlog->first = evtlog->last_dump - SDE_EVTLOG_PRINT_ENTRY; } evtlog->next = evtlog->first + 1; Loading @@ -133,7 +138,8 @@ static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog) } ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog, char *evtlog_buf, ssize_t evtlog_buf_size) char *evtlog_buf, ssize_t evtlog_buf_size, bool update_last_entry) { int i; ssize_t off = 0; Loading @@ -146,7 +152,7 @@ ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog, spin_lock_irqsave(&evtlog->spin_lock, flags); /* update markers, exit if nothing to print */ if (!_sde_evtlog_dump_calc_range(evtlog)) if (!_sde_evtlog_dump_calc_range(evtlog, update_last_entry)) goto exit; log = &evtlog->logs[evtlog->first % SDE_EVTLOG_ENTRY]; Loading Loading @@ -179,12 +185,16 @@ ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog, void sde_evtlog_dump_all(struct sde_dbg_evtlog *evtlog) { char buf[SDE_EVTLOG_BUF_MAX]; bool update_last_entry = true; if (!evtlog) return; while (sde_evtlog_dump_to_buffer(evtlog, buf, sizeof(buf))) while (sde_evtlog_dump_to_buffer( evtlog, buf, sizeof(buf), update_last_entry)) { pr_info("%s", buf); update_last_entry = false; } } struct sde_dbg_evtlog *sde_evtlog_init(void) Loading Loading
drivers/gpu/drm/msm/sde_dbg.c +3 −2 Original line number Diff line number Diff line Loading @@ -2558,6 +2558,7 @@ static void _sde_dump_array(struct sde_dbg_reg_base *blk_arr[], mutex_lock(&sde_dbg_base.mutex); if (dump_all) sde_evtlog_dump_all(sde_dbg_base.evtlog); if (dump_all || !blk_arr || !len) { Loading Loading @@ -2711,7 +2712,7 @@ static ssize_t sde_evtlog_dump_read(struct file *file, char __user *buff, return -EINVAL; len = sde_evtlog_dump_to_buffer(sde_dbg_base.evtlog, evtlog_buf, SDE_EVTLOG_BUF_MAX); SDE_EVTLOG_BUF_MAX, true); if (copy_to_user(buff, evtlog_buf, len)) return -EFAULT; *ppos += len; Loading
drivers/gpu/drm/msm/sde_dbg.h +10 −4 Original line number Diff line number Diff line Loading @@ -17,7 +17,8 @@ #include <linux/debugfs.h> #include <linux/list.h> #define SDE_EVTLOG_DATA_LIMITER (-1) /* select an uncommon hex value for the limiter */ #define SDE_EVTLOG_DATA_LIMITER (0xC0DEBEEF) #define SDE_EVTLOG_FUNC_ENTRY 0x1111 #define SDE_EVTLOG_FUNC_EXIT 0x2222 #define SDE_EVTLOG_FUNC_CASE1 0x3333 Loading Loading @@ -66,7 +67,7 @@ enum sde_dbg_dump_flag { * number must be greater than print entry to prevent out of bound evtlog * entry array access. */ #define SDE_EVTLOG_ENTRY (SDE_EVTLOG_PRINT_ENTRY * 4) #define SDE_EVTLOG_ENTRY (SDE_EVTLOG_PRINT_ENTRY * 8) #define SDE_EVTLOG_MAX_DATA 15 #define SDE_EVTLOG_BUF_MAX 512 #define SDE_EVTLOG_BUF_ALIGN 32 Loading @@ -87,12 +88,14 @@ struct sde_dbg_evtlog_log { }; /** * @last_dump: Index of last entry to be output during evtlog dumps * @filter_list: Linked list of currently active filter strings */ struct sde_dbg_evtlog { struct sde_dbg_evtlog_log logs[SDE_EVTLOG_ENTRY]; u32 first; u32 last; u32 last_dump; u32 curr; u32 next; u32 enable; Loading Loading @@ -197,10 +200,12 @@ bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog, u32 flag); * @evtlog: pointer to evtlog * @evtlog_buf: target buffer to print into * @evtlog_buf_size: size of target buffer * @update_last_entry: whether or not to stop at most recent entry * Returns: number of bytes written to buffer */ ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog, char *evtlog_buf, ssize_t evtlog_buf_size); char *evtlog_buf, ssize_t evtlog_buf_size, bool update_last_entry); /** * sde_dbg_init_dbg_buses - initialize debug bus dumping support for the chipset Loading Loading @@ -352,7 +357,8 @@ static inline bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog, } static inline ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog, char *evtlog_buf, ssize_t evtlog_buf_size) char *evtlog_buf, ssize_t evtlog_buf_size, bool update_last_entry) { return 0; } Loading
drivers/gpu/drm/msm/sde_dbg_evtlog.c +22 −12 Original line number Diff line number Diff line Loading @@ -105,27 +105,32 @@ void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line, } /* always dump the last entries which are not dumped yet */ static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog) static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog, bool update_last_entry) { if (!evtlog) return false; evtlog->first = evtlog->next; if (evtlog->last == evtlog->first) if (update_last_entry) evtlog->last_dump = evtlog->last; if (evtlog->last_dump == evtlog->first) return false; if (evtlog->last < evtlog->first) { if (evtlog->last_dump < evtlog->first) { evtlog->first %= SDE_EVTLOG_ENTRY; if (evtlog->last < evtlog->first) evtlog->last += SDE_EVTLOG_ENTRY; if (evtlog->last_dump < evtlog->first) evtlog->last_dump += SDE_EVTLOG_ENTRY; } if ((evtlog->last - evtlog->first) > SDE_EVTLOG_PRINT_ENTRY) { if ((evtlog->last_dump - evtlog->first) > SDE_EVTLOG_PRINT_ENTRY) { pr_info("evtlog skipping %d entries, last=%d\n", evtlog->last - evtlog->first - SDE_EVTLOG_PRINT_ENTRY, evtlog->last - 1); evtlog->first = evtlog->last - SDE_EVTLOG_PRINT_ENTRY; evtlog->last_dump - evtlog->first - SDE_EVTLOG_PRINT_ENTRY, evtlog->last_dump - 1); evtlog->first = evtlog->last_dump - SDE_EVTLOG_PRINT_ENTRY; } evtlog->next = evtlog->first + 1; Loading @@ -133,7 +138,8 @@ static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog) } ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog, char *evtlog_buf, ssize_t evtlog_buf_size) char *evtlog_buf, ssize_t evtlog_buf_size, bool update_last_entry) { int i; ssize_t off = 0; Loading @@ -146,7 +152,7 @@ ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog, spin_lock_irqsave(&evtlog->spin_lock, flags); /* update markers, exit if nothing to print */ if (!_sde_evtlog_dump_calc_range(evtlog)) if (!_sde_evtlog_dump_calc_range(evtlog, update_last_entry)) goto exit; log = &evtlog->logs[evtlog->first % SDE_EVTLOG_ENTRY]; Loading Loading @@ -179,12 +185,16 @@ ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog, void sde_evtlog_dump_all(struct sde_dbg_evtlog *evtlog) { char buf[SDE_EVTLOG_BUF_MAX]; bool update_last_entry = true; if (!evtlog) return; while (sde_evtlog_dump_to_buffer(evtlog, buf, sizeof(buf))) while (sde_evtlog_dump_to_buffer( evtlog, buf, sizeof(buf), update_last_entry)) { pr_info("%s", buf); update_last_entry = false; } } struct sde_dbg_evtlog *sde_evtlog_init(void) Loading