diff options
| author | Ingrid Gallardo <ingridg@codeaurora.org> | 2014-11-05 18:48:07 -0800 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:46:57 -0700 |
| commit | de86bbefafbeb1d533d64f95a1686bd09e885e18 (patch) | |
| tree | d008bde86086c2c3608e11fbf878ca6fa36c67e8 /drivers/video/fbdev | |
| parent | 183a1bc801d4a9f40697222a8447cbb6d396aeb0 (diff) | |
msm: mdss: add fudge factor to ib for single interface displays
For single interface video mode displays, the utilization
of the ddr channels is not as efficient as the dual interface
displays, and in some scenarios this efficiency gets reduced
by half. This is valid when display driver is doing an honest
voting and causes underruns in multiple scenarios.
Therefore this change adds a factor that account for those
inefficiencies, specific to single interface controllers.
Change-Id: I925db9defa16346c4400732310dbb679458dd0dd
Signed-off-by: Ingrid Gallardo <ingridg@codeaurora.org>
Signed-off-by: Anusha Koduru <kanusha@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 22 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_ctl.c | 47 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 2 |
4 files changed, 58 insertions, 15 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index b4651bd901e1..85b0d613f40f 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -193,6 +193,7 @@ enum mdss_mdp_wb_ctl_type { enum mdss_mdp_bw_vote_mode { MDSS_MDP_BW_MODE_SINGLE_LAYER, + MDSS_MDP_BW_MODE_SINGLE_IF, MDSS_MDP_BW_MODE_MAX }; @@ -203,6 +204,27 @@ enum mdp_wb_blk_caps { MDSS_MDP_WB_UBWC = BIT(3), }; +/** + * enum perf_calc_vote_mode - enum to decide if mdss_mdp_get_bw_vote_mode + * function needs an extra efficiency factor. + * + * @PERF_CALC_VOTE_MODE_PER_PIPE: used to check if efficiency factor is needed + * based on the pipe properties. + * @PERF_CALC_VOTE_MODE_CTL: used to check if efficiency factor is needed based + * on the controller properties. + * @PERF_CALC_VOTE_MODE_MAX: used to check if efficiency factor is need to vote + * max MDP bandwidth. + * + * Depending upon the properties of each specific object (determined + * by this enum), driver decides if the mode to vote needs an + * extra factor. + */ +enum perf_calc_vote_mode { + PERF_CALC_VOTE_MODE_PER_PIPE, + PERF_CALC_VOTE_MODE_CTL, + PERF_CALC_VOTE_MODE_MAX, +}; + struct mdss_mdp_perf_params { u64 bw_overlap; u64 bw_writeback; diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c index f55a87d663bc..06b5b01f00c5 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c +++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c @@ -475,22 +475,33 @@ u32 mdss_mdp_perf_calc_smp_size(struct mdss_mdp_pipe *pipe, return smp_bytes; } -static void mdss_mdp_get_bw_vote_mode(struct mdss_mdp_mixer *mixer, - u32 mdp_rev, struct mdss_mdp_perf_params *perf, u32 flags) +static void mdss_mdp_get_bw_vote_mode(void *data, + u32 mdp_rev, struct mdss_mdp_perf_params *perf, + enum perf_calc_vote_mode calc_mode, u32 flags) { - bitmap_zero(perf->bw_vote_mode, MDSS_MDP_BW_MODE_MAX); - if (!mixer) + if (!data) goto exit; switch (mdp_rev) { case MDSS_MDP_HW_REV_105: case MDSS_MDP_HW_REV_109: - if ((flags & PERF_CALC_PIPE_SINGLE_LAYER) && - !mixer->rotator_mode && - (mixer->type == MDSS_MDP_MIXER_TYPE_INTF)) { - set_bit(MDSS_MDP_BW_MODE_SINGLE_LAYER, - perf->bw_vote_mode); + if (calc_mode == PERF_CALC_VOTE_MODE_PER_PIPE) { + struct mdss_mdp_mixer *mixer = + (struct mdss_mdp_mixer *)data; + + if ((flags & PERF_CALC_PIPE_SINGLE_LAYER) && + !mixer->rotator_mode && + (mixer->type == MDSS_MDP_MIXER_TYPE_INTF)) + set_bit(MDSS_MDP_BW_MODE_SINGLE_LAYER, + perf->bw_vote_mode); + } else if (calc_mode == PERF_CALC_VOTE_MODE_CTL) { + struct mdss_mdp_ctl *ctl = (struct mdss_mdp_ctl *)data; + + if (ctl->is_video_mode && + (ctl->mfd->split_mode == MDP_SPLIT_MODE_NONE)) + set_bit(MDSS_MDP_BW_MODE_SINGLE_IF, + perf->bw_vote_mode); } break; default: @@ -816,7 +827,8 @@ int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe, prefill_params.is_bwc = mdss_mdp_is_ubwc_format(pipe->src_fmt); prefill_params.is_nv12 = mdss_mdp_is_nv12_format(pipe->src_fmt); - mdss_mdp_get_bw_vote_mode(mixer, mdata->mdp_rev, perf, flags); + mdss_mdp_get_bw_vote_mode(mixer, mdata->mdp_rev, perf, + PERF_CALC_VOTE_MODE_PER_PIPE, flags); if (flags & PERF_CALC_PIPE_SINGLE_LAYER) perf->prefill_bytes = @@ -1681,6 +1693,9 @@ static u64 mdss_mdp_ctl_calc_client_vote(struct mdss_data_type *mdata, int i; struct mdss_mdp_ctl *ctl; struct mdss_mdp_mixer *mixer; + struct mdss_mdp_perf_params perf_temp; + + bitmap_zero(perf_temp.bw_vote_mode, MDSS_MDP_BW_MODE_MAX); for (i = 0; i < mdata->nctl; i++) { ctl = mdata->ctl_off + i; @@ -1702,11 +1717,13 @@ static u64 mdss_mdp_ctl_calc_client_vote(struct mdss_data_type *mdata, mdss_mdp_ctl_perf_update_traffic_shaper_bw (ctl, mdp_clk); - if (ctl->cur_perf.bw_vote_mode) - bitmap_or(perf->bw_vote_mode, - perf->bw_vote_mode, - ctl->cur_perf.bw_vote_mode, - MDSS_MDP_BW_MODE_MAX); + mdss_mdp_get_bw_vote_mode(ctl, mdata->mdp_rev, + &perf_temp, PERF_CALC_VOTE_MODE_CTL, 0); + + bitmap_or(perf_temp.bw_vote_mode, + perf_temp.bw_vote_mode, + ctl->cur_perf.bw_vote_mode, + MDSS_MDP_BW_MODE_MAX); if (nrt_client && ctl->mixer_left && !ctl->mixer_left->rotator_mode) { diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c index 0fae530fae12..c81da87ab36d 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c @@ -580,6 +580,8 @@ static bool mdss_mdp_traffic_shaper_helper(struct mdss_mdp_ctl *ctl, u32 traffic_shaper; pipe = mixer->stage_pipe[i]; + memset(&perf, 0, sizeof(perf)); + if (pipe == NULL) continue; diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index a331f84b7db7..34a1cb32e929 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -400,6 +400,8 @@ int mdp_pipe_tune_perf(struct mdss_mdp_pipe *pipe, struct mdss_mdp_perf_params perf; int rc; + memset(&perf, 0, sizeof(perf)); + flags |= PERF_CALC_PIPE_APPLY_CLK_FUDGE | PERF_CALC_PIPE_CALC_SMP_SIZE; |
