]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/amd/display: Send correct DP colorspace infopacket
authorHarry Wentland <harry.wentland@amd.com>
Tue, 29 Mar 2022 19:30:05 +0000 (15:30 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 16:47:05 +0000 (12:47 -0400)
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>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index 49be49c85c5025aefab2564362a31f7adc9dd893..67dad847fd042271a62e23a930b0cfb47df7d5e7 100644 (file)
@@ -5339,21 +5339,44 @@ get_aspect_ratio(const struct drm_display_mode *mode_in)
 }
 
 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;
 
-       switch (dc_crtc_timing->pixel_encoding) {
-       case PIXEL_ENCODING_YCBCR422:
-       case PIXEL_ENCODING_YCBCR444:
-       case PIXEL_ENCODING_YCBCR420:
-       {
+       switch (connector_state->colorspace) {
+       case DRM_MODE_COLORIMETRY_BT601_YCC:
+               if (dc_crtc_timing->flags.Y_ONLY)
+                       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
                 * according to HDMI spec, we use YCbCr709 and YCbCr601
                 * 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)
                                color_space =
                                        COLOR_SPACE_YCBCR709_LIMITED;
@@ -5366,15 +5389,6 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing)
                        else
                                color_space = COLOR_SPACE_YCBCR601;
                }
-
-       }
-       break;
-       case PIXEL_ENCODING_RGB:
-               color_space = COLOR_SPACE_SRGB;
-               break;
-
-       default:
-               WARN_ON(1);
                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,