summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdss_debug_xlog.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/video/fbdev/msm/mdss_debug_xlog.c b/drivers/video/fbdev/msm/mdss_debug_xlog.c
index b03fc948ef5c..382ac3ebb789 100644
--- a/drivers/video/fbdev/msm/mdss_debug_xlog.c
+++ b/drivers/video/fbdev/msm/mdss_debug_xlog.c
@@ -33,7 +33,19 @@
#define XLOG_DEFAULT_DBGBUSDUMP 0x2 /* dump in RAM */
#define XLOG_DEFAULT_VBIF_DBGBUSDUMP 0x2 /* dump in RAM */
-#define MDSS_XLOG_ENTRY 256
+/*
+ * xlog will print this number of entries when it is called through
+ * sysfs node or panic. This prevents kernel log from xlog message
+ * flood.
+ */
+#define MDSS_XLOG_PRINT_ENTRY 256
+
+/*
+ * xlog keeps this number of entries in memory for debug purpose. This
+ * number must be greater than print entry to prevent out of bound xlog
+ * entry array access.
+ */
+#define MDSS_XLOG_ENTRY (MDSS_XLOG_PRINT_ENTRY * 4)
#define MDSS_XLOG_MAX_DATA 15
#define MDSS_XLOG_BUF_MAX 512
#define MDSS_XLOG_BUF_ALIGN 32
@@ -41,6 +53,7 @@
DEFINE_SPINLOCK(xlock);
struct tlog {
+ u32 counter;
s64 time;
const char *name;
int line;
@@ -53,6 +66,7 @@ struct mdss_dbg_xlog {
struct tlog logs[MDSS_XLOG_ENTRY];
u32 first;
u32 last;
+ u32 curr;
struct dentry *xlog;
u32 xlog_enable;
u32 panic_on_err;
@@ -82,13 +96,11 @@ void mdss_xlog(const char *name, int line, int flag, ...)
va_list args;
struct tlog *log;
-
if (!mdss_xlog_is_enabled(flag))
return;
spin_lock_irqsave(&xlock, flags);
-
- log = &mdss_dbg_xlog.logs[mdss_dbg_xlog.last % MDSS_XLOG_ENTRY];
+ log = &mdss_dbg_xlog.logs[mdss_dbg_xlog.curr];
log->time = ktime_to_us(ktime_get());
log->name = name;
log->line = line;
@@ -106,7 +118,7 @@ void mdss_xlog(const char *name, int line, int flag, ...)
}
va_end(args);
log->data_cnt = i;
-
+ mdss_dbg_xlog.curr = (mdss_dbg_xlog.curr + 1) % MDSS_XLOG_ENTRY;
mdss_dbg_xlog.last++;
spin_unlock_irqrestore(&xlock, flags);
@@ -135,12 +147,11 @@ static bool __mdss_xlog_dump_calc_range(void)
xlog->last += MDSS_XLOG_ENTRY;
}
- if ((xlog->last - xlog->first) > MDSS_XLOG_ENTRY) {
+ if ((xlog->last - xlog->first) > MDSS_XLOG_PRINT_ENTRY) {
pr_warn("xlog buffer overflow before dump: %d\n",
xlog->last - xlog->first);
- xlog->first = xlog->last - MDSS_XLOG_ENTRY;
+ xlog->first = xlog->last - MDSS_XLOG_PRINT_ENTRY;
}
- need_dump = true;
next = xlog->first + 1;
dump_exit:
@@ -696,6 +707,8 @@ static const struct file_operations mdss_xlog_fops = {
int mdss_create_xlog_debug(struct mdss_debug_data *mdd)
{
+ int i;
+
mdss_dbg_xlog.xlog = debugfs_create_dir("xlog", mdd->root);
if (IS_ERR_OR_NULL(mdss_dbg_xlog.xlog)) {
pr_err("debugfs_create_dir fail, error %ld\n",
@@ -707,6 +720,9 @@ int mdss_create_xlog_debug(struct mdss_debug_data *mdd)
INIT_WORK(&mdss_dbg_xlog.xlog_dump_work, xlog_debug_work);
mdss_dbg_xlog.work_panic = false;
+ for (i = 0; i < MDSS_XLOG_ENTRY; i++)
+ mdss_dbg_xlog.logs[i].counter = i;
+
debugfs_create_file("dump", 0644, mdss_dbg_xlog.xlog, NULL,
&mdss_xlog_fops);
debugfs_create_u32("enable", 0644, mdss_dbg_xlog.xlog,