Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

[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>

authored by

Ilya Bakoulin and committed by
Alex Deucher
07bc2dcb 9856893f

+29 -17
+3 -3
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 5624 5624 5625 5625 case DRM_COLOR_YCBCR_BT2020: 5626 5626 if (full_range) 5627 - *color_space = COLOR_SPACE_2020_YCBCR; 5627 + *color_space = COLOR_SPACE_2020_YCBCR_FULL; 5628 5628 else 5629 - return -EINVAL; 5629 + *color_space = COLOR_SPACE_2020_YCBCR_LIMITED; 5630 5630 break; 5631 5631 5632 5632 default: ··· 6122 6122 if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB) 6123 6123 color_space = COLOR_SPACE_2020_RGB_FULLRANGE; 6124 6124 else 6125 - color_space = COLOR_SPACE_2020_YCBCR; 6125 + color_space = COLOR_SPACE_2020_YCBCR_LIMITED; 6126 6126 break; 6127 6127 case DRM_MODE_COLORIMETRY_DEFAULT: // ITU601 6128 6128 default:
+1 -1
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
··· 1169 1169 case COLOR_SPACE_2020_RGB_FULLRANGE: 1170 1170 seq_puts(m, "BT2020_RGB"); 1171 1171 break; 1172 - case COLOR_SPACE_2020_YCBCR: 1172 + case COLOR_SPACE_2020_YCBCR_LIMITED: 1173 1173 seq_puts(m, "BT2020_YCC"); 1174 1174 break; 1175 1175 default:
+2 -1
drivers/gpu/drm/amd/display/dc/basics/dc_common.c
··· 40 40 case COLOR_SPACE_YCBCR709: 41 41 case COLOR_SPACE_YCBCR601_LIMITED: 42 42 case COLOR_SPACE_YCBCR709_LIMITED: 43 - case COLOR_SPACE_2020_YCBCR: 43 + case COLOR_SPACE_2020_YCBCR_LIMITED: 44 + case COLOR_SPACE_2020_YCBCR_FULL: 44 45 return false; 45 46 default: 46 47 /* Add a case to switch */
+3 -2
drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
··· 176 176 { 177 177 bool ret = false; 178 178 179 - if (color_space == COLOR_SPACE_2020_YCBCR) 179 + if (color_space == COLOR_SPACE_2020_YCBCR_LIMITED || color_space == COLOR_SPACE_2020_YCBCR_FULL) 180 180 ret = true; 181 181 return ret; 182 182 } ··· 247 247 case COLOR_SPACE_YCBCR709_BLACK: 248 248 case COLOR_SPACE_YCBCR601_LIMITED: 249 249 case COLOR_SPACE_YCBCR709_LIMITED: 250 - case COLOR_SPACE_2020_YCBCR: 250 + case COLOR_SPACE_2020_YCBCR_LIMITED: 251 + case COLOR_SPACE_2020_YCBCR_FULL: 251 252 *black_color = black_color_format[BLACK_COLOR_FORMAT_YUV_CV]; 252 253 break; 253 254
+2 -2
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
··· 4488 4488 break; 4489 4489 case COLOR_SPACE_2020_RGB_FULLRANGE: 4490 4490 case COLOR_SPACE_2020_RGB_LIMITEDRANGE: 4491 - case COLOR_SPACE_2020_YCBCR: 4491 + case COLOR_SPACE_2020_YCBCR_LIMITED: 4492 4492 hdmi_info.bits.EC0_EC2 = COLORIMETRYEX_BT2020RGBYCBCR; 4493 4493 hdmi_info.bits.C0_C1 = COLORIMETRY_EXTENDED; 4494 4494 break; ··· 4502 4502 break; 4503 4503 } 4504 4504 4505 - if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR && 4505 + if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR_LIMITED && 4506 4506 stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22) { 4507 4507 hdmi_info.bits.EC0_EC2 = 0; 4508 4508 hdmi_info.bits.C0_C1 = COLORIMETRY_ITU709;
+3 -1
drivers/gpu/drm/amd/display/dc/dc_hw_types.h
··· 653 653 COLOR_SPACE_YCBCR709_LIMITED, 654 654 COLOR_SPACE_2020_RGB_FULLRANGE, 655 655 COLOR_SPACE_2020_RGB_LIMITEDRANGE, 656 - COLOR_SPACE_2020_YCBCR, 656 + COLOR_SPACE_2020_YCBCR_LIMITED, 657 + COLOR_SPACE_2020_YCBCR_FULL, 657 658 COLOR_SPACE_ADOBERGB, 658 659 COLOR_SPACE_DCIP3, 659 660 COLOR_SPACE_DISPLAYNATIVE, ··· 662 661 COLOR_SPACE_APPCTRL, 663 662 COLOR_SPACE_CUSTOMPOINTS, 664 663 COLOR_SPACE_YCBCR709_BLACK, 664 + COLOR_SPACE_2020_YCBCR = COLOR_SPACE_2020_YCBCR_LIMITED, 665 665 }; 666 666 667 667 enum dc_dither_option {
+2 -1
drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c
··· 418 418 dynamic_range_rgb = 1; /*limited range*/ 419 419 break; 420 420 case COLOR_SPACE_2020_RGB_FULLRANGE: 421 - case COLOR_SPACE_2020_YCBCR: 421 + case COLOR_SPACE_2020_YCBCR_LIMITED: 422 422 case COLOR_SPACE_XR_RGB: 423 423 case COLOR_SPACE_MSREF_SCRGB: 424 424 case COLOR_SPACE_ADOBERGB: ··· 430 430 case COLOR_SPACE_APPCTRL: 431 431 case COLOR_SPACE_CUSTOMPOINTS: 432 432 case COLOR_SPACE_UNKNOWN: 433 + default: 433 434 /* do nothing */ 434 435 break; 435 436 }
+2 -1
drivers/gpu/drm/amd/display/dc/dio/dcn10/dcn10_stream_encoder.c
··· 391 391 break; 392 392 case COLOR_SPACE_2020_RGB_LIMITEDRANGE: 393 393 case COLOR_SPACE_2020_RGB_FULLRANGE: 394 - case COLOR_SPACE_2020_YCBCR: 394 + case COLOR_SPACE_2020_YCBCR_LIMITED: 395 395 case COLOR_SPACE_XR_RGB: 396 396 case COLOR_SPACE_MSREF_SCRGB: 397 397 case COLOR_SPACE_ADOBERGB: ··· 404 404 case COLOR_SPACE_CUSTOMPOINTS: 405 405 case COLOR_SPACE_UNKNOWN: 406 406 case COLOR_SPACE_YCBCR709_BLACK: 407 + default: 407 408 /* do nothing */ 408 409 break; 409 410 }
+2 -1
drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.c
··· 632 632 break; 633 633 case COLOR_SPACE_2020_RGB_LIMITEDRANGE: 634 634 case COLOR_SPACE_2020_RGB_FULLRANGE: 635 - case COLOR_SPACE_2020_YCBCR: 635 + case COLOR_SPACE_2020_YCBCR_LIMITED: 636 636 case COLOR_SPACE_XR_RGB: 637 637 case COLOR_SPACE_MSREF_SCRGB: 638 638 case COLOR_SPACE_ADOBERGB: ··· 645 645 case COLOR_SPACE_CUSTOMPOINTS: 646 646 case COLOR_SPACE_UNKNOWN: 647 647 case COLOR_SPACE_YCBCR709_BLACK: 648 + default: 648 649 /* do nothing */ 649 650 break; 650 651 }
+2 -1
drivers/gpu/drm/amd/display/dc/hpo/dcn31/dcn31_hpo_dp_stream_encoder.c
··· 323 323 break; 324 324 case COLOR_SPACE_2020_RGB_LIMITEDRANGE: 325 325 case COLOR_SPACE_2020_RGB_FULLRANGE: 326 - case COLOR_SPACE_2020_YCBCR: 326 + case COLOR_SPACE_2020_YCBCR_LIMITED: 327 327 case COLOR_SPACE_XR_RGB: 328 328 case COLOR_SPACE_MSREF_SCRGB: 329 329 case COLOR_SPACE_ADOBERGB: ··· 336 336 case COLOR_SPACE_CUSTOMPOINTS: 337 337 case COLOR_SPACE_UNKNOWN: 338 338 case COLOR_SPACE_YCBCR709_BLACK: 339 + default: 339 340 /* do nothing */ 340 341 break; 341 342 }
+5 -1
drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
··· 119 119 { 0x39a6, 0x2568, 0, 0xe0d6, 120 120 0xeedd, 0x2568, 0xf925, 0x9a8, 121 121 0, 0x2568, 0x43ee, 0xdbb2 } }, 122 - { COLOR_SPACE_2020_YCBCR, 122 + { COLOR_SPACE_2020_YCBCR_FULL, 123 123 { 0x2F30, 0x2000, 0, 0xE869, 124 124 0xEDB7, 0x2000, 0xFABC, 0xBC6, 125 125 0, 0x2000, 0x3C34, 0xE1E6 } }, 126 + { COLOR_SPACE_2020_YCBCR_LIMITED, 127 + { 0x35B9, 0x2543, 0, 0xE2B2, 128 + 0xEB2F, 0x2543, 0xFA01, 0x0B1F, 129 + 0, 0x2543, 0x4489, 0xDB42 } }, 126 130 { COLOR_SPACE_2020_RGB_LIMITEDRANGE, 127 131 { 0x35E0, 0x255F, 0, 0xE2B3, 128 132 0xEB20, 0x255F, 0xF9FD, 0xB1E,
+2 -2
drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
··· 383 383 colorimetryFormat = ColorimetryYCC_DP_ITU709; 384 384 else if (cs == COLOR_SPACE_ADOBERGB) 385 385 colorimetryFormat = ColorimetryYCC_DP_AdobeYCC; 386 - else if (cs == COLOR_SPACE_2020_YCBCR) 386 + else if (cs == COLOR_SPACE_2020_YCBCR_LIMITED) 387 387 colorimetryFormat = ColorimetryYCC_DP_ITU2020YCbCr; 388 388 389 - if (cs == COLOR_SPACE_2020_YCBCR && tf == TRANSFER_FUNC_GAMMA_22) 389 + if (cs == COLOR_SPACE_2020_YCBCR_LIMITED && tf == TRANSFER_FUNC_GAMMA_22) 390 390 colorimetryFormat = ColorimetryYCC_DP_ITU709; 391 391 break; 392 392