When switching to drm_edid, we slightly changed how to get edid by
removing the possibility of getting them from dc_link when in aux
transaction mode. As MST doesn't initialize the connector with
`drm_connector_init_with_ddc()`, restore the original behavior to avoid
functional changes.

v2:
- Fix build warning of unchecked dereference (kernel test bot)

CC: Alex Hung <alex.h...@amd.com>
CC: Mario Limonciello <mario.limoncie...@amd.com>
CC: Roman Li <roman...@amd.com>
CC: Aurabindo Pillai <aurabindo.pil...@amd.com>
Fixes: 48edb2a4256e ("drm/amd/display: switch amdgpu_dm_connector to use struct 
drm_edid")
Signed-off-by: Melissa Wen <m...@igalia.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c   | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index a8421c07b160..142d366e3347 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -7269,8 +7269,14 @@ static void amdgpu_dm_connector_funcs_force(struct 
drm_connector *connector)
        struct dc_link *dc_link = aconnector->dc_link;
        struct dc_sink *dc_em_sink = aconnector->dc_em_sink;
        const struct drm_edid *drm_edid;
+       struct i2c_adapter *ddc;
 
-       drm_edid = drm_edid_read(connector);
+       if (dc_link && dc_link->aux_mode)
+               ddc = &aconnector->dm_dp_aux.aux.ddc;
+       else
+               ddc = &aconnector->i2c->base;
+
+       drm_edid = drm_edid_read_ddc(connector, ddc);
        drm_edid_connector_update(connector, drm_edid);
        if (!drm_edid) {
                DRM_ERROR("No EDID found on connector: %s.\n", connector->name);
@@ -7315,14 +7321,21 @@ static int get_modes(struct drm_connector *connector)
 static void create_eml_sink(struct amdgpu_dm_connector *aconnector)
 {
        struct drm_connector *connector = &aconnector->base;
+       struct dc_link *dc_link = aconnector->dc_link;
        struct dc_sink_init_data init_params = {
                        .link = aconnector->dc_link,
                        .sink_signal = SIGNAL_TYPE_VIRTUAL
        };
        const struct drm_edid *drm_edid;
        const struct edid *edid;
+       struct i2c_adapter *ddc;
 
-       drm_edid = drm_edid_read(connector);
+       if (dc_link && dc_link->aux_mode)
+               ddc = &aconnector->dm_dp_aux.aux.ddc;
+       else
+               ddc = &aconnector->i2c->base;
+
+       drm_edid = drm_edid_read_ddc(connector, ddc);
        drm_edid_connector_update(connector, drm_edid);
        if (!drm_edid) {
                DRM_ERROR("No EDID found on connector: %s.\n", connector->name);
-- 
2.47.2

Reply via email to