summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorIngrid Gallardo <ingridg@codeaurora.org>2014-11-05 18:48:07 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:46:57 -0700
commitde86bbefafbeb1d533d64f95a1686bd09e885e18 (patch)
treed008bde86086c2c3608e11fbf878ca6fa36c67e8 /drivers/video/fbdev
parent183a1bc801d4a9f40697222a8447cbb6d396aeb0 (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.h22
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_ctl.c47
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c2
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c2
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;