diff options
| -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; |
