From: Satyajit Roy <[email protected]>

COLOR_SPACE_2020_YCBCR_LIMITED and COLOR_SPACE_2020_YCBCR_FULL
currently select the same output CSC matrix. The matrix uses
full-amplitude BT2020 coefficients, so the limited-range output path
does not scale luma and chroma to their limited-range code ranges.

When the output is signaled as limited-range YCbCr, a sink that honors
the quantization range expands those values again. This produces
incorrect output levels and is particularly visible with PQ HDR.

On Navi33/DCN 3.2.1 over HDMI, the AVI InfoFrame advertises limited
range while the existing output CSC produces full-amplitude BT2020
YCbCr values. Using the limited-range matrix restores the expected
PQ HDR output levels.

Add a separate output CSC matrix for BT2020 YCbCr limited range. Scale
luma by 219/255 and chroma by 224/255 while retaining the appropriate
limited-range offsets. Keep the existing matrix unchanged for full
range.

Fixes: 07bc2dcbcf40 ("drm/amd/display: Fix BT2020 YCbCr limited/full range 
input")
Cc: [email protected]
Signed-off-by: Satyajit Roy <[email protected]>
---
 .../drm/amd/display/dc/core/dc_hw_sequencer.c  | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
index 90d754d192f1..f264bb880aee 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
@@ -61,6 +61,7 @@ enum dc_color_space_type {
        COLOR_SPACE_YCBCR601_TYPE,
        COLOR_SPACE_YCBCR709_TYPE,
        COLOR_SPACE_YCBCR2020_TYPE,
+       COLOR_SPACE_YCBCR2020_LIMITED_TYPE,
        COLOR_SPACE_YCBCR601_LIMITED_TYPE,
        COLOR_SPACE_YCBCR709_LIMITED_TYPE,
        COLOR_SPACE_YCBCR709_BLACK_TYPE,
@@ -116,6 +117,10 @@ static const struct out_csc_color_matrix_type 
output_csc_matrix[] = {
                { 0x1000, 0xF149, 0xFEB7, 0x1004,
                  0x0868, 0x15B2, 0x01E6, 0x201,
                  0xFB88, 0xF478, 0x1000, 0x1004} },
+       { COLOR_SPACE_YCBCR2020_LIMITED_TYPE,
+               { 0x0E0E, 0xF313, 0xFEDF, 0x1004,
+                 0x0738, 0x12A2, 0x01A1, 0x0201,
+                 0xFC13, 0xF5DF, 0x0E0E, 0x1004} },
        { COLOR_SPACE_YCBCR709_BLACK_TYPE,
                { 0x0000, 0x0000, 0x0000, 0x1000,
                  0x0000, 0x0000, 0x0000, 0x0200,
@@ -186,7 +191,16 @@ static bool is_ycbcr2020_type(
 {
        bool ret = false;
 
-       if (color_space == COLOR_SPACE_2020_YCBCR_LIMITED || color_space == 
COLOR_SPACE_2020_YCBCR_FULL)
+       if (color_space == COLOR_SPACE_2020_YCBCR_FULL)
+               ret = true;
+       return ret;
+}
+
+static bool is_ycbcr2020_limited_type(enum dc_color_space color_space)
+{
+       bool ret = false;
+
+       if (color_space == COLOR_SPACE_2020_YCBCR_LIMITED)
                ret = true;
        return ret;
 }
@@ -217,6 +231,8 @@ static enum dc_color_space_type get_color_space_type(enum 
dc_color_space color_s
                type = COLOR_SPACE_YCBCR601_LIMITED_TYPE;
        else if (is_ycbcr709_limited_type(color_space))
                type = COLOR_SPACE_YCBCR709_LIMITED_TYPE;
+       else if (is_ycbcr2020_limited_type(color_space))
+               type = COLOR_SPACE_YCBCR2020_LIMITED_TYPE;
        else if (is_ycbcr2020_type(color_space))
                type = COLOR_SPACE_YCBCR2020_TYPE;
        else if (color_space == COLOR_SPACE_YCBCR709)
-- 
2.53.0


Reply via email to