platform: msm_shared: Add vbif qos remapper support in LK
Each MDP source pipe can generate 4 levels of priority and
those priorities are remapped before reaching the AXI bus.
These re-mapper settings depends on the chip-set and the
nature of the control path source pipe is used in. Provide
support to implement this configuration.
Change-Id: I4e2504e2ca41d0ed932fe88a818930ab0fdac84a
diff --git a/platform/msm_shared/mdp5.c b/platform/msm_shared/mdp5.c
index 6e8fea4..6bb8c69 100644
--- a/platform/msm_shared/mdp5.c
+++ b/platform/msm_shared/mdp5.c
@@ -225,6 +225,67 @@
return free_smp_offset;
}
+static void mdp_select_pipe_client_id(struct msm_panel_info *pinfo,
+ uint32_t *left_sspp_client_id, uint32_t *right_sspp_client_id)
+{
+ uint32_t mdss_mdp_rev = readl(MDP_HW_REV);
+ if (MDSS_IS_MAJOR_MINOR_MATCHING(mdss_mdp_rev, MDSS_MDP_HW_REV_101) ||
+ MDSS_IS_MAJOR_MINOR_MATCHING(mdss_mdp_rev, MDSS_MDP_HW_REV_106) ||
+ MDSS_IS_MAJOR_MINOR_MATCHING(mdss_mdp_rev, MDSS_MDP_HW_REV_108)) {
+ switch (pinfo->pipe_type) {
+ case MDSS_MDP_PIPE_TYPE_RGB:
+ *left_sspp_client_id = 0x7; /* 7 */
+ *right_sspp_client_id = 0x11; /* 17 */
+ break;
+ case MDSS_MDP_PIPE_TYPE_DMA:
+ *left_sspp_client_id = 0x4; /* 4 */
+ *right_sspp_client_id = 0xD; /* 13 */
+ break;
+ case MDSS_MDP_PIPE_TYPE_VIG:
+ default:
+ *left_sspp_client_id = 0x1; /* 1 */
+ *right_sspp_client_id = 0x4; /* 4 */
+ break;
+ }
+ } else {
+ switch (pinfo->pipe_type) {
+ case MDSS_MDP_PIPE_TYPE_RGB:
+ *left_sspp_client_id = 0x10; /* 16 */
+ *right_sspp_client_id = 0x11; /* 17 */
+ break;
+ case MDSS_MDP_PIPE_TYPE_DMA:
+ *left_sspp_client_id = 0xA; /* 10 */
+ *right_sspp_client_id = 0xD; /* 13 */
+ break;
+ case MDSS_MDP_PIPE_TYPE_VIG:
+ default:
+ *left_sspp_client_id = 0x1; /* 1 */
+ *right_sspp_client_id = 0x4; /* 4 */
+ break;
+ }
+ }
+}
+
+static void mdp_select_pipe_xin_id(struct msm_panel_info *pinfo,
+ uint32_t *left_pipe_xin_id, uint32_t *right_pipe_xin_id)
+{
+ switch (pinfo->pipe_type) {
+ case MDSS_MDP_PIPE_TYPE_RGB:
+ *left_pipe_xin_id = 0x1; /* 1 */
+ *right_pipe_xin_id = 0x5; /* 5 */
+ break;
+ case MDSS_MDP_PIPE_TYPE_DMA:
+ *left_pipe_xin_id = 0x2; /* 2 */
+ *right_pipe_xin_id = 0xA; /* 10 */
+ break;
+ case MDSS_MDP_PIPE_TYPE_VIG:
+ default:
+ *left_pipe_xin_id = 0x0; /* 0 */
+ *right_pipe_xin_id = 0x4; /* 4 */
+ break;
+ }
+}
+
static void mdss_smp_setup(struct msm_panel_info *pinfo, uint32_t left_pipe,
uint32_t right_pipe)
@@ -250,41 +311,8 @@
fixed_smp_cnt = 0;
}
- if (MDSS_IS_MAJOR_MINOR_MATCHING(mdss_mdp_rev, MDSS_MDP_HW_REV_101) ||
- MDSS_IS_MAJOR_MINOR_MATCHING(mdss_mdp_rev, MDSS_MDP_HW_REV_106) ||
- MDSS_IS_MAJOR_MINOR_MATCHING(mdss_mdp_rev, MDSS_MDP_HW_REV_108)) {
- switch (pinfo->pipe_type) {
- case MDSS_MDP_PIPE_TYPE_RGB:
- left_sspp_client_id = 0x7; /* 7 */
- right_sspp_client_id = 0x11; /* 17 */
- break;
- case MDSS_MDP_PIPE_TYPE_DMA:
- left_sspp_client_id = 0x4; /* 4 */
- right_sspp_client_id = 0xD; /* 13 */
- break;
- case MDSS_MDP_PIPE_TYPE_VIG:
- default:
- left_sspp_client_id = 0x1; /* 1 */
- right_sspp_client_id = 0x4; /* 4 */
- break;
- }
- } else {
- switch (pinfo->pipe_type) {
- case MDSS_MDP_PIPE_TYPE_RGB:
- left_sspp_client_id = 0x10; /* 16 */
- right_sspp_client_id = 0x11; /* 17 */
- break;
- case MDSS_MDP_PIPE_TYPE_DMA:
- left_sspp_client_id = 0xA; /* 10 */
- right_sspp_client_id = 0xD; /* 13 */
- break;
- case MDSS_MDP_PIPE_TYPE_VIG:
- default:
- left_sspp_client_id = 0x1; /* 1 */
- right_sspp_client_id = 0x4; /* 4 */
- break;
- }
- }
+ mdp_select_pipe_client_id(pinfo,
+ &left_sspp_client_id, &right_sspp_client_id);
/* Each pipe driving half the screen */
if (pinfo->lcdc.dual_pipe)
@@ -487,8 +515,10 @@
else if (MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev,
MDSS_MDP_HW_REV_106) ||
MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev,
- MDSS_MDP_HW_REV_108))
- map = 0xAA;
+ MDSS_MDP_HW_REV_108) ||
+ MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev,
+ MDSS_MDP_HW_REV_105))
+ map = 0xE4;
else if (MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev,
MDSS_MDP_HW_REV_103))
map = 0xFA;
@@ -498,6 +528,46 @@
writel(map, MDP_QOS_REMAPPER_CLASS_0);
}
+void mdss_vbif_qos_remapper_setup(struct msm_panel_info *pinfo)
+{
+ uint32_t mask, reg_val, i;
+ uint32_t left_pipe_xin_id, right_pipe_xin_id;
+ uint32_t mdp_hw_rev = readl(MDP_HW_REV);
+ uint32_t vbif_qos[4] = {0, 0, 0, 0};
+
+ mdp_select_pipe_xin_id(pinfo,
+ &left_pipe_xin_id, &right_pipe_xin_id);
+
+ if (MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev, MDSS_MDP_HW_REV_106) ||
+ MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev, MDSS_MDP_HW_REV_108)) {
+ vbif_qos[0] = 2;
+ vbif_qos[1] = 2;
+ vbif_qos[2] = 2;
+ vbif_qos[3] = 2;
+ } else if (MDSS_IS_MAJOR_MINOR_MATCHING(mdp_hw_rev, MDSS_MDP_HW_REV_105)) {
+ vbif_qos[0] = 2;
+ vbif_qos[1] = 2;
+ vbif_qos[2] = 2;
+ vbif_qos[3] = 1;
+ } else {
+ return;
+ }
+
+ for (i = 0; i < 4; i++) {
+ reg_val = readl(VBIF_VBIF_QOS_REMAP_00 + i*4);
+ mask = 0x3 << (left_pipe_xin_id * 2);
+ reg_val &= ~(mask);
+ reg_val |= vbif_qos[i] << (left_pipe_xin_id * 2);
+
+ if (pinfo->lcdc.dual_pipe) {
+ mask = 0x3 << (right_pipe_xin_id * 2);
+ reg_val &= ~(mask);
+ reg_val |= vbif_qos[i] << (right_pipe_xin_id * 2);
+ }
+ writel(reg_val, VBIF_VBIF_QOS_REMAP_00 + i*4);
+ }
+}
+
static uint32_t mdss_mdp_ctl_out_sel(struct msm_panel_info *pinfo,
int is_main_ctl)
{
@@ -535,6 +605,7 @@
mdss_smp_setup(pinfo, left_pipe, right_pipe);
mdss_qos_remapper_setup();
+ mdss_vbif_qos_remapper_setup(pinfo);
mdss_source_pipe_config(fb, pinfo, left_pipe);
@@ -582,6 +653,7 @@
mdss_smp_setup(pinfo, left_pipe, right_pipe);
mdss_qos_remapper_setup();
+ mdss_vbif_qos_remapper_setup(pinfo);
mdss_source_pipe_config(fb, pinfo, left_pipe);
if (pinfo->lcdc.dual_pipe)
@@ -644,6 +716,7 @@
mdss_vbif_setup();
mdss_smp_setup(pinfo, left_pipe, right_pipe);
mdss_qos_remapper_setup();
+ mdss_vbif_qos_remapper_setup(pinfo);
mdss_source_pipe_config(fb, pinfo, left_pipe);