diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_ctl.c | 18 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 1 |
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); |
