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

Commit ddf568f6 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm:mdss: Add performance tuning parameters in debugfs"

parents f3df856b 68152d72
Loading
Loading
Loading
Loading
+6 −1
Original line number Original line Diff line number Diff line
@@ -71,6 +71,11 @@ struct mdss_fudge_factor {
	u32 denom;
	u32 denom;
};
};


struct mdss_perf_tune {
	unsigned long min_mdp_clk;
	u64 min_bus_vote;
};

#define MDSS_IRQ_SUSPEND	-1
#define MDSS_IRQ_SUSPEND	-1
#define MDSS_IRQ_RESUME		1
#define MDSS_IRQ_RESUME		1
#define MDSS_IRQ_REQ		0
#define MDSS_IRQ_REQ		0
@@ -131,7 +136,6 @@ struct mdss_data_type {
	u8 clk_ena;
	u8 clk_ena;
	u8 fs_ena;
	u8 fs_ena;
	u8 vsync_ena;
	u8 vsync_ena;
	unsigned long min_mdp_clk;


	u32 res_init;
	u32 res_init;


@@ -199,6 +203,7 @@ struct mdss_data_type {


	int handoff_pending;
	int handoff_pending;
	bool ulps;
	bool ulps;
	struct mdss_perf_tune perf_tune;
};
};
extern struct mdss_data_type *mdss_res;
extern struct mdss_data_type *mdss_res;


+121 −10
Original line number Original line Diff line number Diff line
@@ -334,6 +334,78 @@ static const struct file_operations mdss_stat_fops = {
	.read = mdss_debug_stat_read,
	.read = mdss_debug_stat_read,
};
};


static ssize_t mdss_debug_factor_write(struct file *file,
		    const char __user *user_buf, size_t count, loff_t *ppos)
{
	struct mdss_fudge_factor *factor  = file->private_data;
	u32 numer = factor->numer;
	u32 denom = factor->denom;
	char buf[32];

	if (!factor)
		return -ENODEV;

	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 as fraction */
		if (sscanf(buf, "%d/%d", &numer, &denom) != 2)
			return -EFAULT;
	} else {
		/* Parsing buf as percentage */
		if (sscanf(buf, "%d", &numer) != 1)
			return -EFAULT;
		denom = 100;
	}

	if (numer && denom) {
		factor->numer = numer;
		factor->denom = denom;
	}

	pr_debug("numer=%d  denom=%d\n", numer, denom);

	return count;
}

static ssize_t mdss_debug_factor_read(struct file *file,
			char __user *buff, size_t count, loff_t *ppos)
{
	struct mdss_fudge_factor *factor = file->private_data;
	int len = 0;
	char buf[32];

	if (!factor)
		return -ENODEV;

	if (*ppos)
		return 0;	/* the end */

	len = snprintf(buf, sizeof(buf), "%d/%d\n",
			factor->numer, factor->denom);
	if (len < 0)
		return 0;

	if (copy_to_user(buff, buf, len))
		return -EFAULT;

	*ppos += len;	/* increase offset */

	return len;
}

static const struct file_operations mdss_factor_fops = {
	.open = simple_open,
	.read = mdss_debug_factor_read,
	.write = mdss_debug_factor_write,
};

static int mdss_debugfs_cleanup(struct mdss_debug_data *mdd)
static int mdss_debugfs_cleanup(struct mdss_debug_data *mdd)
{
{
	struct mdss_debug_base *base, *tmp;
	struct mdss_debug_base *base, *tmp;
@@ -354,6 +426,39 @@ static int mdss_debugfs_cleanup(struct mdss_debug_data *mdd)
	return 0;
	return 0;
}
}


static int mdss_debugfs_perf_init(struct mdss_debug_data *mdd,
			struct mdss_data_type *mdata) {

	debugfs_create_u32("min_mdp_clk", 0644, mdd->perf,
		(u32 *)&mdata->perf_tune.min_mdp_clk);

	debugfs_create_u64("min_bus_vote", 0644, mdd->perf,
		(u64 *)&mdata->perf_tune.min_bus_vote);

	debugfs_create_file("ab_factor", 0644, mdd->perf,
		&mdata->ab_factor, &mdss_factor_fops);

	debugfs_create_file("ib_factor", 0644, mdd->perf,
		&mdata->ib_factor, &mdss_factor_fops);

	debugfs_create_file("ib_factor_overlap", 0644, mdd->perf,
		&mdata->ib_factor_overlap, &mdss_factor_fops);

	debugfs_create_file("clk_factor", 0644, mdd->perf,
		&mdata->clk_factor, &mdss_factor_fops);

	debugfs_create_u32("threshold_low", 0644, mdd->perf,
		(u32 *)&mdata->max_bw_low);

	debugfs_create_u32("threshold_high", 0644, mdd->perf,
		(u32 *)&mdata->max_bw_high);

	debugfs_create_u32("threshold_pipe", 0644, mdd->perf,
		(u32 *)&mdata->max_bw_per_pipe);

	return 0;
}

