From 2018df5c2e3a1a1cdcd33cafd8cc9d702f4cfb2d Mon Sep 17 00:00:00 2001 From: Jayant Shekhar Date: Fri, 1 May 2015 15:04:34 +0530 Subject: msm: mdss: Add debugfs support to change MDP max bandwidth Based on various use-cases such as camera and flip, MDP bandwidth limit can be changed. For debug purpose add support to change these paramaters via debugfs. First parameter takes mode and second paramter takes bandwidth limit for that particular mode. E.g. echo 2 1700000 > /mdp/perf/threshold_bw_limit Change-Id: I98456f4f00223136628b2d2300b5785af386b134 Signed-off-by: Jayant Shekhar --- drivers/video/fbdev/msm/mdss_debug.c | 89 ++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) (limited to 'drivers') diff --git a/drivers/video/fbdev/msm/mdss_debug.c b/drivers/video/fbdev/msm/mdss_debug.c index 3bf9acc2749d..6ed528500275 100644 --- a/drivers/video/fbdev/msm/mdss_debug.c +++ b/drivers/video/fbdev/msm/mdss_debug.c @@ -923,6 +923,92 @@ static int mdss_debugfs_cleanup(struct mdss_debug_data *mdd) return 0; } +static ssize_t mdss_debug_perf_bw_limit_read(struct file *file, + char __user *buff, size_t count, loff_t *ppos) +{ + struct mdss_data_type *mdata = file->private_data; + struct mdss_max_bw_settings *temp_settings; + int len = 0, i; + char buf[256]; + + if (!mdata) + return -ENODEV; + + if (*ppos) + return 0; /* the end */ + + pr_debug("mdata->max_bw_settings_cnt = %d\n", + mdata->max_bw_settings_cnt); + + temp_settings = mdata->max_bw_settings; + for (i = 0; i < mdata->max_bw_settings_cnt; i++) { + len += snprintf(buf + len, sizeof(buf), "%d %d\n", + temp_settings->mdss_max_bw_mode, + temp_settings->mdss_max_bw_val); + temp_settings++; + } + + if (len < 0) + return 0; + + if (copy_to_user(buff, buf, len)) + return -EFAULT; + + *ppos += len; /* increase offset */ + + return len; +} + +static ssize_t mdss_debug_perf_bw_limit_write(struct file *file, + const char __user *user_buf, size_t count, loff_t *ppos) +{ + struct mdss_data_type *mdata = file->private_data; + char buf[32]; + u32 mode, val; + u32 cnt; + struct mdss_max_bw_settings *temp_settings; + + if (!mdata) + return -ENODEV; + + cnt = mdata->max_bw_settings_cnt; + temp_settings = mdata->max_bw_settings; + + if (count >= sizeof(buf)) + return -EFAULT; + + if (copy_from_user(buf, user_buf, count)) + return -EFAULT; + + buf[count] = 0; /* end of string */ + + if (strnchr(buf, count, ' ')) { + /* Parsing buf */ + if (sscanf(buf, "%d %d", &mode, &val) != 2) + return -EFAULT; + } + + while (cnt--) { + if (mode == temp_settings->mdss_max_bw_mode) { + temp_settings->mdss_max_bw_val = val; + break; + } else { + temp_settings++; + } + } + + if (cnt == 0) + pr_err("Input mode is invalid\n"); + + return count; +} + +static const struct file_operations mdss_perf_bw_limit_fops = { + .open = simple_open, + .read = mdss_debug_perf_bw_limit_read, + .write = mdss_debug_perf_bw_limit_write, +}; + static int mdss_debugfs_perf_init(struct mdss_debug_data *mdd, struct mdss_data_type *mdata) { @@ -973,6 +1059,9 @@ static int mdss_debugfs_perf_init(struct mdss_debug_data *mdd, debugfs_create_u32("latency_buff_per", 0644, mdd->perf, (u32 *)&mdata->latency_buff_per); + debugfs_create_file("threshold_bw_limit", 0644, mdd->perf, + (struct mdss_data_type *)mdata, &mdss_perf_bw_limit_fops); + return 0; } -- cgit v1.2.3