Loading drivers/video/msm/mdss/mdss.h +6 −1 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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; Loading drivers/video/msm/mdss/mdss_debug.c +121 −10 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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) Loading drivers/video/msm/mdss/mdss_debug.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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; }; }; Loading drivers/video/msm/mdss/mdss_mdp.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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); Loading drivers/video/msm/mdss/mdss_mdp_ctl.c +3 −3 Original line number Original line Diff line number Diff line Loading @@ -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); Loading Loading
drivers/video/msm/mdss/mdss.h +6 −1 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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; Loading
drivers/video/msm/mdss/mdss_debug.c +121 −10 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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) Loading
drivers/video/msm/mdss/mdss_debug.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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; }; }; Loading
drivers/video/msm/mdss/mdss_mdp.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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); Loading
drivers/video/msm/mdss/mdss_mdp_ctl.c +3 −3 Original line number Original line Diff line number Diff line Loading @@ -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); Loading