]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: Rework HDMI data channel reads
authorRelja Vojvodic <rvojvodi@amd.com>
Wed, 24 Sep 2025 13:33:35 +0000 (09:33 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 20 Oct 2025 22:20:48 +0000 (18:20 -0400)
Fix the HDMI data channel reads to respect scdc_present field
to pass compliance test.

Reviewed-by: Wenjing Liu <wenjing.liu@amd.com>
Signed-off-by: Relja Vojvodic <rvojvodi@amd.com>
Signed-off-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc_types.h
drivers/gpu/drm/amd/display/dc/link/link_detection.c
drivers/gpu/drm/amd/display/dc/link/protocols/link_ddc.c

index b5aa03a3e39cf48fa3b165d9f7996d97dca259e3..8f8ccde7ad94e82e4b4f2e65c8d58e6bf41f442e 100644 (file)
@@ -212,6 +212,7 @@ struct dc_edid_caps {
        bool edid_hdmi;
        bool hdr_supported;
        bool rr_capable;
+       bool scdc_present;
 
        struct dc_panel_patch panel_patch;
 };
index 85303167a5531255a965ca8a8868607a0ba6df51..82a9e52d5ae5fdccc17107bc95db9a438870f948 100644 (file)
@@ -270,6 +270,10 @@ static void read_scdc_caps(struct ddc_service *ddc_service,
        uint8_t slave_address = HDMI_SCDC_ADDRESS;
        uint8_t offset = HDMI_SCDC_MANUFACTURER_OUI;
 
+       if (ddc_service->link->local_sink &&
+               !ddc_service->link->local_sink->edid_caps.scdc_present)
+               return;
+
        link_query_ddc_data(ddc_service, slave_address, &offset,
                        sizeof(offset), sink->scdc_caps.manufacturer_OUI.byte,
                        sizeof(sink->scdc_caps.manufacturer_OUI.byte));
index 267180e7bc48fb7fa9ac6d9c266af94698121279..5d2bcce2f669d1e9fb6f6ba30482ae08e4c217f2 100644 (file)
@@ -549,7 +549,8 @@ void write_scdc_data(struct ddc_service *ddc_service,
        /*Lower than 340 Scramble bit from SCDC caps*/
 
        if (ddc_service->link->local_sink &&
-               ddc_service->link->local_sink->edid_caps.panel_patch.skip_scdc_overwrite)
+               (ddc_service->link->local_sink->edid_caps.panel_patch.skip_scdc_overwrite ||
+               !ddc_service->link->local_sink->edid_caps.scdc_present))
                return;
 
        link_query_ddc_data(ddc_service, slave_address, &offset,