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);