drm/amd/display: Fix BT2020 YCbCr limited/full range input

[ Upstream commit 07bc2dcbcf403d47d6f305ef7f0d3d489491c5fb ]

[Why]
BT2020 YCbCr input is not handled properly when full range
quantization is used and limited range is not supported at all.

[How]
- Add enums for BT2020 YCbCr limited/full range
- Add limited range CSC matrix

Reviewed-by: Krunoslav Kovac <krunoslav.kovac@amd.com>
Signed-off-by: Ilya Bakoulin <Ilya.Bakoulin@amd.com>
Signed-off-by: Roman Li <roman.li@amd.com>
Tested-by: Robert Mader <robert.mader@collabora.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Ilya Bakoulin
2025-01-29 14:46:27 -05:00
committed by Greg Kroah-Hartman
parent 2bba67f030
commit 1e826acee1
12 changed files with 29 additions and 17 deletions
@@ -5552,9 +5552,9 @@ fill_plane_color_attributes(const struct drm_plane_state *plane_state,
case DRM_COLOR_YCBCR_BT2020: case DRM_COLOR_YCBCR_BT2020:
if (full_range) if (full_range)
*color_space = COLOR_SPACE_2020_YCBCR; *color_space = COLOR_SPACE_2020_YCBCR_FULL;
else else
return -EINVAL; *color_space = COLOR_SPACE_2020_YCBCR_LIMITED;
break; break;
default: default:
@@ -6050,7 +6050,7 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing,
if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB) if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB)
color_space = COLOR_SPACE_2020_RGB_FULLRANGE; color_space = COLOR_SPACE_2020_RGB_FULLRANGE;
else else
color_space = COLOR_SPACE_2020_YCBCR; color_space = COLOR_SPACE_2020_YCBCR_LIMITED;
break; break;
case DRM_MODE_COLORIMETRY_DEFAULT: // ITU601 case DRM_MODE_COLORIMETRY_DEFAULT: // ITU601
default: default:
@@ -1145,7 +1145,7 @@ static int amdgpu_current_colorspace_show(struct seq_file *m, void *data)
case COLOR_SPACE_2020_RGB_FULLRANGE: case COLOR_SPACE_2020_RGB_FULLRANGE:
seq_puts(m, "BT2020_RGB"); seq_puts(m, "BT2020_RGB");
break; break;
case COLOR_SPACE_2020_YCBCR: case COLOR_SPACE_2020_YCBCR_LIMITED:
seq_puts(m, "BT2020_YCC"); seq_puts(m, "BT2020_YCC");
break; break;
default: default:
@@ -40,7 +40,8 @@ bool is_rgb_cspace(enum dc_color_space output_color_space)
case COLOR_SPACE_YCBCR709: case COLOR_SPACE_YCBCR709:
case COLOR_SPACE_YCBCR601_LIMITED: case COLOR_SPACE_YCBCR601_LIMITED:
case COLOR_SPACE_YCBCR709_LIMITED: case COLOR_SPACE_YCBCR709_LIMITED:
case COLOR_SPACE_2020_YCBCR: case COLOR_SPACE_2020_YCBCR_LIMITED:
case COLOR_SPACE_2020_YCBCR_FULL:
return false; return false;
default: default:
/* Add a case to switch */ /* Add a case to switch */
@@ -176,7 +176,7 @@ static bool is_ycbcr2020_type(
{ {
bool ret = false; bool ret = false;
if (color_space == COLOR_SPACE_2020_YCBCR) if (color_space == COLOR_SPACE_2020_YCBCR_LIMITED || color_space == COLOR_SPACE_2020_YCBCR_FULL)
ret = true; ret = true;
return ret; return ret;
} }
@@ -247,7 +247,8 @@ void color_space_to_black_color(
case COLOR_SPACE_YCBCR709_BLACK: case COLOR_SPACE_YCBCR709_BLACK:
case COLOR_SPACE_YCBCR601_LIMITED: case COLOR_SPACE_YCBCR601_LIMITED:
case COLOR_SPACE_YCBCR709_LIMITED: case COLOR_SPACE_YCBCR709_LIMITED:
case COLOR_SPACE_2020_YCBCR: case COLOR_SPACE_2020_YCBCR_LIMITED:
case COLOR_SPACE_2020_YCBCR_FULL:
*black_color = black_color_format[BLACK_COLOR_FORMAT_YUV_CV]; *black_color = black_color_format[BLACK_COLOR_FORMAT_YUV_CV];
break; break;
@@ -4215,7 +4215,7 @@ static void set_avi_info_frame(
break; break;
case COLOR_SPACE_2020_RGB_FULLRANGE: case COLOR_SPACE_2020_RGB_FULLRANGE:
case COLOR_SPACE_2020_RGB_LIMITEDRANGE: case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
case COLOR_SPACE_2020_YCBCR: case COLOR_SPACE_2020_YCBCR_LIMITED:
hdmi_info.bits.EC0_EC2 = COLORIMETRYEX_BT2020RGBYCBCR; hdmi_info.bits.EC0_EC2 = COLORIMETRYEX_BT2020RGBYCBCR;
hdmi_info.bits.C0_C1 = COLORIMETRY_EXTENDED; hdmi_info.bits.C0_C1 = COLORIMETRY_EXTENDED;
break; break;
@@ -4229,7 +4229,7 @@ static void set_avi_info_frame(
break; break;
} }
if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR && if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR_LIMITED &&
stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22) { stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22) {
hdmi_info.bits.EC0_EC2 = 0; hdmi_info.bits.EC0_EC2 = 0;
hdmi_info.bits.C0_C1 = COLORIMETRY_ITU709; hdmi_info.bits.C0_C1 = COLORIMETRY_ITU709;
+3 -1
View File
@@ -641,7 +641,8 @@ enum dc_color_space {
COLOR_SPACE_YCBCR709_LIMITED, COLOR_SPACE_YCBCR709_LIMITED,
COLOR_SPACE_2020_RGB_FULLRANGE, COLOR_SPACE_2020_RGB_FULLRANGE,
COLOR_SPACE_2020_RGB_LIMITEDRANGE, COLOR_SPACE_2020_RGB_LIMITEDRANGE,
COLOR_SPACE_2020_YCBCR, COLOR_SPACE_2020_YCBCR_LIMITED,
COLOR_SPACE_2020_YCBCR_FULL,
COLOR_SPACE_ADOBERGB, COLOR_SPACE_ADOBERGB,
COLOR_SPACE_DCIP3, COLOR_SPACE_DCIP3,
COLOR_SPACE_DISPLAYNATIVE, COLOR_SPACE_DISPLAYNATIVE,
@@ -649,6 +650,7 @@ enum dc_color_space {
COLOR_SPACE_APPCTRL, COLOR_SPACE_APPCTRL,
COLOR_SPACE_CUSTOMPOINTS, COLOR_SPACE_CUSTOMPOINTS,
COLOR_SPACE_YCBCR709_BLACK, COLOR_SPACE_YCBCR709_BLACK,
COLOR_SPACE_2020_YCBCR = COLOR_SPACE_2020_YCBCR_LIMITED,
}; };
enum dc_dither_option { enum dc_dither_option {
@@ -420,7 +420,7 @@ static void dce110_stream_encoder_dp_set_stream_attribute(
dynamic_range_rgb = 1; /*limited range*/ dynamic_range_rgb = 1; /*limited range*/
break; break;
case COLOR_SPACE_2020_RGB_FULLRANGE: case COLOR_SPACE_2020_RGB_FULLRANGE:
case COLOR_SPACE_2020_YCBCR: case COLOR_SPACE_2020_YCBCR_LIMITED:
case COLOR_SPACE_XR_RGB: case COLOR_SPACE_XR_RGB:
case COLOR_SPACE_MSREF_SCRGB: case COLOR_SPACE_MSREF_SCRGB:
case COLOR_SPACE_ADOBERGB: case COLOR_SPACE_ADOBERGB:
@@ -432,6 +432,7 @@ static void dce110_stream_encoder_dp_set_stream_attribute(
case COLOR_SPACE_APPCTRL: case COLOR_SPACE_APPCTRL:
case COLOR_SPACE_CUSTOMPOINTS: case COLOR_SPACE_CUSTOMPOINTS:
case COLOR_SPACE_UNKNOWN: case COLOR_SPACE_UNKNOWN:
default:
/* do nothing */ /* do nothing */
break; break;
} }
@@ -393,7 +393,7 @@ void enc1_stream_encoder_dp_set_stream_attribute(
break; break;
case COLOR_SPACE_2020_RGB_LIMITEDRANGE: case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
case COLOR_SPACE_2020_RGB_FULLRANGE: case COLOR_SPACE_2020_RGB_FULLRANGE:
case COLOR_SPACE_2020_YCBCR: case COLOR_SPACE_2020_YCBCR_LIMITED:
case COLOR_SPACE_XR_RGB: case COLOR_SPACE_XR_RGB:
case COLOR_SPACE_MSREF_SCRGB: case COLOR_SPACE_MSREF_SCRGB:
case COLOR_SPACE_ADOBERGB: case COLOR_SPACE_ADOBERGB:
@@ -406,6 +406,7 @@ void enc1_stream_encoder_dp_set_stream_attribute(
case COLOR_SPACE_CUSTOMPOINTS: case COLOR_SPACE_CUSTOMPOINTS:
case COLOR_SPACE_UNKNOWN: case COLOR_SPACE_UNKNOWN:
case COLOR_SPACE_YCBCR709_BLACK: case COLOR_SPACE_YCBCR709_BLACK:
default:
/* do nothing */ /* do nothing */
break; break;
} }
@@ -634,7 +634,7 @@ void enc401_stream_encoder_dp_set_stream_attribute(
break; break;
case COLOR_SPACE_2020_RGB_LIMITEDRANGE: case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
case COLOR_SPACE_2020_RGB_FULLRANGE: case COLOR_SPACE_2020_RGB_FULLRANGE:
case COLOR_SPACE_2020_YCBCR: case COLOR_SPACE_2020_YCBCR_LIMITED:
case COLOR_SPACE_XR_RGB: case COLOR_SPACE_XR_RGB:
case COLOR_SPACE_MSREF_SCRGB: case COLOR_SPACE_MSREF_SCRGB:
case COLOR_SPACE_ADOBERGB: case COLOR_SPACE_ADOBERGB:
@@ -647,6 +647,7 @@ void enc401_stream_encoder_dp_set_stream_attribute(
case COLOR_SPACE_CUSTOMPOINTS: case COLOR_SPACE_CUSTOMPOINTS:
case COLOR_SPACE_UNKNOWN: case COLOR_SPACE_UNKNOWN:
case COLOR_SPACE_YCBCR709_BLACK: case COLOR_SPACE_YCBCR709_BLACK:
default:
/* do nothing */ /* do nothing */
break; break;
} }
@@ -323,7 +323,7 @@ static void dcn31_hpo_dp_stream_enc_set_stream_attribute(
break; break;
case COLOR_SPACE_2020_RGB_LIMITEDRANGE: case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
case COLOR_SPACE_2020_RGB_FULLRANGE: case COLOR_SPACE_2020_RGB_FULLRANGE:
case COLOR_SPACE_2020_YCBCR: case COLOR_SPACE_2020_YCBCR_LIMITED:
case COLOR_SPACE_XR_RGB: case COLOR_SPACE_XR_RGB:
case COLOR_SPACE_MSREF_SCRGB: case COLOR_SPACE_MSREF_SCRGB:
case COLOR_SPACE_ADOBERGB: case COLOR_SPACE_ADOBERGB:
@@ -336,6 +336,7 @@ static void dcn31_hpo_dp_stream_enc_set_stream_attribute(
case COLOR_SPACE_CUSTOMPOINTS: case COLOR_SPACE_CUSTOMPOINTS:
case COLOR_SPACE_UNKNOWN: case COLOR_SPACE_UNKNOWN:
case COLOR_SPACE_YCBCR709_BLACK: case COLOR_SPACE_YCBCR709_BLACK:
default:
/* do nothing */ /* do nothing */
break; break;
} }
+5 -1
View File
@@ -119,10 +119,14 @@ static const struct dpp_input_csc_matrix __maybe_unused dpp_input_csc_matrix[] =
{ 0x39a6, 0x2568, 0, 0xe0d6, { 0x39a6, 0x2568, 0, 0xe0d6,
0xeedd, 0x2568, 0xf925, 0x9a8, 0xeedd, 0x2568, 0xf925, 0x9a8,
0, 0x2568, 0x43ee, 0xdbb2 } }, 0, 0x2568, 0x43ee, 0xdbb2 } },
{ COLOR_SPACE_2020_YCBCR, { COLOR_SPACE_2020_YCBCR_FULL,
{ 0x2F30, 0x2000, 0, 0xE869, { 0x2F30, 0x2000, 0, 0xE869,
0xEDB7, 0x2000, 0xFABC, 0xBC6, 0xEDB7, 0x2000, 0xFABC, 0xBC6,
0, 0x2000, 0x3C34, 0xE1E6 } }, 0, 0x2000, 0x3C34, 0xE1E6 } },
{ COLOR_SPACE_2020_YCBCR_LIMITED,
{ 0x35B9, 0x2543, 0, 0xE2B2,
0xEB2F, 0x2543, 0xFA01, 0x0B1F,
0, 0x2543, 0x4489, 0xDB42 } },
{ COLOR_SPACE_2020_RGB_LIMITEDRANGE, { COLOR_SPACE_2020_RGB_LIMITEDRANGE,
{ 0x35E0, 0x255F, 0, 0xE2B3, { 0x35E0, 0x255F, 0, 0xE2B3,
0xEB20, 0x255F, 0xF9FD, 0xB1E, 0xEB20, 0x255F, 0xF9FD, 0xB1E,
@@ -383,10 +383,10 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
colorimetryFormat = ColorimetryYCC_DP_ITU709; colorimetryFormat = ColorimetryYCC_DP_ITU709;
else if (cs == COLOR_SPACE_ADOBERGB) else if (cs == COLOR_SPACE_ADOBERGB)
colorimetryFormat = ColorimetryYCC_DP_AdobeYCC; colorimetryFormat = ColorimetryYCC_DP_AdobeYCC;
else if (cs == COLOR_SPACE_2020_YCBCR) else if (cs == COLOR_SPACE_2020_YCBCR_LIMITED)
colorimetryFormat = ColorimetryYCC_DP_ITU2020YCbCr; colorimetryFormat = ColorimetryYCC_DP_ITU2020YCbCr;
if (cs == COLOR_SPACE_2020_YCBCR && tf == TRANSFER_FUNC_GAMMA_22) if (cs == COLOR_SPACE_2020_YCBCR_LIMITED && tf == TRANSFER_FUNC_GAMMA_22)
colorimetryFormat = ColorimetryYCC_DP_ITU709; colorimetryFormat = ColorimetryYCC_DP_ITU709;
break; break;