diff --git a/msm/dp/dp_panel.c b/msm/dp/dp_panel.c index a4a2a735ce..39b571a305 100644 --- a/msm/dp/dp_panel.c +++ b/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; } diff --git a/msm/dp/dp_panel.h b/msm/dp/dp_panel.h index 649e588370..212b61524b 100644 --- a/msm/dp/dp_panel.h +++ b/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;