Now that everything has been converted to tracepoints, remove the dpu evtlog. Signed-off-by: Sean Paul <seanpaul@xxxxxxxxxxxx> --- 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); -} -- Sean Paul, Software Engineer, Google / Chromium OS -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html