Commit 81262b16 authored by Melissa Wen's avatar Melissa Wen Committed by Alex Deucher
Browse files

drm/amd/display: restore edid reading from a given i2c adapter



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.hung@amd.com>
CC: Mario Limonciello <mario.limonciello@amd.com>
CC: Roman Li <Roman.Li@amd.com>
CC: Aurabindo Pillai <Aurabindo.Pillai@amd.com>
Fixes: 48edb2a4 ("drm/amd/display: switch amdgpu_dm_connector to use struct drm_edid")
Reviewed-by: default avatarAlex Hung <alex.hung@amd.com>
Signed-off-by: default avatarMelissa Wen <mwen@igalia.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 9d8af72f
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -7295,8 +7295,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);
@@ -7341,14 +7347,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;

	if (dc_link && dc_link->aux_mode)
		ddc = &aconnector->dm_dp_aux.aux.ddc;
	else
		ddc = &aconnector->i2c->base;

	drm_edid = drm_edid_read(connector);
	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);