aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLyude Paul <lyude@redhat.com>2018-10-08 19:24:30 -0400
committerJoonas Lahtinen <joonas.lahtinen@linux.intel.com>2018-10-19 04:11:53 -0400
commite96550956fbcd090629c0e2b5b8cded2eded2adf (patch)
tree7f8827c4bfc7e29719a5c3741c006660b617deef
parentf2bfc71aee75feff33ca659322b72ffeed5a243d (diff)
drm/atomic_helper: Disallow new modesets on unregistered connectors
With the exception of modesets which would switch the DPMS state of a connector from on to off, we want to make sure that we disallow all modesets which would result in enabling a new monitor or a new mode configuration on a monitor if the connector for the display in question is no longer registered. This allows us to stop userspace from trying to enable new displays on connectors for an MST topology that were just removed from the system, without preventing userspace from disabling DPMS on those connectors. Changes since v5: - Fix typo in comment, nothing else Signed-off-by: Lyude Paul <lyude@redhat.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: stable@vger.kernel.org Link: https://patchwork.freedesktop.org/patch/msgid/20181008232437.5571-2-lyude@redhat.com (cherry picked from commit 4d80273976bf880c4bed9359b8f2d45663140c86) Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
-rw-r--r--drivers/gpu/drm/drm_atomic_helper.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index e49b22381048..20bd176138a0 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -308,6 +308,26 @@ update_connector_routing(struct drm_atomic_state *state,
308 return 0; 308 return 0;
309 } 309 }
310 310
311 crtc_state = drm_atomic_get_new_crtc_state(state,
312 new_connector_state->crtc);
313 /*
314 * For compatibility with legacy users, we want to make sure that
315 * we allow DPMS On->Off modesets on unregistered connectors. Modesets
316 * which would result in anything else must be considered invalid, to
317 * avoid turning on new displays on dead connectors.
318 *
319 * Since the connector can be unregistered at any point during an
320 * atomic check or commit, this is racy. But that's OK: all we care
321 * about is ensuring that userspace can't do anything but shut off the
322 * display on a connector that was destroyed after its been notified,
323 * not before.
324 */
325 if (!READ_ONCE(connector->registered) && crtc_state->active) {
326 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] is not registered\n",
327 connector->base.id, connector->name);
328 return -EINVAL;
329 }
330
311 funcs = connector->helper_private; 331 funcs = connector->helper_private;
312 332
313 if (funcs->atomic_best_encoder) 333 if (funcs->atomic_best_encoder)
@@ -352,7 +372,6 @@ update_connector_routing(struct drm_atomic_state *state,
352 372
353 set_best_encoder(state, new_connector_state, new_encoder); 373 set_best_encoder(state, new_connector_state, new_encoder);
354 374
355 crtc_state = drm_atomic_get_new_crtc_state(state, new_connector_state->crtc);
356 crtc_state->connectors_changed = true; 375 crtc_state->connectors_changed = true;
357 376
358 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n", 377 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n",