Commit 07bc2dcb authored by Ilya Bakoulin's avatar Ilya Bakoulin Committed by Alex Deucher
Browse files

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: default avatarKrunoslav Kovac <krunoslav.kovac@amd.com>
Signed-off-by: default avatarIlya Bakoulin <Ilya.Bakoulin@amd.com>
Signed-off-by: default avatarRoman Li <roman.li@amd.com>
Tested-by: default avatarRobert Mader <robert.mader@collabora.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 9856893f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -5624,9 +5624,9 @@ fill_plane_color_attributes(const struct drm_plane_state *plane_state,

	case DRM_COLOR_YCBCR_BT2020:
		if (full_range)
			*color_space = COLOR_SPACE_2020_YCBCR;
			*color_space = COLOR_SPACE_2020_YCBCR_FULL;
		else
			return -EINVAL;
			*color_space = COLOR_SPACE_2020_YCBCR_LIMITED;
		break;

	default:
@@ -6122,7 +6122,7 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing,
		if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB)
			color_space = COLOR_SPACE_2020_RGB_FULLRANGE;
		else
			color_space = COLOR_SPACE_2020_YCBCR;
			color_space = COLOR_SPACE_2020_YCBCR_LIMITED;
		break;
	case DRM_MODE_COLORIMETRY_DEFAULT: // ITU601
	default:
+1 −1
Original line number Diff line number Diff line
@@ -1169,7 +1169,7 @@ static int amdgpu_current_colorspace_show(struct seq_file *m, void *data)
	case COLOR_SPACE_2020_RGB_FULLRANGE:
		seq_puts(m, "BT2020_RGB");
		break;
	case COLOR_SPACE_2020_YCBCR:
	case COLOR_SPACE_2020_YCBCR_LIMITED:
		seq_puts(m, "BT2020_YCC");
		break;
	default:
+2 −1
Original line number Diff line number Diff line
@@ -40,7 +40,8 @@ bool is_rgb_cspace(enum dc_color_space output_color_space)
	case COLOR_SPACE_YCBCR709:
	case COLOR_SPACE_YCBCR601_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;
	default:
		/* Add a case to switch */
+3 −2
Original line number Diff line number Diff line
@@ -176,7 +176,7 @@ static bool is_ycbcr2020_type(
{
	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;
	return ret;
}
@@ -247,7 +247,8 @@ void color_space_to_black_color(
	case COLOR_SPACE_YCBCR709_BLACK:
	case COLOR_SPACE_YCBCR601_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];
		break;

+2 −2
Original line number Diff line number Diff line
@@ -4488,7 +4488,7 @@ static void set_avi_info_frame(
		break;
	case COLOR_SPACE_2020_RGB_FULLRANGE:
	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.C0_C1   = COLORIMETRY_EXTENDED;
		break;
@@ -4502,7 +4502,7 @@ static void set_avi_info_frame(
		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) {
		hdmi_info.bits.EC0_EC2 = 0;
		hdmi_info.bits.C0_C1 = COLORIMETRY_ITU709;
Loading