Răsfoiți Sursa

disp: msm: dp: Ensure sink supports DSC decoding of selected BPC

The sink may have limited DSC decoding support
for some BPC values. Ensure that the BPC that is
selected is within the sink's DSC capabilities.

CRs-Fixed: 2527660
Change-Id: I0692e7b606e258c3cab3de25d3b03178f4aa0294
Signed-off-by: Fuad Hossain <[email protected]>
Fuad Hossain 5 ani în urmă
părinte
comite
f3aa71a5e6
2 a modificat fișierele cu 25 adăugiri și 3 ștergeri
  1. 24 3
      msm/dp/dp_panel.c
  2. 1 0
      msm/dp/dp_panel.h

+ 24 - 3
msm/dp/dp_panel.c

@@ -2023,7 +2023,9 @@ static void dp_panel_decode_dsc_dpcd(struct dp_panel *dp_panel)
 		dp_panel->sink_dsc_caps.dsc_capable = true;
 		dp_panel->sink_dsc_caps.version = dp_panel->dsc_dpcd[1];
 		dp_panel->sink_dsc_caps.block_pred_en =
-			dp_panel->dsc_dpcd[6] ? true : false;
+				dp_panel->dsc_dpcd[6] ? true : false;
+		dp_panel->sink_dsc_caps.color_depth =
+				dp_panel->dsc_dpcd[10];
 
 		if (dp_panel->sink_dsc_caps.version >= 0x11)
 			dp_panel->dsc_en = true;
@@ -2181,12 +2183,31 @@ static u32 dp_panel_get_supported_bpp(struct dp_panel *dp_panel,
 	link_info = &dp_panel->link_info;
 	data_rate_khz = link_info->num_lanes * link_info->rate * 8;
 
-	while (bpp > min_supported_bpp) {
+	for (; bpp > min_supported_bpp; bpp -= 6) {
+		if (dp_panel->dsc_en) {
+			if (bpp == 36 && !(dp_panel->sink_dsc_caps.color_depth
+					& DP_DSC_12_BPC))
+				continue;
+			else if (bpp == 30 &&
+					!(dp_panel->sink_dsc_caps.color_depth &
+					DP_DSC_10_BPC))
+				continue;
+			else if (bpp == 24 &&
+					!(dp_panel->sink_dsc_caps.color_depth &
+					DP_DSC_8_BPC))
+				continue;
+		}
+
 		if (mode_pclk_khz * bpp <= data_rate_khz)
 			break;
-		bpp -= 6;
 	}
 
+	if (bpp < min_supported_bpp)
+		DP_ERR("bpp %d is below minimum supported bpp %d\n", bpp,
+				min_supported_bpp);
+	if (dp_panel->dsc_en && bpp != 24 && bpp != 30 && bpp != 36)
+		DP_ERR("bpp %d is not supported when dsc is enabled\n", bpp);
+
 	return bpp;
 }
 

+ 1 - 0
msm/dp/dp_panel.h

@@ -81,6 +81,7 @@ struct dp_dsc_caps {
 	bool dsc_capable;
 	u8 version;
 	bool block_pred_en;
+	u8 color_depth;
 };
 
 struct dp_audio;