Message ID | 20180620204841.56354-14-seanpaul@chromium.org (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
On 2018-06-21 02:18, Sean Paul wrote: > Now that everything has been converted to tracepoints, remove the dpu > evtlog. > > Signed-off-by: Sean Paul <seanpaul@chromium.org> Reviewed-by: Rajesh Yadav <ryadav@codeaurora.org> > --- > drivers/gpu/drm/msm/Makefile | 1 - > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 5 - > drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 33 --- > drivers/gpu/drm/msm/dpu_dbg.c | 147 +---------- > drivers/gpu/drm/msm/dpu_dbg.h | 224 +--------------- > drivers/gpu/drm/msm/dpu_dbg_evtlog.c | 306 ---------------------- > 6 files changed, 11 insertions(+), 705 deletions(-) > delete mode 100644 drivers/gpu/drm/msm/dpu_dbg_evtlog.c > > diff --git a/drivers/gpu/drm/msm/Makefile > b/drivers/gpu/drm/msm/Makefile > index dc56904367d8..9c182a9dab2b 100644 > --- a/drivers/gpu/drm/msm/Makefile > +++ b/drivers/gpu/drm/msm/Makefile > @@ -75,7 +75,6 @@ msm-y := \ > disp/dpu1/dpu_mdss.o \ > disp/dpu1/dpu_power_handle.o \ > dpu_dbg.o \ > - dpu_dbg_evtlog.o \ > msm_prop.o \ > msm_atomic.o \ > msm_debugfs.o \ > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > index 6ae5bba21074..4fd5e1d7261e 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > @@ -43,11 +43,6 @@ static const char * const iommu_ports[] = { > "mdp_0", > }; > > -/** > - * Controls size of event log buffer. Specified as a power of 2. > - */ > -#define DPU_EVTLOG_SIZE 1024 > - > /* > * To enable overall DRM driver logging > * # echo 0x2 > /sys/module/drm/parameters/debug > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h > b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h > index d6f117bdad24..41fd6a227d8b 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h > @@ -165,39 +165,6 @@ TRACE_EVENT(dpu_trace_counter, > __get_str(counter_name), __entry->value) > ) > > -#define DPU_TRACE_EVTLOG_SIZE 15 > -TRACE_EVENT(dpu_evtlog, > - TP_PROTO(const char *tag, u32 tag_id, u32 cnt, u32 data[]), > - TP_ARGS(tag, tag_id, cnt, data), > - TP_STRUCT__entry( > - __field(int, pid) > - __string(evtlog_tag, tag) > - __field(u32, tag_id) > - __array(u32, data, DPU_TRACE_EVTLOG_SIZE) > - ), > - TP_fast_assign( > - __entry->pid = current->tgid; > - __assign_str(evtlog_tag, tag); > - __entry->tag_id = tag_id; > - if (cnt > DPU_TRACE_EVTLOG_SIZE) > - cnt = DPU_TRACE_EVTLOG_SIZE; > - memcpy(__entry->data, data, cnt * sizeof(u32)); > - memset(&__entry->data[cnt], 0, > - (DPU_TRACE_EVTLOG_SIZE - cnt) * sizeof(u32)); > - ), > - TP_printk("%d|%s:%d|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x", > - __entry->pid, __get_str(evtlog_tag), > - __entry->tag_id, > - __entry->data[0], __entry->data[1], > - __entry->data[2], __entry->data[3], > - __entry->data[4], __entry->data[5], > - __entry->data[6], __entry->data[7], > - __entry->data[8], __entry->data[9], > - __entry->data[10], __entry->data[11], > - __entry->data[12], __entry->data[13], > - __entry->data[14]) > -) > - > TRACE_EVENT(dpu_perf_crtc_update, > TP_PROTO(u32 crtc, u64 bw_ctl_mnoc, u64 bw_ctl_llcc, > u64 bw_ctl_ebi, u32 core_clk_rate, > diff --git a/drivers/gpu/drm/msm/dpu_dbg.c > b/drivers/gpu/drm/msm/dpu_dbg.c > index 27538bc6c290..9495a0f17f1b 100644 > --- a/drivers/gpu/drm/msm/dpu_dbg.c > +++ b/drivers/gpu/drm/msm/dpu_dbg.c > @@ -165,7 +165,6 @@ struct dpu_dbg_vbif_debug_bus { > > /** > * struct dpu_dbg_base - global dpu debug base structure > - * @evtlog: event log instance > * @reg_base_list: list of register dumping regions > * @dev: device pointer > * @req_dump_blks: list of blocks requested for dumping > @@ -179,7 +178,6 @@ struct dpu_dbg_vbif_debug_bus { > * @dsi_dbg_bus: dump dsi debug bus register > */ > static struct dpu_dbg_base { > - struct dpu_dbg_evtlog *evtlog; > struct list_head reg_base_list; > struct device *dev; > > @@ -196,9 +194,6 @@ static struct dpu_dbg_base { > bool dsi_dbg_bus; > } dpu_dbg_base; > > -/* dpu_dbg_base_evtlog - global pointer to main dpu event log for > macro use */ > -struct dpu_dbg_evtlog *dpu_dbg_base_evtlog; > - > static void _dpu_debug_bus_xbar_dump(void __iomem *mem_base, > struct dpu_debug_bus_entry *entry, u32 val) > { > @@ -2526,8 +2521,6 @@ static void _dpu_dump_array(struct > dpu_dbg_reg_base *blk_arr[], > { > int i; > > - dpu_evtlog_dump_all(dpu_dbg_base.evtlog); > - > if (dump_all || !blk_arr || !len) { > _dpu_dump_reg_all(); > } else { > @@ -2556,7 +2549,7 @@ static void _dpu_dump_work(struct work_struct > *work) > { > _dpu_dump_array(dpu_dbg_base.req_dump_blks, > ARRAY_SIZE(dpu_dbg_base.req_dump_blks), > - dpu_dbg_base.work_panic, "evtlog_workitem", > + dpu_dbg_base.work_panic, "dpudump_workitem", > dpu_dbg_base.dbgbus_dpu.cmn.include_in_deferred_work, > dpu_dbg_base.dbgbus_vbif_rt.cmn.include_in_deferred_work, > dpu_dbg_base.dump_all); > @@ -2564,7 +2557,7 @@ static void _dpu_dump_work(struct work_struct > *work) > > void dpu_dbg_dump(bool queue_work, const char *name, ...) > { > - int i, index = 0; > + int index = 0; > bool do_panic = false; > bool dump_dbgbus_dpu = false; > bool dump_dbgbus_vbif_rt = false; > @@ -2575,9 +2568,6 @@ void dpu_dbg_dump(bool queue_work, const char > *name, ...) > struct dpu_dbg_reg_base **blk_arr; > u32 blk_len; > > - if (!dpu_evtlog_is_enabled(dpu_dbg_base.evtlog, DPU_EVTLOG_ALWAYS)) > - return; > - > if (queue_work && work_pending(&dpu_dbg_base.dump_work)) > return; > > @@ -2589,12 +2579,7 @@ void dpu_dbg_dump(bool queue_work, const char > *name, ...) > dpu_dbg_base.dump_all = false; > > va_start(args, name); > - i = 0; > while ((blk_name = va_arg(args, char*))) { > - if (i++ >= DPU_EVTLOG_MAX_DATA) { > - pr_err("could not parse all dump arguments\n"); > - break; > - } > if (IS_ERR_OR_NULL(blk_name)) > break; > > @@ -2641,7 +2626,7 @@ void dpu_dbg_dump(bool queue_work, const char > *name, ...) > } > > /* > - * dpu_dbg_debugfs_open - debugfs open handler for evtlog dump > + * dpu_dbg_debugfs_open - debugfs open handler for debug dump > * @inode: debugfs inode > * @file: file handle > */ > @@ -2654,35 +2639,13 @@ static int dpu_dbg_debugfs_open(struct inode > *inode, struct file *file) > } > > /** > - * dpu_evtlog_dump_read - debugfs read handler for evtlog dump > - * @file: file handler > - * @buff: user buffer content for debugfs > - * @count: size of user buffer > - * @ppos: position offset of user buffer > - */ > -static ssize_t dpu_evtlog_dump_read(struct file *file, char __user > *buff, > - size_t count, loff_t *ppos) > -{ > - ssize_t len = 0; > - char evtlog_buf[DPU_EVTLOG_BUF_MAX]; > - > - len = dpu_evtlog_dump_to_buffer(dpu_dbg_base.evtlog, evtlog_buf, > - DPU_EVTLOG_BUF_MAX); > - if (copy_to_user(buff, evtlog_buf, len)) > - return -EFAULT; > - *ppos += len; > - > - return len; > -} > - > -/** > - * dpu_evtlog_dump_write - debugfs write handler for evtlog dump > + * dpu_dbg_dump_write - debugfs write handler for debug dump > * @file: file handler > * @user_buf: user buffer content from debugfs > * @count: size of user buffer > * @ppos: position offset of user buffer > */ > -static ssize_t dpu_evtlog_dump_write(struct file *file, > +static ssize_t dpu_dbg_dump_write(struct file *file, > const char __user *user_buf, size_t count, loff_t *ppos) > { > _dpu_dump_array(NULL, 0, dpu_dbg_base.panic_on_err, "dump_debugfs", > @@ -2691,86 +2654,9 @@ static ssize_t dpu_evtlog_dump_write(struct file > *file, > return count; > } > > -static const struct file_operations dpu_evtlog_fops = { > +static const struct file_operations dpu_dbg_dump_fops = { > .open = dpu_dbg_debugfs_open, > - .read = dpu_evtlog_dump_read, > - .write = dpu_evtlog_dump_write, > -}; > - > -/* > - * dpu_evtlog_filter_show - read callback for evtlog filter > - * @s: pointer to seq_file object > - * @data: pointer to private data > - */ > -static int dpu_evtlog_filter_show(struct seq_file *s, void *data) > -{ > - struct dpu_dbg_evtlog *evtlog; > - char buffer[64]; > - int i; > - > - if (!s || !s->private) > - return -EINVAL; > - > - evtlog = s->private; > - > - for (i = 0; !dpu_evtlog_get_filter( > - evtlog, i, buffer, ARRAY_SIZE(buffer)); ++i) > - seq_printf(s, "*%s*\n", buffer); > - return 0; > -} > - > -/* > - * dpu_evtlog_filter_open - debugfs open handler for evtlog filter > - * @inode: debugfs inode > - * @file: file handle > - * Returns: zero on success > - */ > -static int dpu_evtlog_filter_open(struct inode *inode, struct file > *file) > -{ > - if (!file) > - return -EINVAL; > - > - return single_open(file, dpu_evtlog_filter_show, inode->i_private); > -} > - > -/* > - * dpu_evtlog_filter_write - write callback for evtlog filter > - * @file: pointer to file structure > - * @user_buf: pointer to incoming user data > - * @count: size of incoming user buffer > - * @ppos: pointer to file offset > - */ > -static ssize_t dpu_evtlog_filter_write(struct file *file, > - const char __user *user_buf, size_t count, loff_t *ppos) > -{ > - char *tmp_filter = NULL; > - ssize_t rc = 0; > - > - if (count > 0) { > - /* copy user provided string and null terminate it */ > - tmp_filter = kzalloc(count + 1, GFP_KERNEL); > - if (!tmp_filter) > - rc = -ENOMEM; > - else if (copy_from_user(tmp_filter, user_buf, count)) > - rc = -EFAULT; > - } > - > - /* update actual filter configuration on success */ > - if (!rc) { > - dpu_evtlog_set_filter(dpu_dbg_base.evtlog, tmp_filter); > - rc = count; > - } > - kfree(tmp_filter); > - > - return rc; > -} > - > -static const struct file_operations dpu_evtlog_filter_fops = { > - .open = dpu_evtlog_filter_open, > - .write = dpu_evtlog_filter_write, > - .read = seq_read, > - .llseek = seq_lseek, > - .release = seq_release > + .write = dpu_dbg_dump_write, > }; > > /** > @@ -3018,12 +2904,7 @@ int dpu_dbg_debugfs_register(struct dentry > *debugfs_root) > return -EINVAL; > > debugfs_create_file("dump", 0600, debugfs_root, NULL, > - &dpu_evtlog_fops); > - debugfs_create_u32("enable", 0600, debugfs_root, > - &(dpu_dbg_base.evtlog->enable)); > - debugfs_create_file("filter", 0600, debugfs_root, > - dpu_dbg_base.evtlog, > - &dpu_evtlog_filter_fops); > + &dpu_dbg_dump_fops); > debugfs_create_u32("panic", 0600, debugfs_root, > &dpu_dbg_base.panic_on_err); > debugfs_create_u32("reg_dump", 0600, debugfs_root, > @@ -3106,19 +2987,12 @@ int dpu_dbg_init(struct device *dev) > INIT_LIST_HEAD(&dpu_dbg_base.reg_base_list); > dpu_dbg_base.dev = dev; > > - dpu_dbg_base.evtlog = dpu_evtlog_init(); > - if (IS_ERR_OR_NULL(dpu_dbg_base.evtlog)) > - return PTR_ERR(dpu_dbg_base.evtlog); > - > - dpu_dbg_base_evtlog = dpu_dbg_base.evtlog; > - > INIT_WORK(&dpu_dbg_base.dump_work, _dpu_dump_work); > dpu_dbg_base.work_panic = false; > dpu_dbg_base.panic_on_err = DEFAULT_PANIC; > dpu_dbg_base.enable_reg_dump = DEFAULT_REGDUMP; > > - pr_info("evtlog_status: enable:%d, panic:%d, dump:%d\n", > - dpu_dbg_base.evtlog->enable, dpu_dbg_base.panic_on_err, > + pr_info("debug_status: panic:%d, dump:%d\n", > dpu_dbg_base.panic_on_err, > dpu_dbg_base.enable_reg_dump); > > return 0; > @@ -3150,9 +3024,6 @@ static void dpu_dbg_reg_base_destroy(void) > void dpu_dbg_destroy(void) > { > _dpu_dbg_debugfs_destroy(); > - dpu_dbg_base_evtlog = NULL; > - dpu_evtlog_destroy(dpu_dbg_base.evtlog); > - dpu_dbg_base.evtlog = NULL; > dpu_dbg_reg_base_destroy(); > } > > diff --git a/drivers/gpu/drm/msm/dpu_dbg.h > b/drivers/gpu/drm/msm/dpu_dbg.h > index 283dbbc00690..052c78d5b4f5 100644 > --- a/drivers/gpu/drm/msm/dpu_dbg.h > +++ b/drivers/gpu/drm/msm/dpu_dbg.h > @@ -17,109 +17,11 @@ > #include <linux/debugfs.h> > #include <linux/list.h> > > -#define DPU_EVTLOG_DATA_LIMITER (-1) > -#define DPU_EVTLOG_FUNC_ENTRY 0x1111 > -#define DPU_EVTLOG_FUNC_EXIT 0x2222 > -#define DPU_EVTLOG_FUNC_CASE1 0x3333 > -#define DPU_EVTLOG_FUNC_CASE2 0x4444 > -#define DPU_EVTLOG_FUNC_CASE3 0x5555 > -#define DPU_EVTLOG_FUNC_CASE4 0x6666 > -#define DPU_EVTLOG_FUNC_CASE5 0x7777 > -#define DPU_EVTLOG_FUNC_CASE6 0x8888 > -#define DPU_EVTLOG_FUNC_CASE7 0x9999 > -#define DPU_EVTLOG_FUNC_CASE8 0xaaaa > -#define DPU_EVTLOG_FUNC_CASE9 0xbbbb > -#define DPU_EVTLOG_FUNC_CASE10 0xcccc > -#define DPU_EVTLOG_PANIC 0xdead > -#define DPU_EVTLOG_FATAL 0xbad > -#define DPU_EVTLOG_ERROR 0xebad > - > -#define DPU_DBG_DUMP_DATA_LIMITER (NULL) > - > -enum dpu_dbg_evtlog_flag { > - DPU_EVTLOG_CRITICAL = BIT(0), > - DPU_EVTLOG_IRQ = BIT(1), > - DPU_EVTLOG_VERBOSE = BIT(2), > - DPU_EVTLOG_ALWAYS = -1 > -}; > - > enum dpu_dbg_dump_flag { > DPU_DBG_DUMP_IN_LOG = BIT(0), > DPU_DBG_DUMP_IN_MEM = BIT(1), > }; > > -#ifdef CONFIG_DRM_DPU_EVTLOG_DEBUG > -#define DPU_EVTLOG_DEFAULT_ENABLE (DPU_EVTLOG_CRITICAL | > DPU_EVTLOG_IRQ) > -#else > -#define DPU_EVTLOG_DEFAULT_ENABLE 0 > -#endif > - > -/* > - * evtlog will print this number of entries when it is called through > - * sysfs node or panic. This prevents kernel log from evtlog message > - * flood. > - */ > -#define DPU_EVTLOG_PRINT_ENTRY 256 > - > -/* > - * evtlog keeps this number of entries in memory for debug purpose. > This > - * number must be greater than print entry to prevent out of bound > evtlog > - * entry array access. > - */ > -#define DPU_EVTLOG_ENTRY (DPU_EVTLOG_PRINT_ENTRY * 4) > -#define DPU_EVTLOG_MAX_DATA 15 > -#define DPU_EVTLOG_BUF_MAX 512 > -#define DPU_EVTLOG_BUF_ALIGN 32 > - > -struct dpu_dbg_evtlog_log { > - s64 time; > - const char *name; > - int line; > - u32 data[DPU_EVTLOG_MAX_DATA]; > - u32 data_cnt; > - int pid; > -}; > - > -/** > - * @filter_list: Linked list of currently active filter strings > - */ > -struct dpu_dbg_evtlog { > - struct dpu_dbg_evtlog_log logs[DPU_EVTLOG_ENTRY]; > - u32 first; > - u32 last; > - u32 curr; > - u32 next; > - u32 enable; > - spinlock_t spin_lock; > - struct list_head filter_list; > -}; > - > -extern struct dpu_dbg_evtlog *dpu_dbg_base_evtlog; > - > -/** > - * DPU_EVT32 - Write a list of 32bit values to the event log, default > area > - * ... - variable arguments > - */ > -#define DPU_EVT32(...) dpu_evtlog_log(dpu_dbg_base_evtlog, __func__, \ > - __LINE__, DPU_EVTLOG_ALWAYS, ##__VA_ARGS__, \ > - DPU_EVTLOG_DATA_LIMITER) > - > -/** > - * DPU_EVT32_VERBOSE - Write a list of 32bit values for verbose event > logging > - * ... - variable arguments > - */ > -#define DPU_EVT32_VERBOSE(...) dpu_evtlog_log(dpu_dbg_base_evtlog, > __func__, \ > - __LINE__, DPU_EVTLOG_VERBOSE, ##__VA_ARGS__, \ > - DPU_EVTLOG_DATA_LIMITER) > - > -/** > - * DPU_EVT32_IRQ - Write a list of 32bit values to the event log, IRQ > area > - * ... - variable arguments > - */ > -#define DPU_EVT32_IRQ(...) dpu_evtlog_log(dpu_dbg_base_evtlog, > __func__, \ > - __LINE__, DPU_EVTLOG_IRQ, ##__VA_ARGS__, \ > - DPU_EVTLOG_DATA_LIMITER) > - > /** > * DPU_DBG_DUMP - trigger dumping of all dpu_dbg facilities > * @va_args: list of named register dump ranges and regions to dump, > as > @@ -128,74 +30,10 @@ extern struct dpu_dbg_evtlog *dpu_dbg_base_evtlog; > * Including the special name "panic" will trigger a panic after > * the dumping work has completed. > */ > -#define DPU_DBG_DUMP(...) dpu_dbg_dump(false, __func__, ##__VA_ARGS__, > \ > - DPU_DBG_DUMP_DATA_LIMITER) > - > -/** > - * DPU_DBG_DUMP_WQ - trigger dumping of all dpu_dbg facilities, > queuing the work > - * @va_args: list of named register dump ranges and regions to dump, > as > - * registered previously through dpu_dbg_reg_register_base and > - * dpu_dbg_reg_register_dump_range. > - * Including the special name "panic" will trigger a panic after > - * the dumping work has completed. > - */ > -#define DPU_DBG_DUMP_WQ(...) dpu_dbg_dump(true, __func__, > ##__VA_ARGS__, \ > - DPU_DBG_DUMP_DATA_LIMITER) > +#define DPU_DBG_DUMP(...) dpu_dbg_dump(false, __func__, ##__VA_ARGS__, > NULL) > > #if defined(CONFIG_DEBUG_FS) > > -/** > - * dpu_evtlog_init - allocate a new event log object > - * Returns: evtlog or -ERROR > - */ > -struct dpu_dbg_evtlog *dpu_evtlog_init(void); > - > -/** > - * dpu_evtlog_destroy - destroy previously allocated event log > - * @evtlog: pointer to evtlog > - * Returns: none > - */ > -void dpu_evtlog_destroy(struct dpu_dbg_evtlog *evtlog); > - > -/** > - * dpu_evtlog_log - log an entry into the event log. > - * log collection may be enabled/disabled entirely via debugfs > - * log area collection may be filtered by user provided flags via > debugfs. > - * @evtlog: pointer to evtlog > - * @name: function name of call site > - * @line: line number of call site > - * @flag: log area filter flag checked against user's debugfs request > - * Returns: none > - */ > -void dpu_evtlog_log(struct dpu_dbg_evtlog *evtlog, const char *name, > int line, > - int flag, ...); > - > -/** > - * dpu_evtlog_dump_all - print all entries in event log to kernel log > - * @evtlog: pointer to evtlog > - * Returns: none > - */ > -void dpu_evtlog_dump_all(struct dpu_dbg_evtlog *evtlog); > - > -/** > - * dpu_evtlog_is_enabled - check whether log collection is enabled for > given > - * event log and log area flag > - * @evtlog: pointer to evtlog > - * @flag: log area filter flag > - * Returns: none > - */ > -bool dpu_evtlog_is_enabled(struct dpu_dbg_evtlog *evtlog, u32 flag); > - > -/** > - * dpu_evtlog_dump_to_buffer - print content of event log to the given > buffer > - * @evtlog: pointer to evtlog > - * @evtlog_buf: target buffer to print into > - * @evtlog_buf_size: size of target buffer > - * Returns: number of bytes written to buffer > - */ > -ssize_t dpu_evtlog_dump_to_buffer(struct dpu_dbg_evtlog *evtlog, > - char *evtlog_buf, ssize_t evtlog_buf_size); > - > /** > * dpu_dbg_init_dbg_buses - initialize debug bus dumping support for > the chipset > * @hwversion: Chipset revision > @@ -203,7 +41,7 @@ ssize_t dpu_evtlog_dump_to_buffer(struct > dpu_dbg_evtlog *evtlog, > void dpu_dbg_init_dbg_buses(u32 hwversion); > > /** > - * dpu_dbg_init - initialize global dpu debug facilities: evtlog, > regdump > + * dpu_dbg_init - initialize global dpu debug facilities: regdump > * @dev: device handle > * Returns: 0 or -ERROR > */ > @@ -289,24 +127,6 @@ void dpu_dbg_reg_register_dump_range(const char > *base_name, > */ > void dpu_dbg_set_dpu_top_offset(u32 blk_off); > > -/** > - * dpu_evtlog_set_filter - update evtlog filtering > - * @evtlog: pointer to evtlog > - * @filter: pointer to optional function name filter, set to NULL > to disable > - */ > -void dpu_evtlog_set_filter(struct dpu_dbg_evtlog *evtlog, char > *filter); > - > -/** > - * dpu_evtlog_get_filter - query configured evtlog filters > - * @evtlog: pointer to evtlog > - * @index: filter index to retrieve > - * @buf: pointer to output filter buffer > - * @bufsz: size of output filter buffer > - * Returns: zero if a filter string was returned > - */ > -int dpu_evtlog_get_filter(struct dpu_dbg_evtlog *evtlog, int index, > - char *buf, size_t bufsz); > - > /** > * dsi_ctrl_debug_dump - dump dsi debug dump status > */ > @@ -317,35 +137,6 @@ static inline void dsi_ctrl_debug_dump(void) {} > #endif > > #else > -static inline struct dpu_dbg_evtlog *dpu_evtlog_init(void) > -{ > - return NULL; > -} > - > -static inline void dpu_evtlog_destroy(struct dpu_dbg_evtlog *evtlog) > -{ > -} > - > -static inline void dpu_evtlog_log(struct dpu_dbg_evtlog *evtlog, > - const char *name, int line, int flag, ...) > -{ > -} > - > -static inline void dpu_evtlog_dump_all(struct dpu_dbg_evtlog *evtlog) > -{ > -} > - > -static inline bool dpu_evtlog_is_enabled(struct dpu_dbg_evtlog > *evtlog, > - u32 flag) > -{ > - return false; > -} > - > -static inline ssize_t dpu_evtlog_dump_to_buffer(struct dpu_dbg_evtlog > *evtlog, > - char *evtlog_buf, ssize_t evtlog_buf_size) > -{ > - return 0; > -} > > static inline void dpu_dbg_init_dbg_buses(u32 hwversion) > { > @@ -385,17 +176,6 @@ void dpu_dbg_set_dpu_top_offset(u32 blk_off) > { > } > > -static inline void dpu_evtlog_set_filter( > - struct dpu_dbg_evtlog *evtlog, char *filter) > -{ > -} > - > -static inline int dpu_evtlog_get_filter(struct dpu_dbg_evtlog *evtlog, > - int index, char *buf, size_t bufsz) > -{ > - return -EINVAL; > -} > - > static inline void dsi_ctrl_debug_dump(void) > { > } > diff --git a/drivers/gpu/drm/msm/dpu_dbg_evtlog.c > b/drivers/gpu/drm/msm/dpu_dbg_evtlog.c > deleted file mode 100644 > index ef132c015a7e..000000000000 > --- a/drivers/gpu/drm/msm/dpu_dbg_evtlog.c > +++ /dev/null > @@ -1,306 +0,0 @@ > -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. > - * > - * This program is free software; you can redistribute it and/or > modify > - * it under the terms of the GNU General Public License version 2 and > - * only version 2 as published by the Free Software Foundation. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - */ > - > -#define pr_fmt(fmt) "dpu_dbg:[%s] " fmt, __func__ > - > -#include <linux/delay.h> > -#include <linux/spinlock.h> > -#include <linux/ktime.h> > -#include <linux/debugfs.h> > -#include <linux/uaccess.h> > -#include <linux/dma-buf.h> > -#include <linux/slab.h> > - > -#include "dpu_dbg.h" > -#include "dpu_trace.h" > - > -#define DPU_EVTLOG_FILTER_STRSIZE 64 > - > -struct dpu_evtlog_filter { > - struct list_head list; > - char filter[DPU_EVTLOG_FILTER_STRSIZE]; > -}; > - > -static bool _dpu_evtlog_is_filtered_no_lock( > - struct dpu_dbg_evtlog *evtlog, const char *str) > -{ > - struct dpu_evtlog_filter *filter_node; > - bool rc; > - > - if (!str) > - return true; > - > - /* > - * Filter the incoming string IFF the list is not empty AND > - * a matching entry is not in the list. > - */ > - rc = !list_empty(&evtlog->filter_list); > - list_for_each_entry(filter_node, &evtlog->filter_list, list) > - if (strnstr(str, filter_node->filter, > - DPU_EVTLOG_FILTER_STRSIZE - 1)) { > - rc = false; > - break; > - } > - > - return rc; > -} > - > -bool dpu_evtlog_is_enabled(struct dpu_dbg_evtlog *evtlog, u32 flag) > -{ > - return evtlog && (evtlog->enable & flag); > -} > - > -void dpu_evtlog_log(struct dpu_dbg_evtlog *evtlog, const char *name, > int line, > - int flag, ...) > -{ > - unsigned long flags; > - int i, val = 0; > - va_list args; > - struct dpu_dbg_evtlog_log *log; > - > - if (!evtlog) > - return; > - > - if (!dpu_evtlog_is_enabled(evtlog, flag)) > - return; > - > - spin_lock_irqsave(&evtlog->spin_lock, flags); > - > - if (_dpu_evtlog_is_filtered_no_lock(evtlog, name)) > - goto exit; > - > - log = &evtlog->logs[evtlog->curr]; > - log->time = ktime_to_us(ktime_get()); > - log->name = name; > - log->line = line; > - log->data_cnt = 0; > - log->pid = current->pid; > - > - va_start(args, flag); > - for (i = 0; i < DPU_EVTLOG_MAX_DATA; i++) { > - > - val = va_arg(args, int); > - if (val == DPU_EVTLOG_DATA_LIMITER) > - break; > - > - log->data[i] = val; > - } > - va_end(args); > - log->data_cnt = i; > - evtlog->curr = (evtlog->curr + 1) % DPU_EVTLOG_ENTRY; > - evtlog->last++; > - > - trace_dpu_evtlog(name, line, log->data_cnt, log->data); > -exit: > - spin_unlock_irqrestore(&evtlog->spin_lock, flags); > -} > - > -/* always dump the last entries which are not dumped yet */ > -static bool _dpu_evtlog_dump_calc_range(struct dpu_dbg_evtlog *evtlog) > -{ > - if (!evtlog) > - return false; > - > - evtlog->first = evtlog->next; > - > - if (evtlog->last == evtlog->first) > - return false; > - > - if (evtlog->last < evtlog->first) { > - evtlog->first %= DPU_EVTLOG_ENTRY; > - if (evtlog->last < evtlog->first) > - evtlog->last += DPU_EVTLOG_ENTRY; > - } > - > - if ((evtlog->last - evtlog->first) > DPU_EVTLOG_PRINT_ENTRY) { > - pr_info("evtlog skipping %d entries, last=%d\n", > - evtlog->last - evtlog->first - DPU_EVTLOG_PRINT_ENTRY, > - evtlog->last - 1); > - evtlog->first = evtlog->last - DPU_EVTLOG_PRINT_ENTRY; > - } > - evtlog->next = evtlog->first + 1; > - > - return true; > -} > - > -ssize_t dpu_evtlog_dump_to_buffer(struct dpu_dbg_evtlog *evtlog, > - char *evtlog_buf, ssize_t evtlog_buf_size) > -{ > - int i; > - ssize_t off = 0; > - struct dpu_dbg_evtlog_log *log, *prev_log; > - unsigned long flags; > - > - if (!evtlog || !evtlog_buf) > - return 0; > - > - spin_lock_irqsave(&evtlog->spin_lock, flags); > - > - /* update markers, exit if nothing to print */ > - if (!_dpu_evtlog_dump_calc_range(evtlog)) > - goto exit; > - > - log = &evtlog->logs[evtlog->first % DPU_EVTLOG_ENTRY]; > - > - prev_log = &evtlog->logs[(evtlog->first - 1) % DPU_EVTLOG_ENTRY]; > - > - off = snprintf((evtlog_buf + off), (evtlog_buf_size - off), > "%s:%-4d", > - log->name, log->line); > - > - if (off < DPU_EVTLOG_BUF_ALIGN) { > - memset((evtlog_buf + off), 0x20, (DPU_EVTLOG_BUF_ALIGN - off)); > - off = DPU_EVTLOG_BUF_ALIGN; > - } > - > - off += snprintf((evtlog_buf + off), (evtlog_buf_size - off), > - "=>[%-8d:%-11llu:%9llu][%-4d]:", evtlog->first, > - log->time, (log->time - prev_log->time), log->pid); > - > - for (i = 0; i < log->data_cnt; i++) > - off += snprintf((evtlog_buf + off), (evtlog_buf_size - off), > - "%x ", log->data[i]); > - > - off += snprintf((evtlog_buf + off), (evtlog_buf_size - off), "\n"); > -exit: > - spin_unlock_irqrestore(&evtlog->spin_lock, flags); > - > - return off; > -} > - > -void dpu_evtlog_dump_all(struct dpu_dbg_evtlog *evtlog) > -{ > - char buf[DPU_EVTLOG_BUF_MAX]; > - > - if (!evtlog) > - return; > - > - while (dpu_evtlog_dump_to_buffer(evtlog, buf, sizeof(buf))) > - pr_info("%s", buf); > -} > - > -struct dpu_dbg_evtlog *dpu_evtlog_init(void) > -{ > - struct dpu_dbg_evtlog *evtlog; > - > - evtlog = kzalloc(sizeof(*evtlog), GFP_KERNEL); > - if (!evtlog) > - return ERR_PTR(-ENOMEM); > - > - spin_lock_init(&evtlog->spin_lock); > - evtlog->enable = DPU_EVTLOG_DEFAULT_ENABLE; > - > - INIT_LIST_HEAD(&evtlog->filter_list); > - > - return evtlog; > -} > - > -int dpu_evtlog_get_filter(struct dpu_dbg_evtlog *evtlog, int index, > - char *buf, size_t bufsz) > -{ > - struct dpu_evtlog_filter *filter_node; > - unsigned long flags; > - int rc = -EFAULT; > - > - if (!evtlog || !buf || !bufsz || index < 0) > - return -EINVAL; > - > - spin_lock_irqsave(&evtlog->spin_lock, flags); > - list_for_each_entry(filter_node, &evtlog->filter_list, list) { > - if (index--) > - continue; > - > - /* don't care about return value */ > - (void)strlcpy(buf, filter_node->filter, bufsz); > - rc = 0; > - break; > - } > - spin_unlock_irqrestore(&evtlog->spin_lock, flags); > - > - return rc; > -} > - > -void dpu_evtlog_set_filter(struct dpu_dbg_evtlog *evtlog, char > *filter) > -{ > - struct dpu_evtlog_filter *filter_node, *tmp; > - struct list_head free_list; > - unsigned long flags; > - char *flt; > - > - if (!evtlog) > - return; > - > - INIT_LIST_HEAD(&free_list); > - > - /* > - * Clear active filter list and cache filter_nodes locally > - * to reduce memory fragmentation. > - */ > - spin_lock_irqsave(&evtlog->spin_lock, flags); > - list_for_each_entry_safe(filter_node, tmp, &evtlog->filter_list, > list) { > - list_del_init(&filter_node->list); > - list_add_tail(&filter_node->list, &free_list); > - } > - spin_unlock_irqrestore(&evtlog->spin_lock, flags); > - > - /* > - * Parse incoming filter request string and build up a new > - * filter list. New filter nodes are taken from the local > - * free list, if available, and allocated from the system > - * heap once the free list is empty. > - */ > - while (filter && (flt = strsep(&filter, "|\r\n\t ")) != NULL) { > - if (!*flt) > - continue; > - > - if (list_empty(&free_list)) { > - filter_node = kzalloc(sizeof(*filter_node), GFP_KERNEL); > - if (!filter_node) > - break; > - > - INIT_LIST_HEAD(&filter_node->list); > - } else { > - filter_node = list_first_entry(&free_list, > - struct dpu_evtlog_filter, list); > - list_del_init(&filter_node->list); > - } > - > - /* don't care if copy truncated */ > - (void)strlcpy(filter_node->filter, flt, > - DPU_EVTLOG_FILTER_STRSIZE); > - > - spin_lock_irqsave(&evtlog->spin_lock, flags); > - list_add_tail(&filter_node->list, &evtlog->filter_list); > - spin_unlock_irqrestore(&evtlog->spin_lock, flags); > - } > - > - /* > - * Free any unused filter_nodes back to the system. > - */ > - list_for_each_entry_safe(filter_node, tmp, &free_list, list) { > - list_del(&filter_node->list); > - kfree(filter_node); > - } > -} > - > -void dpu_evtlog_destroy(struct dpu_dbg_evtlog *evtlog) > -{ > - struct dpu_evtlog_filter *filter_node, *tmp; > - > - if (!evtlog) > - return; > - > - list_for_each_entry_safe(filter_node, tmp, &evtlog->filter_list, > list) { > - list_del(&filter_node->list); > - kfree(filter_node); > - } > - kfree(evtlog); > -} -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile index dc56904367d8..9c182a9dab2b 100644 --- a/drivers/gpu/drm/msm/Makefile +++ b/drivers/gpu/drm/msm/Makefile @@ -75,7 +75,6 @@ msm-y := \ disp/dpu1/dpu_mdss.o \ disp/dpu1/dpu_power_handle.o \ dpu_dbg.o \ - dpu_dbg_evtlog.o \ msm_prop.o \ msm_atomic.o \ msm_debugfs.o \ diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c index 6ae5bba21074..4fd5e1d7261e 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c @@ -43,11 +43,6 @@ static const char * const iommu_ports[] = { "mdp_0", }; -/** - * Controls size of event log buffer. Specified as a power of 2. - */ -#define DPU_EVTLOG_SIZE 1024 - /* * To enable overall DRM driver logging * # echo 0x2 > /sys/module/drm/parameters/debug diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h index d6f117bdad24..41fd6a227d8b 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h @@ -165,39 +165,6 @@ TRACE_EVENT(dpu_trace_counter, __get_str(counter_name), __entry->value) ) -#define DPU_TRACE_EVTLOG_SIZE 15 -TRACE_EVENT(dpu_evtlog, - TP_PROTO(const char *tag, u32 tag_id, u32 cnt, u32 data[]), - TP_ARGS(tag, tag_id, cnt, data), - TP_STRUCT__entry( - __field(int, pid) - __string(evtlog_tag, tag) - __field(u32, tag_id) - __array(u32, data, DPU_TRACE_EVTLOG_SIZE) - ), - TP_fast_assign( - __entry->pid = current->tgid; - __assign_str(evtlog_tag, tag); - __entry->tag_id = tag_id; - if (cnt > DPU_TRACE_EVTLOG_SIZE) - cnt = DPU_TRACE_EVTLOG_SIZE; - memcpy(__entry->data, data, cnt * sizeof(u32)); - memset(&__entry->data[cnt], 0, - (DPU_TRACE_EVTLOG_SIZE - cnt) * sizeof(u32)); - ), - TP_printk("%d|%s:%d|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x|%x", - __entry->pid, __get_str(evtlog_tag), - __entry->tag_id, - __entry->data[0], __entry->data[1], - __entry->data[2], __entry->data[3], - __entry->data[4], __entry->data[5], - __entry->data[6], __entry->data[7], - __entry->data[8], __entry->data[9], - __entry->data[10], __entry->data[11], - __entry->data[12], __entry->data[13], - __entry->data[14]) -) - TRACE_EVENT(dpu_perf_crtc_update, TP_PROTO(u32 crtc, u64 bw_ctl_mnoc, u64 bw_ctl_llcc, u64 bw_ctl_ebi, u32 core_clk_rate, diff --git a/drivers/gpu/drm/msm/dpu_dbg.c b/drivers/gpu/drm/msm/dpu_dbg.c index 27538bc6c290..9495a0f17f1b 100644 --- a/drivers/gpu/drm/msm/dpu_dbg.c +++ b/drivers/gpu/drm/msm/dpu_dbg.c @@ -165,7 +165,6 @@ struct dpu_dbg_vbif_debug_bus { /** * struct dpu_dbg_base - global dpu debug base structure - * @evtlog: event log instance * @reg_base_list: list of register dumping regions * @dev: device pointer * @req_dump_blks: list of blocks requested for dumping @@ -179,7 +178,6 @@ struct dpu_dbg_vbif_debug_bus { * @dsi_dbg_bus: dump dsi debug bus register */ static struct dpu_dbg_base { - struct dpu_dbg_evtlog *evtlog; struct list_head reg_base_list; struct device *dev; @@ -196,9 +194,6 @@ static struct dpu_dbg_base { bool dsi_dbg_bus; } dpu_dbg_base; -/* dpu_dbg_base_evtlog - global pointer to main dpu event log for macro use */ -struct dpu_dbg_evtlog *dpu_dbg_base_evtlog; - static void _dpu_debug_bus_xbar_dump(void __iomem *mem_base, struct dpu_debug_bus_entry *entry, u32 val) { @@ -2526,8 +2521,6 @@ static void _dpu_dump_array(struct dpu_dbg_reg_base *blk_arr[], { int i; - dpu_evtlog_dump_all(dpu_dbg_base.evtlog); - if (dump_all || !blk_arr || !len) { _dpu_dump_reg_all(); } else { @@ -2556,7 +2549,7 @@ static void _dpu_dump_work(struct work_struct *work) { _dpu_dump_array(dpu_dbg_base.req_dump_blks, ARRAY_SIZE(dpu_dbg_base.req_dump_blks), - dpu_dbg_base.work_panic, "evtlog_workitem", + dpu_dbg_base.work_panic, "dpudump_workitem", dpu_dbg_base.dbgbus_dpu.cmn.include_in_deferred_work, dpu_dbg_base.dbgbus_vbif_rt.cmn.include_in_deferred_work, dpu_dbg_base.dump_all); @@ -2564,7 +2557,7 @@ static void _dpu_dump_work(struct work_struct *work) void dpu_dbg_dump(bool queue_work, const char *name, ...) { - int i, index = 0; + int index = 0; bool do_panic = false; bool dump_dbgbus_dpu = false; bool dump_dbgbus_vbif_rt = false; @@ -2575,9 +2568,6 @@ void dpu_dbg_dump(bool queue_work, const char *name, ...) struct dpu_dbg_reg_base **blk_arr; u32 blk_len; - if (!dpu_evtlog_is_enabled(dpu_dbg_base.evtlog, DPU_EVTLOG_ALWAYS)) - return; - if (queue_work && work_pending(&dpu_dbg_base.dump_work)) return; @@ -2589,12 +2579,7 @@ void dpu_dbg_dump(bool queue_work, const char *name, ...) dpu_dbg_base.dump_all = false; va_start(args, name); - i = 0; while ((blk_name = va_arg(args, char*))) { - if (i++ >= DPU_EVTLOG_MAX_DATA) { - pr_err("could not parse all dump arguments\n"); - break; - } if (IS_ERR_OR_NULL(blk_name)) break; @@ -2641,7 +2626,7 @@ void dpu_dbg_dump(bool queue_work, const char *name, ...) } /* - * dpu_dbg_debugfs_open - debugfs open handler for evtlog dump + * dpu_dbg_debugfs_open - debugfs open handler for debug dump * @inode: debugfs inode * @file: file handle */ @@ -2654,35 +2639,13 @@ static int dpu_dbg_debugfs_open(struct inode *inode, struct file *file) } /** - * dpu_evtlog_dump_read - debugfs read handler for evtlog dump - * @file: file handler - * @buff: user buffer content for debugfs - * @count: size of user buffer - * @ppos: position offset of user buffer - */ -static ssize_t dpu_evtlog_dump_read(struct file *file, char __user *buff, - size_t count, loff_t *ppos) -{ - ssize_t len = 0; - char evtlog_buf[DPU_EVTLOG_BUF_MAX]; - - len = dpu_evtlog_dump_to_buffer(dpu_dbg_base.evtlog, evtlog_buf, - DPU_EVTLOG_BUF_MAX); - if (copy_to_user(buff, evtlog_buf, len)) - return -EFAULT; - *ppos += len; - - return len; -} - -/** - * dpu_evtlog_dump_write - debugfs write handler for evtlog dump + * dpu_dbg_dump_write - debugfs write handler for debug dump * @file: file handler * @user_buf: user buffer content from debugfs * @count: size of user buffer * @ppos: position offset of user buffer */ -static ssize_t dpu_evtlog_dump_write(struct file *file, +static ssize_t dpu_dbg_dump_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { _dpu_dump_array(NULL, 0, dpu_dbg_base.panic_on_err, "dump_debugfs", @@ -2691,86 +2654,9 @@ static ssize_t dpu_evtlog_dump_write(struct file *file, return count; } -static const struct file_operations dpu_evtlog_fops = { +static const struct file_operations dpu_dbg_dump_fops = { .open = dpu_dbg_debugfs_open, - .read = dpu_evtlog_dump_read, - .write = dpu_evtlog_dump_write, -}; - -/* - * dpu_evtlog_filter_show - read callback for evtlog filter - * @s: pointer to seq_file object - * @data: pointer to private data - */ -static int dpu_evtlog_filter_show(struct seq_file *s, void *data) -{ - struct dpu_dbg_evtlog *evtlog; - char buffer[64]; - int i; - - if (!s || !s->private) - return -EINVAL; - - evtlog = s->private; - - for (i = 0; !dpu_evtlog_get_filter( - evtlog, i, buffer, ARRAY_SIZE(buffer)); ++i) - seq_printf(s, "*%s*\n", buffer); - return 0; -} - -/* - * dpu_evtlog_filter_open - debugfs open handler for evtlog filter - * @inode: debugfs inode - * @file: file handle - * Returns: zero on success - */ -static int dpu_evtlog_filter_open(struct inode *inode, struct file *file) -{ - if (!file) - return -EINVAL; - - return single_open(file, dpu_evtlog_filter_show, inode->i_private); -} - -/* - * dpu_evtlog_filter_write - write callback for evtlog filter - * @file: pointer to file structure - * @user_buf: pointer to incoming user data - * @count: size of incoming user buffer - * @ppos: pointer to file offset - */ -static ssize_t dpu_evtlog_filter_write(struct file *file, - const char __user *user_buf, size_t count, loff_t *ppos) -{ - char *tmp_filter = NULL; - ssize_t rc = 0; - - if (count > 0) { - /* copy user provided string and null terminate it */ - tmp_filter = kzalloc(count + 1, GFP_KERNEL); - if (!tmp_filter) - rc = -ENOMEM; - else if (copy_from_user(tmp_filter, user_buf, count)) - rc = -EFAULT; - } - - /* update actual filter configuration on success */ - if (!rc) { - dpu_evtlog_set_filter(dpu_dbg_base.evtlog, tmp_filter); - rc = count; - } - kfree(tmp_filter); - - return rc; -} - -static const struct file_operations dpu_evtlog_filter_fops = { - .open = dpu_evtlog_filter_open, - .write = dpu_evtlog_filter_write, - .read = seq_read, - .llseek = seq_lseek, - .release = seq_release + .write = dpu_dbg_dump_write, }; /** @@ -3018,12 +2904,7 @@ int dpu_dbg_debugfs_register(struct dentry *debugfs_root) return -EINVAL; debugfs_create_file("dump", 0600, debugfs_root, NULL, - &dpu_evtlog_fops); - debugfs_create_u32("enable", 0600, debugfs_root, - &(dpu_dbg_base.evtlog->enable)); - debugfs_create_file("filter", 0600, debugfs_root, - dpu_dbg_base.evtlog, - &dpu_evtlog_filter_fops); + &dpu_dbg_dump_fops); debugfs_create_u32("panic", 0600, debugfs_root, &dpu_dbg_base.panic_on_err); debugfs_create_u32("reg_dump", 0600, debugfs_root, @@ -3106,19 +2987,12 @@ int dpu_dbg_init(struct device *dev) INIT_LIST_HEAD(&dpu_dbg_base.reg_base_list); dpu_dbg_base.dev = dev; - dpu_dbg_base.evtlog = dpu_evtlog_init(); - if (IS_ERR_OR_NULL(dpu_dbg_base.evtlog)) - return PTR_ERR(dpu_dbg_base.evtlog); - - dpu_dbg_base_evtlog = dpu_dbg_base.evtlog; - INIT_WORK(&dpu_dbg_base.dump_work, _dpu_dump_work); dpu_dbg_base.work_panic = false; dpu_dbg_base.panic_on_err = DEFAULT_PANIC; dpu_dbg_base.enable_reg_dump = DEFAULT_REGDUMP; - pr_info("evtlog_status: enable:%d, panic:%d, dump:%d\n", - dpu_dbg_base.evtlog->enable, dpu_dbg_base.panic_on_err, + pr_info("debug_status: panic:%d, dump:%d\n", dpu_dbg_base.panic_on_err, dpu_dbg_base.enable_reg_dump); return 0; @@ -3150,9 +3024,6 @@ static void dpu_dbg_reg_base_destroy(void) void dpu_dbg_destroy(void) { _dpu_dbg_debugfs_destroy(); - dpu_dbg_base_evtlog = NULL; - dpu_evtlog_destroy(dpu_dbg_base.evtlog); - dpu_dbg_base.evtlog = NULL; dpu_dbg_reg_base_destroy(); } diff --git a/drivers/gpu/drm/msm/dpu_dbg.h b/drivers/gpu/drm/msm/dpu_dbg.h index 283dbbc00690..052c78d5b4f5 100644 --- a/drivers/gpu/drm/msm/dpu_dbg.h +++ b/drivers/gpu/drm/msm/dpu_dbg.h @@ -17,109 +17,11 @@ #include <linux/debugfs.h> #include <linux/list.h> -#define DPU_EVTLOG_DATA_LIMITER (-1) -#define DPU_EVTLOG_FUNC_ENTRY 0x1111 -#define DPU_EVTLOG_FUNC_EXIT 0x2222 -#define DPU_EVTLOG_FUNC_CASE1 0x3333 -#define DPU_EVTLOG_FUNC_CASE2 0x4444 -#define DPU_EVTLOG_FUNC_CASE3 0x5555 -#define DPU_EVTLOG_FUNC_CASE4 0x6666 -#define DPU_EVTLOG_FUNC_CASE5 0x7777 -#define DPU_EVTLOG_FUNC_CASE6 0x8888 -#define DPU_EVTLOG_FUNC_CASE7 0x9999 -#define DPU_EVTLOG_FUNC_CASE8 0xaaaa -#define DPU_EVTLOG_FUNC_CASE9 0xbbbb -#define DPU_EVTLOG_FUNC_CASE10 0xcccc -#define DPU_EVTLOG_PANIC 0xdead -#define DPU_EVTLOG_FATAL 0xbad -#define DPU_EVTLOG_ERROR 0xebad - -#define DPU_DBG_DUMP_DATA_LIMITER (NULL) - -enum dpu_dbg_evtlog_flag { - DPU_EVTLOG_CRITICAL = BIT(0), - DPU_EVTLOG_IRQ = BIT(1), - DPU_EVTLOG_VERBOSE = BIT(2), - DPU_EVTLOG_ALWAYS = -1 -}; - enum dpu_dbg_dump_flag { DPU_DBG_DUMP_IN_LOG = BIT(0), DPU_DBG_DUMP_IN_MEM = BIT(1), }; -#ifdef CONFIG_DRM_DPU_EVTLOG_DEBUG -#define DPU_EVTLOG_DEFAULT_ENABLE (DPU_EVTLOG_CRITICAL | DPU_EVTLOG_IRQ) -#else -#define DPU_EVTLOG_DEFAULT_ENABLE 0 -#endif - -/* - * evtlog will print this number of entries when it is called through - * sysfs node or panic. This prevents kernel log from evtlog message - * flood. - */ -#define DPU_EVTLOG_PRINT_ENTRY 256 - -/* - * evtlog keeps this number of entries in memory for debug purpose. This - * number must be greater than print entry to prevent out of bound evtlog - * entry array access. - */ -#define DPU_EVTLOG_ENTRY (DPU_EVTLOG_PRINT_ENTRY * 4) -#define DPU_EVTLOG_MAX_DATA 15 -#define DPU_EVTLOG_BUF_MAX 512 -#define DPU_EVTLOG_BUF_ALIGN 32 - -struct dpu_dbg_evtlog_log { - s64 time; - const char *name; - int line; - u32 data[DPU_EVTLOG_MAX_DATA]; - u32 data_cnt; - int pid; -}; - -/** - * @filter_list: Linked list of currently active filter strings - */ -struct dpu_dbg_evtlog { - struct dpu_dbg_evtlog_log logs[DPU_EVTLOG_ENTRY]; - u32 first; - u32 last; - u32 curr; - u32 next; - u32 enable; - spinlock_t spin_lock; - struct list_head filter_list; -}; - -extern struct dpu_dbg_evtlog *dpu_dbg_base_evtlog; - -/** - * DPU_EVT32 - Write a list of 32bit values to the event log, default area - * ... - variable arguments - */ -#define DPU_EVT32(...) dpu_evtlog_log(dpu_dbg_base_evtlog, __func__, \ - __LINE__, DPU_EVTLOG_ALWAYS, ##__VA_ARGS__, \ - DPU_EVTLOG_DATA_LIMITER) - -/** - * DPU_EVT32_VERBOSE - Write a list of 32bit values for verbose event logging - * ... - variable arguments - */ -#define DPU_EVT32_VERBOSE(...) dpu_evtlog_log(dpu_dbg_base_evtlog, __func__, \ - __LINE__, DPU_EVTLOG_VERBOSE, ##__VA_ARGS__, \ - DPU_EVTLOG_DATA_LIMITER) - -/** - * DPU_EVT32_IRQ - Write a list of 32bit values to the event log, IRQ area - * ... - variable arguments - */ -#define DPU_EVT32_IRQ(...) dpu_evtlog_log(dpu_dbg_base_evtlog, __func__, \ - __LINE__, DPU_EVTLOG_IRQ, ##__VA_ARGS__, \ - DPU_EVTLOG_DATA_LIMITER) - /** * DPU_DBG_DUMP - trigger dumping of all dpu_dbg facilities * @va_args: list of named register dump ranges and regions to dump, as @@ -128,74 +30,10 @@ extern struct dpu_dbg_evtlog *dpu_dbg_base_evtlog; * Including the special name "panic" will trigger a panic after * the dumping work has completed. */ -#define DPU_DBG_DUMP(...) dpu_dbg_dump(false, __func__, ##__VA_ARGS__, \ - DPU_DBG_DUMP_DATA_LIMITER) - -/** - * DPU_DBG_DUMP_WQ - trigger dumping of all dpu_dbg facilities, queuing the work - * @va_args: list of named register dump ranges and regions to dump, as - * registered previously through dpu_dbg_reg_register_base and - * dpu_dbg_reg_register_dump_range. - * Including the special name "panic" will trigger a panic after - * the dumping work has completed. - */ -#define DPU_DBG_DUMP_WQ(...) dpu_dbg_dump(true, __func__, ##__VA_ARGS__, \ - DPU_DBG_DUMP_DATA_LIMITER) +#define DPU_DBG_DUMP(...) dpu_dbg_dump(false, __func__, ##__VA_ARGS__, NULL) #if defined(CONFIG_DEBUG_FS) -/** - * dpu_evtlog_init - allocate a new event log object - * Returns: evtlog or -ERROR - */ -struct dpu_dbg_evtlog *dpu_evtlog_init(void); - -/** - * dpu_evtlog_destroy - destroy previously allocated event log - * @evtlog: pointer to evtlog - * Returns: none - */ -void dpu_evtlog_destroy(struct dpu_dbg_evtlog *evtlog); - -/** - * dpu_evtlog_log - log an entry into the event log. - * log collection may be enabled/disabled entirely via debugfs - * log area collection may be filtered by user provided flags via debugfs. - * @evtlog: pointer to evtlog - * @name: function name of call site - * @line: line number of call site - * @flag: log area filter flag checked against user's debugfs request - * Returns: none - */ -void dpu_evtlog_log(struct dpu_dbg_evtlog *evtlog, const char *name, int line, - int flag, ...); - -/** - * dpu_evtlog_dump_all - print all entries in event log to kernel log - * @evtlog: pointer to evtlog - * Returns: none - */ -void dpu_evtlog_dump_all(struct dpu_dbg_evtlog *evtlog); - -/** - * dpu_evtlog_is_enabled - check whether log collection is enabled for given - * event log and log area flag - * @evtlog: pointer to evtlog - * @flag: log area filter flag - * Returns: none - */ -bool dpu_evtlog_is_enabled(struct dpu_dbg_evtlog *evtlog, u32 flag); - -/** - * dpu_evtlog_dump_to_buffer - print content of event log to the given buffer - * @evtlog: pointer to evtlog - * @evtlog_buf: target buffer to print into - * @evtlog_buf_size: size of target buffer - * Returns: number of bytes written to buffer - */ -ssize_t dpu_evtlog_dump_to_buffer(struct dpu_dbg_evtlog *evtlog, - char *evtlog_buf, ssize_t evtlog_buf_size); - /** * dpu_dbg_init_dbg_buses - initialize debug bus dumping support for the chipset * @hwversion: Chipset revision @@ -203,7 +41,7 @@ ssize_t dpu_evtlog_dump_to_buffer(struct dpu_dbg_evtlog *evtlog, void dpu_dbg_init_dbg_buses(u32 hwversion); /** - * dpu_dbg_init - initialize global dpu debug facilities: evtlog, regdump + * dpu_dbg_init - initialize global dpu debug facilities: regdump * @dev: device handle * Returns: 0 or -ERROR */ @@ -289,24 +127,6 @@ void dpu_dbg_reg_register_dump_range(const char *base_name, */ void dpu_dbg_set_dpu_top_offset(u32 blk_off); -/** - * dpu_evtlog_set_filter - update evtlog filtering - * @evtlog: pointer to evtlog - * @filter: pointer to optional function name filter, set to NULL to disable - */ -void dpu_evtlog_set_filter(struct dpu_dbg_evtlog *evtlog, char *filter); - -/** - * dpu_evtlog_get_filter - query configured evtlog filters - * @evtlog: pointer to evtlog - * @index: filter index to retrieve - * @buf: pointer to output filter buffer - * @bufsz: size of output filter buffer - * Returns: zero if a filter string was returned - */ -int dpu_evtlog_get_filter(struct dpu_dbg_evtlog *evtlog, int index, - char *buf, size_t bufsz); - /** * dsi_ctrl_debug_dump - dump dsi debug dump status */ @@ -317,35 +137,6 @@ static inline void dsi_ctrl_debug_dump(void) {} #endif #else -static inline struct dpu_dbg_evtlog *dpu_evtlog_init(void) -{ - return NULL; -} - -static inline void dpu_evtlog_destroy(struct dpu_dbg_evtlog *evtlog) -{ -} - -static inline void dpu_evtlog_log(struct dpu_dbg_evtlog *evtlog, - const char *name, int line, int flag, ...) -{ -} - -static inline void dpu_evtlog_dump_all(struct dpu_dbg_evtlog *evtlog) -{ -} - -static inline bool dpu_evtlog_is_enabled(struct dpu_dbg_evtlog *evtlog, - u32 flag) -{ - return false; -} - -static inline ssize_t dpu_evtlog_dump_to_buffer(struct dpu_dbg_evtlog *evtlog, - char *evtlog_buf, ssize_t evtlog_buf_size) -{ - return 0; -} static inline void dpu_dbg_init_dbg_buses(u32 hwversion) { @@ -385,17 +176,6 @@ void dpu_dbg_set_dpu_top_offset(u32 blk_off) { } -static inline void dpu_evtlog_set_filter( - struct dpu_dbg_evtlog *evtlog, char *filter) -{ -} - -static inline int dpu_evtlog_get_filter(struct dpu_dbg_evtlog *evtlog, - int index, char *buf, size_t bufsz) -{ - return -EINVAL; -} - static inline void dsi_ctrl_debug_dump(void) { } diff --git a/drivers/gpu/drm/msm/dpu_dbg_evtlog.c b/drivers/gpu/drm/msm/dpu_dbg_evtlog.c deleted file mode 100644 index ef132c015a7e..000000000000 --- a/drivers/gpu/drm/msm/dpu_dbg_evtlog.c +++ /dev/null @@ -1,306 +0,0 @@ -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) "dpu_dbg:[%s] " fmt, __func__ - -#include <linux/delay.h> -#include <linux/spinlock.h> -#include <linux/ktime.h> -#include <linux/debugfs.h> -#include <linux/uaccess.h> -#include <linux/dma-buf.h> -#include <linux/slab.h> - -#include "dpu_dbg.h" -#include "dpu_trace.h" - -#define DPU_EVTLOG_FILTER_STRSIZE 64 - -struct dpu_evtlog_filter { - struct list_head list; - char filter[DPU_EVTLOG_FILTER_STRSIZE]; -}; - -static bool _dpu_evtlog_is_filtered_no_lock( - struct dpu_dbg_evtlog *evtlog, const char *str) -{ - struct dpu_evtlog_filter *filter_node; - bool rc; - - if (!str) - return true; - - /* - * Filter the incoming string IFF the list is not empty AND - * a matching entry is not in the list. - */ - rc = !list_empty(&evtlog->filter_list); - list_for_each_entry(filter_node, &evtlog->filter_list, list) - if (strnstr(str, filter_node->filter, - DPU_EVTLOG_FILTER_STRSIZE - 1)) { - rc = false; - break; - } - - return rc; -} - -bool dpu_evtlog_is_enabled(struct dpu_dbg_evtlog *evtlog, u32 flag) -{ - return evtlog && (evtlog->enable & flag); -} - -void dpu_evtlog_log(struct dpu_dbg_evtlog *evtlog, const char *name, int line, - int flag, ...) -{ - unsigned long flags; - int i, val = 0; - va_list args; - struct dpu_dbg_evtlog_log *log; - - if (!evtlog) - return; - - if (!dpu_evtlog_is_enabled(evtlog, flag)) - return; - - spin_lock_irqsave(&evtlog->spin_lock, flags); - - if (_dpu_evtlog_is_filtered_no_lock(evtlog, name)) - goto exit; - - log = &evtlog->logs[evtlog->curr]; - log->time = ktime_to_us(ktime_get()); - log->name = name; - log->line = line; - log->data_cnt = 0; - log->pid = current->pid; - - va_start(args, flag); - for (i = 0; i < DPU_EVTLOG_MAX_DATA; i++) { - - val = va_arg(args, int); - if (val == DPU_EVTLOG_DATA_LIMITER) - break; - - log->data[i] = val; - } - va_end(args); - log->data_cnt = i; - evtlog->curr = (evtlog->curr + 1) % DPU_EVTLOG_ENTRY; - evtlog->last++; - - trace_dpu_evtlog(name, line, log->data_cnt, log->data); -exit: - spin_unlock_irqrestore(&evtlog->spin_lock, flags); -} - -/* always dump the last entries which are not dumped yet */ -static bool _dpu_evtlog_dump_calc_range(struct dpu_dbg_evtlog *evtlog) -{ - if (!evtlog) - return false; - - evtlog->first = evtlog->next; - - if (evtlog->last == evtlog->first) - return false; - - if (evtlog->last < evtlog->first) { - evtlog->first %= DPU_EVTLOG_ENTRY; - if (evtlog->last < evtlog->first) - evtlog->last += DPU_EVTLOG_ENTRY; - } - - if ((evtlog->last - evtlog->first) > DPU_EVTLOG_PRINT_ENTRY) { - pr_info("evtlog skipping %d entries, last=%d\n", - evtlog->last - evtlog->first - DPU_EVTLOG_PRINT_ENTRY, - evtlog->last - 1); - evtlog->first = evtlog->last - DPU_EVTLOG_PRINT_ENTRY; - } - evtlog->next = evtlog->first + 1; - - return true; -} - -ssize_t dpu_evtlog_dump_to_buffer(struct dpu_dbg_evtlog *evtlog, - char *evtlog_buf, ssize_t evtlog_buf_size) -{ - int i; - ssize_t off = 0; - struct dpu_dbg_evtlog_log *log, *prev_log; - unsigned long flags; - - if (!evtlog || !evtlog_buf) - return 0; - - spin_lock_irqsave(&evtlog->spin_lock, flags); - - /* update markers, exit if nothing to print */ - if (!_dpu_evtlog_dump_calc_range(evtlog)) - goto exit; - - log = &evtlog->logs[evtlog->first % DPU_EVTLOG_ENTRY]; - - prev_log = &evtlog->logs[(evtlog->first - 1) % DPU_EVTLOG_ENTRY]; - - off = snprintf((evtlog_buf + off), (evtlog_buf_size - off), "%s:%-4d", - log->name, log->line); - - if (off < DPU_EVTLOG_BUF_ALIGN) { - memset((evtlog_buf + off), 0x20, (DPU_EVTLOG_BUF_ALIGN - off)); - off = DPU_EVTLOG_BUF_ALIGN; - } - - off += snprintf((evtlog_buf + off), (evtlog_buf_size - off), - "=>[%-8d:%-11llu:%9llu][%-4d]:", evtlog->first, - log->time, (log->time - prev_log->time), log->pid); - - for (i = 0; i < log->data_cnt; i++) - off += snprintf((evtlog_buf + off), (evtlog_buf_size - off), - "%x ", log->data[i]); - - off += snprintf((evtlog_buf + off), (evtlog_buf_size - off), "\n"); -exit: - spin_unlock_irqrestore(&evtlog->spin_lock, flags); - - return off; -} - -void dpu_evtlog_dump_all(struct dpu_dbg_evtlog *evtlog) -{ - char buf[DPU_EVTLOG_BUF_MAX]; - - if (!evtlog) - return; - - while (dpu_evtlog_dump_to_buffer(evtlog, buf, sizeof(buf))) - pr_info("%s", buf); -} - -struct dpu_dbg_evtlog *dpu_evtlog_init(void) -{ - struct dpu_dbg_evtlog *evtlog; - - evtlog = kzalloc(sizeof(*evtlog), GFP_KERNEL); - if (!evtlog) - return ERR_PTR(-ENOMEM); - - spin_lock_init(&evtlog->spin_lock); - evtlog->enable = DPU_EVTLOG_DEFAULT_ENABLE; - - INIT_LIST_HEAD(&evtlog->filter_list); - - return evtlog; -} - -int dpu_evtlog_get_filter(struct dpu_dbg_evtlog *evtlog, int index, - char *buf, size_t bufsz) -{ - struct dpu_evtlog_filter *filter_node; - unsigned long flags; - int rc = -EFAULT; - - if (!evtlog || !buf || !bufsz || index < 0) - return -EINVAL; - - spin_lock_irqsave(&evtlog->spin_lock, flags); - list_for_each_entry(filter_node, &evtlog->filter_list, list) { - if (index--) - continue; - - /* don't care about return value */ - (void)strlcpy(buf, filter_node->filter, bufsz); - rc = 0; - break; - } - spin_unlock_irqrestore(&evtlog->spin_lock, flags); - - return rc; -} - -void dpu_evtlog_set_filter(struct dpu_dbg_evtlog *evtlog, char *filter) -{ - struct dpu_evtlog_filter *filter_node, *tmp; - struct list_head free_list; - unsigned long flags; - char *flt; - - if (!evtlog) - return; - - INIT_LIST_HEAD(&free_list); - - /* - * Clear active filter list and cache filter_nodes locally - * to reduce memory fragmentation. - */ - spin_lock_irqsave(&evtlog->spin_lock, flags); - list_for_each_entry_safe(filter_node, tmp, &evtlog->filter_list, list) { - list_del_init(&filter_node->list); - list_add_tail(&filter_node->list, &free_list); - } - spin_unlock_irqrestore(&evtlog->spin_lock, flags); - - /* - * Parse incoming filter request string and build up a new - * filter list. New filter nodes are taken from the local - * free list, if available, and allocated from the system - * heap once the free list is empty. - */ - while (filter && (flt = strsep(&filter, "|\r\n\t ")) != NULL) { - if (!*flt) - continue; - - if (list_empty(&free_list)) { - filter_node = kzalloc(sizeof(*filter_node), GFP_KERNEL); - if (!filter_node) - break; - - INIT_LIST_HEAD(&filter_node->list); - } else { - filter_node = list_first_entry(&free_list, - struct dpu_evtlog_filter, list); - list_del_init(&filter_node->list); - } - - /* don't care if copy truncated */ - (void)strlcpy(filter_node->filter, flt, - DPU_EVTLOG_FILTER_STRSIZE); - - spin_lock_irqsave(&evtlog->spin_lock, flags); - list_add_tail(&filter_node->list, &evtlog->filter_list); - spin_unlock_irqrestore(&evtlog->spin_lock, flags); - } - - /* - * Free any unused filter_nodes back to the system. - */ - list_for_each_entry_safe(filter_node, tmp, &free_list, list) { - list_del(&filter_node->list); - kfree(filter_node); - } -} - -void dpu_evtlog_destroy(struct dpu_dbg_evtlog *evtlog) -{ - struct dpu_evtlog_filter *filter_node, *tmp; - - if (!evtlog) - return; - - list_for_each_entry_safe(filter_node, tmp, &evtlog->filter_list, list) { - list_del(&filter_node->list); - kfree(filter_node); - } - kfree(evtlog); -}
Now that everything has been converted to tracepoints, remove the dpu evtlog. Signed-off-by: Sean Paul <seanpaul@chromium.org> --- drivers/gpu/drm/msm/Makefile | 1 - drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 5 - drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 33 --- drivers/gpu/drm/msm/dpu_dbg.c | 147 +---------- drivers/gpu/drm/msm/dpu_dbg.h | 224 +--------------- drivers/gpu/drm/msm/dpu_dbg_evtlog.c | 306 ---------------------- 6 files changed, 11 insertions(+), 705 deletions(-) delete mode 100644 drivers/gpu/drm/msm/dpu_dbg_evtlog.c