From: Ilya <ilya.bakou...@amd.com>

[Why]
Hotplugging the VGA side of some DP/VGA adapters caused the display to
light up with the wrong (non-native) resolution.

This is caused by the adapter misbehaving by reporting the wrong number
of downstream ports when the VGA side is unplugged (reports 1 instead of
0), but only if the SINK_COUNT DPCD register is read more than once.

[How]
To work around the adapter behavior, remove the sink if link is
detected, but EDID cannot be read.

Reviewed-by: Wenjing Liu <wenjing....@amd.com>
Acked-by: Solomon Chiu <solomon.c...@amd.com>
Signed-off-by: Ilya <ilya.bakou...@amd.com>
---
 drivers/gpu/drm/amd/display/dc/core/dc_link.c    | 16 ++++++++++++++++
 .../gpu/drm/amd/display/dc/core/dc_link_ddc.c    |  3 +++
 2 files changed, 19 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index 48858e31b092..c553d0ea63d3 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -1197,6 +1197,22 @@ static bool detect_link_and_local_sink(struct dc_link 
*link,
 
                                return false;
                        }
+
+                       if (link->type == dc_connection_sst_branch &&
+                                       link->dpcd_caps.dongle_type ==
+                                               DISPLAY_DONGLE_DP_VGA_CONVERTER 
&&
+                                       reason == DETECT_REASON_HPDRX) {
+                               /* Abort detection for DP-VGA adapters when EDID
+                                * can't be read and detection reason is 
VGA-side
+                                * hotplug
+                                */
+                               if (prev_sink)
+                                       dc_sink_release(prev_sink);
+                               link_disconnect_sink(link);
+
+                               return true;
+                       }
+
                        break;
                default:
                        break;
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
index 24dc662ec3e4..f1bbd918de35 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_ddc.c
@@ -298,6 +298,9 @@ static uint32_t defer_delay_converter_wa(
 
        if (link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_VGA_CONVERTER &&
                link->dpcd_caps.branch_dev_id == DP_BRANCH_DEVICE_ID_0080E1 &&
+               (link->dpcd_caps.branch_fw_revision[0] < 0x01 ||
+                               (link->dpcd_caps.branch_fw_revision[0] == 0x01 
&&
+                               link->dpcd_caps.branch_fw_revision[1] < 0x40)) 
&&
                !memcmp(link->dpcd_caps.branch_dev_name,
                    DP_VGA_DONGLE_BRANCH_DEV_NAME,
                        sizeof(link->dpcd_caps.branch_dev_name)))
-- 
2.25.1

Reply via email to