summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_ctl.c18
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c1
3 files changed, 17 insertions, 3 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h
index eee335e160e7..72cb4177afd0 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.h
+++ b/drivers/video/fbdev/msm/mdss_mdp.h
@@ -226,6 +226,7 @@ struct mdss_mdp_ctl {
struct mdss_mdp_perf_params new_perf;
u32 perf_transaction_status;
bool perf_release_ctl_bw;
+ u64 bw_pending;
bool traffic_shaper_enabled;
u32 traffic_shaper_mdp_clk;
diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c
index 9abea1c727a2..5e051490b6eb 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c
@@ -971,7 +971,8 @@ int mdss_mdp_perf_bw_check(struct mdss_mdp_ctl *ctl,
{
struct mdss_data_type *mdata = ctl->mdata;
struct mdss_mdp_perf_params perf;
- u32 bw, threshold;
+ u32 bw, threshold, i;
+ u64 bw_sum_of_intfs = 0;
/* we only need bandwidth check on real-time clients (interfaces) */
if (ctl->intf_type == MDSS_MDP_NO_INTF)
@@ -980,13 +981,24 @@ int mdss_mdp_perf_bw_check(struct mdss_mdp_ctl *ctl,
__mdss_mdp_perf_calc_ctl_helper(ctl, &perf,
left_plist, left_cnt, right_plist, right_cnt,
PERF_CALC_PIPE_CALC_SMP_SIZE);
+ ctl->bw_pending = perf.bw_ctl;
+
+ for (i = 0; i < mdata->nctl; i++) {
+ struct mdss_mdp_ctl *temp = mdata->ctl_off + i;
+ if (temp->power_state == MDSS_PANEL_POWER_ON &&
+ (temp->intf_type != MDSS_MDP_NO_INTF))
+ bw_sum_of_intfs += temp->bw_pending;
+ }
/* convert bandwidth to kb */
- bw = DIV_ROUND_UP_ULL(perf.bw_ctl, 1000);
+ bw = DIV_ROUND_UP_ULL(bw_sum_of_intfs, 1000);
pr_debug("calculated bandwidth=%uk\n", bw);
- threshold = ctl->is_video_mode ? mdata->max_bw_low : mdata->max_bw_high;
+ threshold = (ctl->is_video_mode ||
+ mdss_mdp_video_mode_intf_connected(ctl)) ?
+ mdata->max_bw_low : mdata->max_bw_high;
if (bw > threshold) {
+ ctl->bw_pending = 0;
pr_debug("exceeds bandwidth: %ukb > %ukb\n", bw, threshold);
return -E2BIG;
}
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
index 176436379706..86a1dd34aee8 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
@@ -1442,6 +1442,7 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd,
}
mutex_lock(&mdp5_data->ov_lock);
+ ctl->bw_pending = 0;
ret = mdss_mdp_overlay_start(mfd);
if (ret) {
pr_err("unable to start overlay %d (%d)\n", mfd->index, ret);