]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: Implement DDC probe over AUX channel
authorTimur Kristóf <timur.kristof@gmail.com>
Mon, 26 Jan 2026 21:08:30 +0000 (22:08 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 23 Feb 2026 19:28:32 +0000 (14:28 -0500)
DDC probe means that we use the DDC (Display Data Channel) to
verify whether a display is connected or not.

This was written with mainly analog connectors in mind, so it
didn't work over the AUX channel. However, in order to support
external DP bridge encoders found in CIK APUs, it needs to work
over the AUX channel too.

Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/link/link_detection.c

index 45a0b25c4ccf0dade160aa12d43d0b1eb5790f98..8fd796d987b634f71ac1ab48aefb8c5c22b65048 100644 (file)
@@ -903,11 +903,18 @@ static bool link_detect_evaluate_edid_header(uint8_t edid_header[8])
  */
 static bool link_detect_ddc_probe(struct dc_link *link)
 {
+       enum signal_type signal = link_detect_sink_signal_type(link, DETECT_REASON_HPD);
+       enum ddc_transaction_type transaction_type = get_ddc_transaction_type(signal);
+       uint8_t edid_header[8] = {0};
+       uint8_t zero = 0;
+       bool ddc_probed;
+
        if (!link->ddc)
                return false;
 
-       uint8_t edid_header[8] = {0};
-       bool ddc_probed = i2c_read(link->ddc, 0x50, edid_header, sizeof(edid_header));
+       set_ddc_transaction_type(link->ddc, transaction_type);
+
+       ddc_probed = link_query_ddc_data(link->ddc, 0x50, &zero, 1, edid_header, sizeof(edid_header));
 
        if (!ddc_probed)
                return false;