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 eventually 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.

Use the connector DDC probe callback to report the connection type already
established by Display Core. This lets DRM core reach its unified override
and firmware EDID handling without making an override force a disconnected
connector on.

Reported-by: Curtis Vogt <[email protected]>
Closes: https://gitlab.freedesktop.org/drm/amd/-/work_items/5779
Signed-off-by: Mario Limonciello <[email protected]>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c   | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
index 25f168a8ea311..a3ab26b68a889 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
@@ -2071,7 +2071,15 @@ STATIC_IFN_KUNIT void 
amdgpu_dm_connector_funcs_force(struct drm_connector *conn
 }
 EXPORT_IF_KUNIT(amdgpu_dm_connector_funcs_force);
 
+static bool amdgpu_dm_connector_probe_ddc(struct drm_connector *connector)
+{
+       struct amdgpu_dm_connector *aconnector = 
to_amdgpu_dm_connector(connector);
+
+       return aconnector->dc_link->type != dc_connection_none;
+}
+
 static const struct drm_connector_funcs amdgpu_dm_connector_funcs = {
+       .probe_ddc = amdgpu_dm_connector_probe_ddc,
        .reset = amdgpu_dm_connector_funcs_reset,
        .detect = amdgpu_dm_connector_detect,
        .fill_modes = drm_helper_probe_single_connector_modes,
-- 
2.43.0

Reply via email to