diff options
| author | Jayant Shekhar <jshekhar@codeaurora.org> | 2015-05-01 15:04:34 +0530 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:42:01 -0700 |
| commit | 2018df5c2e3a1a1cdcd33cafd8cc9d702f4cfb2d (patch) | |
| tree | 36cef9ae134fcdf3c4993de69a8294080847b86d | |
| parent | 1715b84a52cdfdd1cae433721b5707b6c1459025 (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>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_debug.c | 89 |
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; } |
