summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-02-06 04:23:41 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-02-06 04:23:40 -0800
commitdc18c079316728a820cf3536380258cf919934e8 (patch)
tree2d56bab365cb659b752d1f866a13587a5afdfd44
parentbac30a06da6389471554291d8582b39ecbe2f76c (diff)
parent8591cb9b7b6273d0b1d2842e7682c8533bfb9368 (diff)
Merge "msm: mdss: fix mdp vbif writeback qos settings"
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c51
1 files changed, 48 insertions, 3 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c
index e1d2a947a77f..5b284e624c7f 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c
@@ -125,6 +125,48 @@ static inline void mdp_wb_write(struct mdss_mdp_writeback_ctx *ctx,
writel_relaxed(val, ctx->base + reg);
}
+static void mdss_mdp_qos_vbif_remapper_setup_wb(struct mdss_mdp_ctl *ctl,
+ struct mdss_mdp_writeback_ctx *ctx)
+{
+ u32 mask, reg_val, reg_val_lvl, reg_high, i, vbif_qos;
+ struct mdss_data_type *mdata = mdss_mdp_get_mdata();
+ bool is_nrt_vbif = (ctl->mixer_left && ctl->mixer_left->rotator_mode);
+
+ if (!mdata->vbif_nrt_qos)
+ return;
+
+ if (test_bit(MDSS_QOS_REMAPPER, mdata->mdss_qos_map)) {
+ mutex_lock(&mdata->reg_lock);
+ for (i = 0; i < mdata->npriority_lvl; i++) {
+ reg_high = ((ctx->xin_id & 0x8) >> 3) * 4 + (i * 8);
+
+ reg_val = MDSS_VBIF_READ(mdata,
+ MDSS_VBIF_QOS_RP_REMAP_BASE +
+ reg_high, is_nrt_vbif);
+ reg_val_lvl = MDSS_VBIF_READ(mdata,
+ MDSS_VBIF_QOS_LVL_REMAP_BASE + reg_high,
+ is_nrt_vbif);
+
+ mask = 0x3 << (ctx->xin_id * 4);
+ vbif_qos = mdata->vbif_nrt_qos[i];
+
+ reg_val &= ~(mask);
+ reg_val |= vbif_qos << (ctx->xin_id * 4);
+
+ reg_val_lvl &= ~(mask);
+ reg_val_lvl |= vbif_qos << (ctx->xin_id * 4);
+
+ pr_debug("idx:%d xin:%d reg:0x%x val:0x%x lvl:0x%x\n",
+ i, ctx->xin_id, reg_high, reg_val, reg_val_lvl);
+ MDSS_VBIF_WRITE(mdata, MDSS_VBIF_QOS_RP_REMAP_BASE +
+ reg_high, reg_val, is_nrt_vbif);
+ MDSS_VBIF_WRITE(mdata, MDSS_VBIF_QOS_LVL_REMAP_BASE +
+ reg_high, reg_val_lvl, is_nrt_vbif);
+ }
+ mutex_unlock(&mdata->reg_lock);
+ }
+}
+
static void mdss_mdp_set_qos_wb(struct mdss_mdp_ctl *ctl,
struct mdss_mdp_writeback_ctx *ctx)
{
@@ -133,12 +175,15 @@ static void mdss_mdp_set_qos_wb(struct mdss_mdp_ctl *ctl,
struct mdss_overlay_private *mdp5_data;
struct mdss_data_type *mdata = mdss_mdp_get_mdata();
- if (false == test_bit(MDSS_QOS_WB_QOS, mdata->mdss_qos_map))
- return;
-
mdp5_data = mfd_to_mdp5_data(ctl->mfd);
cwb = &mdp5_data->cwb;
+ if (!cwb->valid)
+ mdss_mdp_qos_vbif_remapper_setup_wb(ctl, ctx);
+
+ if (false == test_bit(MDSS_QOS_WB_QOS, mdata->mdss_qos_map))
+ return;
+
if (cwb->valid)
wb_qos_setup = QOS_LUT_CWB_READ;
else