summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJayant Shekhar <jshekhar@codeaurora.org>2015-05-01 15:04:34 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:42:01 -0700
commit2018df5c2e3a1a1cdcd33cafd8cc9d702f4cfb2d (patch)
tree36cef9ae134fcdf3c4993de69a8294080847b86d /drivers
parent1715b84a52cdfdd1cae433721b5707b6c1459025 (diff)
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 > <debugfs>/mdp/perf/threshold_bw_limit Change-Id: I98456f4f00223136628b2d2300b5785af386b134 Signed-off-by: Jayant Shekhar <jshekhar@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdss_debug.c89
1 files changed, 89 insertions, 0 deletions
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;
}