diff options
author | Harry Wentland <harry.wentland@amd.com> | 2018-03-08 22:05:35 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-04-25 11:07:50 -0400 |
commit | c7b8de00384be49dc1617a838b0ce89a0235f319 (patch) | |
tree | b95720528fcb4d29b7cb5de76f43ddcd271dd000 | |
parent | f2877656809386d7bc62c2b1c1b4e58404c486d4 (diff) |
drm/amd/display: Don't read EDID in atomic_check
We shouldn't attempt to read EDID in atomic_check. We really shouldn't
even be modifying the connector object, or any other non-state object,
but this is a start at least.
Moving EDID cleanup to dm_dp_mst_connector_destroy from
dm_dp_destroy_mst_connector to ensure the EDID is still available for
headless mode.
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
-rw-r--r-- | drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 32 |
1 files changed, 10 insertions, 22 deletions
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index 8291d74f26bc..305292a9ff80 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | |||
@@ -161,6 +161,11 @@ dm_dp_mst_connector_destroy(struct drm_connector *connector) | |||
161 | struct amdgpu_dm_connector *amdgpu_dm_connector = to_amdgpu_dm_connector(connector); | 161 | struct amdgpu_dm_connector *amdgpu_dm_connector = to_amdgpu_dm_connector(connector); |
162 | struct amdgpu_encoder *amdgpu_encoder = amdgpu_dm_connector->mst_encoder; | 162 | struct amdgpu_encoder *amdgpu_encoder = amdgpu_dm_connector->mst_encoder; |
163 | 163 | ||
164 | if (amdgpu_dm_connector->edid) { | ||
165 | kfree(amdgpu_dm_connector->edid); | ||
166 | amdgpu_dm_connector->edid = NULL; | ||
167 | } | ||
168 | |||
164 | drm_encoder_cleanup(&amdgpu_encoder->base); | 169 | drm_encoder_cleanup(&amdgpu_encoder->base); |
165 | kfree(amdgpu_encoder); | 170 | kfree(amdgpu_encoder); |
166 | drm_connector_cleanup(connector); | 171 | drm_connector_cleanup(connector); |
@@ -181,28 +186,22 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = { | |||
181 | void dm_dp_mst_dc_sink_create(struct drm_connector *connector) | 186 | void dm_dp_mst_dc_sink_create(struct drm_connector *connector) |
182 | { | 187 | { |
183 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); | 188 | struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); |
184 | struct edid *edid; | ||
185 | struct dc_sink *dc_sink; | 189 | struct dc_sink *dc_sink; |
186 | struct dc_sink_init_data init_params = { | 190 | struct dc_sink_init_data init_params = { |
187 | .link = aconnector->dc_link, | 191 | .link = aconnector->dc_link, |
188 | .sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST }; | 192 | .sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST }; |
189 | 193 | ||
194 | /* FIXME none of this is safe. we shouldn't touch aconnector here in | ||
195 | * atomic_check | ||
196 | */ | ||
197 | |||
190 | /* | 198 | /* |
191 | * TODO: Need to further figure out why ddc.algo is NULL while MST port exists | 199 | * TODO: Need to further figure out why ddc.algo is NULL while MST port exists |
192 | */ | 200 | */ |
193 | if (!aconnector->port || !aconnector->port->aux.ddc.algo) | 201 | if (!aconnector->port || !aconnector->port->aux.ddc.algo) |
194 | return; | 202 | return; |
195 | 203 | ||
196 | edid = drm_dp_mst_get_edid(connector, &aconnector->mst_port->mst_mgr, aconnector->port); | 204 | ASSERT(aconnector->edid); |
197 | |||
198 | if (!edid) { | ||
199 | drm_mode_connector_update_edid_property( | ||
200 | &aconnector->base, | ||
201 | NULL); | ||
202 | return; | ||
203 | } | ||
204 | |||
205 | aconnector->edid = edid; | ||
206 | 205 | ||
207 | dc_sink = dc_link_add_remote_sink( | 206 | dc_sink = dc_link_add_remote_sink( |
208 | aconnector->dc_link, | 207 | aconnector->dc_link, |
@@ -215,9 +214,6 @@ void dm_dp_mst_dc_sink_create(struct drm_connector *connector) | |||
215 | 214 | ||
216 | amdgpu_dm_add_sink_to_freesync_module( | 215 | amdgpu_dm_add_sink_to_freesync_module( |
217 | connector, aconnector->edid); | 216 | connector, aconnector->edid); |
218 | |||
219 | drm_mode_connector_update_edid_property( | ||
220 | &aconnector->base, aconnector->edid); | ||
221 | } | 217 | } |
222 | 218 | ||
223 | static int dm_dp_mst_get_modes(struct drm_connector *connector) | 219 | static int dm_dp_mst_get_modes(struct drm_connector *connector) |
@@ -424,14 +420,6 @@ static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
424 | dc_sink_release(aconnector->dc_sink); | 420 | dc_sink_release(aconnector->dc_sink); |
425 | aconnector->dc_sink = NULL; | 421 | aconnector->dc_sink = NULL; |
426 | } | 422 | } |
427 | if (aconnector->edid) { | ||
428 | kfree(aconnector->edid); | ||
429 | aconnector->edid = NULL; | ||
430 | } | ||
431 | |||
432 | drm_mode_connector_update_edid_property( | ||
433 | &aconnector->base, | ||
434 | NULL); | ||
435 | 423 | ||
436 | aconnector->mst_connected = false; | 424 | aconnector->mst_connected = false; |
437 | } | 425 | } |