diff options
Diffstat (limited to 'drivers/gpu/drm/drm_atomic_uapi.c')
| -rw-r--r-- | drivers/gpu/drm/drm_atomic_uapi.c | 21 | 
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c index d5b7f315098c..a22d6f269b07 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -299,6 +299,27 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,  	struct drm_connector *connector = conn_state->connector;  	struct drm_crtc_state *crtc_state; +	/* +	 * For compatibility with legacy users, we want to make sure that +	 * we allow DPMS On<->Off modesets on unregistered connectors, since +	 * legacy modesetting users will not be expecting these to fail. We do +	 * not however, want to allow legacy users to assign a connector +	 * that's been unregistered from sysfs to another CRTC, since doing +	 * this with a now non-existent connector could potentially leave us +	 * in an invalid state. +	 * +	 * 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 use this connector for new +	 * configurations after it's been notified that the connector is no +	 * longer present. +	 */ +	if (!READ_ONCE(connector->registered) && crtc) { +		DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] is not registered\n", +				 connector->base.id, connector->name); +		return -EINVAL; +	} +  	if (conn_state->crtc == crtc)  		return 0;  | 