int mdss_debugfs_init(struct mdss_data_type *mdata)
int mdss_debugfs_init(struct mdss_data_type *mdata)
{
{
	struct mdss_debug_data *mdd;
	struct mdss_debug_data *mdd;
@@ -372,25 +477,31 @@ int mdss_debugfs_init(struct mdss_data_type *mdata)


	mdd->root = debugfs_create_dir("mdp", NULL);
	mdd->root = debugfs_create_dir("mdp", NULL);
	if (IS_ERR_OR_NULL(mdd->root)) {
	if (IS_ERR_OR_NULL(mdd->root)) {
		pr_err("debugfs_create_dir fail, error %ld\n",
		pr_err("debugfs_create_dir for mdp failed, error %ld\n",
		       PTR_ERR(mdd->root));
		       PTR_ERR(mdd->root));
		mdd->root = NULL;
		goto err;
		mdss_debugfs_cleanup(mdd);
		return -ENODEV;
	}
	}
	debugfs_create_file("stat", 0644, mdd->root, mdata, &mdss_stat_fops);
	debugfs_create_file("stat", 0644, mdd->root, mdata, &mdss_stat_fops);


	debugfs_create_u32("min_mdp_clk", 0644, mdd->root,
	mdd->perf = debugfs_create_dir("perf", mdd->root);
			(u32 *)&mdata->min_mdp_clk);
	if (IS_ERR_OR_NULL(mdd->perf)) {

		pr_err("debugfs_create_dir perf fail, error %ld\n",
	if (mdss_create_xlog_debug(mdd)) {
			PTR_ERR(mdd->perf));
		mdss_debugfs_cleanup(mdd);
		goto err;
		return -ENODEV;
	}
	}


	mdss_debugfs_perf_init(mdd, mdata);

	if (mdss_create_xlog_debug(mdd))
		goto err;

	mdata->debug_inf.debug_data = mdd;
	mdata->debug_inf.debug_data = mdd;


	return 0;
	return 0;

err:
	mdss_debugfs_cleanup(mdd);
	return -ENODEV;
}
}


int mdss_debugfs_remove(struct mdss_data_type *mdata)
int mdss_debugfs_remove(struct mdss_data_type *mdata)
+1 −0
Original line number Original line Diff line number Diff line
@@ -52,6 +52,7 @@ struct debug_log {


struct mdss_debug_data {
struct mdss_debug_data {
	struct dentry *root;
	struct dentry *root;
	struct dentry *perf;
	struct list_head base_list;
	struct list_head base_list;
	struct debug_log logd;
	struct debug_log logd;
};
};
+1 −1
Original line number Original line Diff line number Diff line
@@ -637,7 +637,7 @@ void mdss_mdp_set_clk_rate(unsigned long rate)
	struct clk *clk = mdss_mdp_get_clk(MDSS_CLK_MDP_SRC);
	struct clk *clk = mdss_mdp_get_clk(MDSS_CLK_MDP_SRC);
	unsigned long min_clk_rate;
	unsigned long min_clk_rate;


	min_clk_rate = max(rate, mdata->min_mdp_clk);
	min_clk_rate = max(rate, mdata->perf_tune.min_mdp_clk);


	if (clk) {
	if (clk) {
		mutex_lock(&mdp_clk_lock);
		mutex_lock(&mdp_clk_lock);
+3 −3
Original line number Original line Diff line number Diff line
@@ -935,8 +935,8 @@ static inline void mdss_mdp_ctl_perf_update_bus(struct mdss_mdp_ctl *ctl)
				ctl->cur_perf.bw_ctl);
				ctl->cur_perf.bw_ctl);
		}
		}
	}
	}
	bus_ib_quota = bw_sum_of_intfs;
	bus_ib_quota = max(bw_sum_of_intfs, mdata->perf_tune.min_bus_vote);
	bus_ab_quota = apply_fudge_factor(bw_sum_of_intfs,
	bus_ab_quota = apply_fudge_factor(bus_ib_quota,
		&mdss_res->ab_factor);
		&mdss_res->ab_factor);
	mdss_mdp_bus_scale_set_quota(bus_ab_quota, bus_ib_quota);
	mdss_mdp_bus_scale_set_quota(bus_ab_quota, bus_ib_quota);
	pr_debug("ab=%llu ib=%llu\n", bus_ab_quota, bus_ib_quota);
	pr_debug("ab=%llu ib=%llu\n", bus_ab_quota, bus_ib_quota);