drm/amd/display: Send correct DP colorspace infopacket

Look at connector->colorimetry to determine output colorspace.

We don't want to impact current SDR behavior, so
DRM_MODE_COLORIMETRY_DEFAULT preserves current behavior.

Also add support to explicitly set BT601 and BT709.

v4:
- Roll support for BT709 and BT601 into this patch
- Add default case to avoid warnings for unhandled
  enum values

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Reviewed-by: Joshua Ashton <joshua@froggi.es>

Cc: Pekka Paalanen <ppaalanen@gmail.com>
Cc: Sebastian Wick <sebastian.wick@redhat.com>
Cc: Vitaly.Prosyak@amd.com
Cc: Joshua Ashton <joshua@froggi.es>
Cc: Simon Ser <contact@emersion.fr>
Cc: Melissa Wen <mwen@igalia.com>
Cc: dri-devel@lists.freedesktop.org
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Harry Wentland 2022-03-29 15:30:05 -04:00 committed by Alex Deucher
parent a0b433c858
commit 2e656827ce

View file

@ -5339,21 +5339,44 @@ get_aspect_ratio(const struct drm_display_mode *mode_in)
} }
static enum dc_color_space static enum dc_color_space
get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing) get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing,
const struct drm_connector_state *connector_state)
{ {
enum dc_color_space color_space = COLOR_SPACE_SRGB; enum dc_color_space color_space = COLOR_SPACE_SRGB;
switch (dc_crtc_timing->pixel_encoding) { switch (connector_state->colorspace) {
case PIXEL_ENCODING_YCBCR422: case DRM_MODE_COLORIMETRY_BT601_YCC:
case PIXEL_ENCODING_YCBCR444: if (dc_crtc_timing->flags.Y_ONLY)
case PIXEL_ENCODING_YCBCR420: color_space = COLOR_SPACE_YCBCR601_LIMITED;
{ else
color_space = COLOR_SPACE_YCBCR601;
break;
case DRM_MODE_COLORIMETRY_BT709_YCC:
if (dc_crtc_timing->flags.Y_ONLY)
color_space = COLOR_SPACE_YCBCR709_LIMITED;
else
color_space = COLOR_SPACE_YCBCR709;
break;
case DRM_MODE_COLORIMETRY_OPRGB:
color_space = COLOR_SPACE_ADOBERGB;
break;
case DRM_MODE_COLORIMETRY_BT2020_RGB:
case DRM_MODE_COLORIMETRY_BT2020_YCC:
if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB)
color_space = COLOR_SPACE_2020_RGB_FULLRANGE;
else
color_space = COLOR_SPACE_2020_YCBCR;
break;
case DRM_MODE_COLORIMETRY_DEFAULT: // ITU601
default:
if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB) {
color_space = COLOR_SPACE_SRGB;
/* /*
* 27030khz is the separation point between HDTV and SDTV * 27030khz is the separation point between HDTV and SDTV
* according to HDMI spec, we use YCbCr709 and YCbCr601 * according to HDMI spec, we use YCbCr709 and YCbCr601
* respectively * respectively
*/ */
if (dc_crtc_timing->pix_clk_100hz > 270300) { } else if (dc_crtc_timing->pix_clk_100hz > 270300) {
if (dc_crtc_timing->flags.Y_ONLY) if (dc_crtc_timing->flags.Y_ONLY)
color_space = color_space =
COLOR_SPACE_YCBCR709_LIMITED; COLOR_SPACE_YCBCR709_LIMITED;
@ -5366,15 +5389,6 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing)
else else
color_space = COLOR_SPACE_YCBCR601; color_space = COLOR_SPACE_YCBCR601;
} }
}
break;
case PIXEL_ENCODING_RGB:
color_space = COLOR_SPACE_SRGB;
break;
default:
WARN_ON(1);
break; break;
} }
@ -5513,7 +5527,7 @@ static void fill_stream_properties_from_drm_display_mode(
} }
} }
stream->output_color_space = get_output_color_space(timing_out); stream->output_color_space = get_output_color_space(timing_out, connector_state);
} }
static void fill_audio_info(struct audio_info *audio_info, static void fill_audio_info(struct audio_info *audio_info,