From f3aa71a5e60d48a8732f02ec3fa8b7935b0f2e72 Mon Sep 17 00:00:00 2001 From: Fuad Hossain Date: Thu, 26 Sep 2019 15:38:52 -0400 Subject: [PATCH] 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 --- msm/dp/dp_panel.c | 27 ++++++++++++++++++++++++--- msm/dp/dp_panel.h | 1 + 2 files changed, 25 insertions(+), 3 deletions(-) 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;