Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db4eedc6 authored by Jayant Shekhar's avatar Jayant Shekhar Committed by Matt Wagantall
Browse files

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: default avatarJayant Shekhar <jshekhar@codeaurora.org>
parent 55577fae
Loading
Loading
Loading
Loading
+89 −0
Original line number Diff line number Diff line
@@ -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;
}