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 <fhossain@codeaurora.org>
This commit is contained in:
Fuad Hossain
2019-09-26 15:38:52 -04:00
committed by Gerrit - the friendly Code Review server
parent cc1226edbc
commit f3aa71a5e6
2 changed files with 25 additions and 3 deletions

View File

@@ -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;
}