aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1537-drm-amd-display-half-bandwidth-for-YCbCr420-during-v.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1537-drm-amd-display-half-bandwidth-for-YCbCr420-during-v.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1537-drm-amd-display-half-bandwidth-for-YCbCr420-during-v.patch108
1 files changed, 108 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1537-drm-amd-display-half-bandwidth-for-YCbCr420-during-v.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1537-drm-amd-display-half-bandwidth-for-YCbCr420-during-v.patch
new file mode 100644
index 00000000..0ab7dc51
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1537-drm-amd-display-half-bandwidth-for-YCbCr420-during-v.patch
@@ -0,0 +1,108 @@
+From db728d6af4c1a938bc27d8c0200f79208a1bdd0e Mon Sep 17 00:00:00 2001
+From: Martin Leung <martin.leung@amd.com>
+Date: Wed, 13 Feb 2019 17:06:31 -0500
+Subject: [PATCH 1537/2940] drm/amd/display: half bandwidth for YCbCr420 during
+ validation
+
+[Why]
+used to be unable to run 4:2:0 if using a dongle because 4k60 bandwidth
+exceeded dongle caps
+
+[How]
+half pixel clock during comparison to dongle cap. *Could get stuck on black
+screen on monitor that don't support 420 but will be selecting 420 as
+preferred mode*
+
+Change-Id: I0ebd542f819943ab1c66e361274c7c461d22ad2a
+Signed-off-by: Martin Leung <martin.leung@amd.com>
+Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com>
+Acked-by: Aidan Wood <Aidan.Wood@amd.com>
+Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_link.c | 33 +++++++++++--------
+ 1 file changed, 20 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+index ac399f74482e..c11f878d7b9f 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+@@ -2074,11 +2074,28 @@ static void disable_link(struct dc_link *link, enum signal_type signal)
+ }
+ }
+
++static uint32_t get_timing_pixel_clock_100hz(const struct dc_crtc_timing *timing)
++{
++
++ uint32_t pxl_clk = timing->pix_clk_100hz;
++
++ if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
++ pxl_clk /= 2;
++ else if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR422)
++ pxl_clk = pxl_clk * 2 / 3;
++
++ if (timing->display_color_depth == COLOR_DEPTH_101010)
++ pxl_clk = pxl_clk * 10 / 8;
++ else if (timing->display_color_depth == COLOR_DEPTH_121212)
++ pxl_clk = pxl_clk * 12 / 8;
++
++ return pxl_clk;
++}
++
+ static bool dp_active_dongle_validate_timing(
+ const struct dc_crtc_timing *timing,
+ const struct dpcd_caps *dpcd_caps)
+ {
+- unsigned int required_pix_clk_100hz = timing->pix_clk_100hz;
+ const struct dc_dongle_caps *dongle_caps = &dpcd_caps->dongle_caps;
+
+ switch (dpcd_caps->dongle_type) {
+@@ -2115,13 +2132,6 @@ static bool dp_active_dongle_validate_timing(
+ return false;
+ }
+
+-
+- /* Check Color Depth and Pixel Clock */
+- if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
+- required_pix_clk_100hz /= 2;
+- else if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR422)
+- required_pix_clk_100hz = required_pix_clk_100hz * 2 / 3;
+-
+ switch (timing->display_color_depth) {
+ case COLOR_DEPTH_666:
+ case COLOR_DEPTH_888:
+@@ -2130,14 +2140,11 @@ static bool dp_active_dongle_validate_timing(
+ case COLOR_DEPTH_101010:
+ if (dongle_caps->dp_hdmi_max_bpc < 10)
+ return false;
+- required_pix_clk_100hz = required_pix_clk_100hz * 10 / 8;
+ break;
+ case COLOR_DEPTH_121212:
+ if (dongle_caps->dp_hdmi_max_bpc < 12)
+ return false;
+- required_pix_clk_100hz = required_pix_clk_100hz * 12 / 8;
+ break;
+-
+ case COLOR_DEPTH_141414:
+ case COLOR_DEPTH_161616:
+ default:
+@@ -2145,7 +2152,7 @@ static bool dp_active_dongle_validate_timing(
+ return false;
+ }
+
+- if (required_pix_clk_100hz > (dongle_caps->dp_hdmi_max_pixel_clk * 10))
++ if (get_timing_pixel_clock_100hz(timing) > (dongle_caps->dp_hdmi_max_pixel_clk * 10))
+ return false;
+
+ return true;
+@@ -2166,7 +2173,7 @@ enum dc_status dc_link_validate_mode_timing(
+ return DC_OK;
+
+ /* Passive Dongle */
+- if (0 != max_pix_clk && timing->pix_clk_100hz > max_pix_clk)
++ if (max_pix_clk != 0 && get_timing_pixel_clock_100hz(timing) > max_pix_clk)
+ return DC_EXCEED_DONGLE_CAP;
+
+ /* Active Dongle*/
+--
+2.17.1
+