|
@@ -308,6 +308,26 @@ update_connector_routing(struct drm_atomic_state *state,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ crtc_state = drm_atomic_get_new_crtc_state(state,
|
|
|
+ new_connector_state->crtc);
|
|
|
+ /*
|
|
|
+ * For compatibility with legacy users, we want to make sure that
|
|
|
+ * we allow DPMS On->Off modesets on unregistered connectors. Modesets
|
|
|
+ * which would result in anything else must be considered invalid, to
|
|
|
+ * avoid turning on new displays on dead connectors.
|
|
|
+ *
|
|
|
+ * Since the connector can be unregistered at any point during an
|
|
|
+ * atomic check or commit, this is racy. But that's OK: all we care
|
|
|
+ * about is ensuring that userspace can't do anything but shut off the
|
|
|
+ * display on a connector that was destroyed after its been notified,
|
|
|
+ * not before.
|
|
|
+ */
|
|
|
+ if (!READ_ONCE(connector->registered) && crtc_state->active) {
|
|
|
+ DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] is not registered\n",
|
|
|
+ connector->base.id, connector->name);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
funcs = connector->helper_private;
|
|
|
|
|
|
if (funcs->atomic_best_encoder)
|
|
@@ -352,7 +372,6 @@ update_connector_routing(struct drm_atomic_state *state,
|
|
|
|
|
|
set_best_encoder(state, new_connector_state, new_encoder);
|
|
|
|
|
|
- crtc_state = drm_atomic_get_new_crtc_state(state, new_connector_state->crtc);
|
|
|
crtc_state->connectors_changed = true;
|
|
|
|
|
|
DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n",
|