Display Core determines whether a digital sink is physically connected
from HPD before dm_helpers_read_local_edid() attempts to acquire its EDID.

The helper currently calls drm_edid_read_ddc(). For an unforced connector,
that function probes DDC before consulting a debugfs or firmware override.
If a present sink stops responding over DDC, the probe returns early. The
configured override is ignored, and AMDGPU creates a 640x480 fallback mode.
That also prevents DRM's later override fallback from running.

Read an explicit override before trying ACPI, VBIOS, or DDC sources. Since
DC has already established physical presence, this does not make the EDID
override force a disconnected connector on. The existing successful-read
path updates the DRM connector and copies and parses the EDID into dc_sink,
keeping DRM and Display Core state synchronized.

Fixes: 7c7f5b15be65 ("drm/amd/display: Refactor edid read.")
Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/5779
Cc: [email protected]
Signed-off-by: Mario Limonciello <[email protected]>
---
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c  | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
index d451082552e83..b8f02c854667e 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
@@ -1244,12 +1244,16 @@ enum dc_edid_status dm_helpers_read_local_edid(
         * do check sum and retry to make sure read correct edid.
         */
        do {
-               drm_edid = dm_helpers_read_acpi_edid(aconnector);
-               if (drm_edid)
-                       drm_info(connector->dev, "Using ACPI provided EDID for 
%s\n", connector->name);
-               else if (!ddc)
+               drm_edid = drm_edid_read_override(connector);
+               if (!drm_edid) {
+                       drm_edid = dm_helpers_read_acpi_edid(aconnector);
+                       if (drm_edid)
+                               drm_info(connector->dev, "Using ACPI provided 
EDID for %s\n",
+                                        connector->name);
+               }
+               if (!drm_edid && !ddc)
                        drm_edid = dm_helpers_read_vbios_hardcoded_edid(link, 
aconnector);
-               else
+               else if (!drm_edid)
                        drm_edid = drm_edid_read_ddc(connector, ddc);
                drm_edid_connector_update(connector, drm_edid);
 
-- 
2.43.0

Reply via email to