]> xenbits.xensource.com Git - people/aperard/linux.git/commitdiff
drm/amd/display: Wrong colorimetry workaround
authorMa Hanghong <hanghong.ma@amd.com>
Thu, 20 Oct 2022 15:46:56 +0000 (11:46 -0400)
committerSasha Levin <sashal@kernel.org>
Fri, 15 Mar 2024 14:48:21 +0000 (10:48 -0400)
[ Upstream commit b1a98cf89a695d36c414653634ea7ba91b6e701f ]

[Why]
For FreeSync HDR, native color space flag in AMD VSIF(BT.709) should be
used when intepreting content and color space flag in VSC or AVI
infoFrame should be ignored. However, it turned out some userspace
application still use color flag in VSC or AVI infoFrame which is
incorrect.

[How]
Transfer function is used when building the VSC and AVI infoFrame. Set
colorimetry to BT.709 when all the following match:

1. Pixel format is YCbCr;
2. In FreeSync 2 HDR, color is COLOR_SPACE_2020_YCBCR;
3. Transfer function is TRANSFER_FUNC_GAMMA_22;

Tested-by: Mark Broadworth <mark.broadworth@amd.com>
Reviewed-by: Krunoslav Kovac <Krunoslav.Kovac@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Ma Hanghong <hanghong.ma@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Stable-dep-of: e6a7df96facd ("drm/amd/display: Fix MST Null Ptr for RV")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h
drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c

index da16048bf1004efa083409133d99f1329bafc403..bea49befdcaccefb8e9fad2d9089225b840b8c18 100644 (file)
@@ -5938,6 +5938,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
        bool scale = dm_state ? (dm_state->scaling != RMX_OFF) : false;
        int mode_refresh;
        int preferred_refresh = 0;
+       enum color_transfer_func tf = TRANSFER_FUNC_UNKNOWN;
 #if defined(CONFIG_DRM_AMD_DC_DCN)
        struct dsc_dec_dpcd_caps dsc_caps;
 #endif
@@ -6071,7 +6072,9 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
                        if (stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED)
                                stream->use_vsc_sdp_for_colorimetry = true;
                }
-               mod_build_vsc_infopacket(stream, &stream->vsc_infopacket, stream->output_color_space);
+               if (stream->out_transfer_func->tf == TRANSFER_FUNCTION_GAMMA22)
+                       tf = TRANSFER_FUNC_GAMMA_22;
+               mod_build_vsc_infopacket(stream, &stream->vsc_infopacket, stream->output_color_space, tf);
                aconnector->psr_skip_count = AMDGPU_DM_PSR_ENTRY_DELAY;
 
        }
index 66923f51037a3f2c481c5457362d595201353e22..e2f80cd0ca8cbd8ade8d6ac8a493c4e45a6e1dbb 100644 (file)
@@ -3038,6 +3038,12 @@ static void set_avi_info_frame(
                hdmi_info.bits.C0_C1   = COLORIMETRY_EXTENDED;
        }
 
+       if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR &&
+                       stream->out_transfer_func->tf == TRANSFER_FUNCTION_GAMMA22) {
+               hdmi_info.bits.EC0_EC2 = 0;
+               hdmi_info.bits.C0_C1 = COLORIMETRY_ITU709;
+       }
+
        /* TODO: un-hardcode aspect ratio */
        aspect = stream->timing.aspect_ratio;
 
index 1d8b746b02f248334e966bddf7695304cbcc22ba..edf5845f6a1f77082ac3dc62b00265d2f49f89bb 100644 (file)
@@ -35,7 +35,8 @@ struct mod_vrr_params;
 
 void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
                struct dc_info_packet *info_packet,
-               enum dc_color_space cs);
+               enum dc_color_space cs,
+               enum color_transfer_func tf);
 
 void mod_build_hf_vsif_infopacket(const struct dc_stream_state *stream,
                struct dc_info_packet *info_packet);
index 27ceba9d6d6581e0def0225644413b1223ac525e..69691058ab89817c6d7edf50fc47c49cd9fcbcbd 100644 (file)
@@ -132,7 +132,8 @@ enum ColorimetryYCCDP {
 
 void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
                struct dc_info_packet *info_packet,
-               enum dc_color_space cs)
+               enum dc_color_space cs,
+               enum color_transfer_func tf)
 {
        unsigned int vsc_packet_revision = vsc_packet_undefined;
        unsigned int i;
@@ -382,6 +383,9 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
                                colorimetryFormat = ColorimetryYCC_DP_AdobeYCC;
                        else if (cs == COLOR_SPACE_2020_YCBCR)
                                colorimetryFormat = ColorimetryYCC_DP_ITU2020YCbCr;
+
+                       if (cs == COLOR_SPACE_2020_YCBCR && tf == TRANSFER_FUNC_GAMMA_22)
+                               colorimetryFormat = ColorimetryYCC_DP_ITU709;
                        break;
 
                default: