Fully remove the MST connector from the atomic state, and remove the early returns in check_*_state for MST connectors. With atomic the state can be made consistent all the time. Changes since v1: - Remove the MST check in intel_connector_check_state too. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> Reviewed-by: Ander Conselvan de Oliveira <conselvan2@xxxxxxxxx> --- diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 7747520bf9f6..dfe4407b0390 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -6370,10 +6370,6 @@ static void intel_connector_check_state(struct intel_connector *connector) connector->base.base.id, connector->base.name); - /* there is no real hw state for MST connectors */ - if (connector->mst_port) - return; - I915_STATE_WARN(connector->base.dpms == DRM_MODE_DPMS_OFF, "wrong connector dpms state\n"); I915_STATE_WARN(connector->base.encoder != &encoder->base, @@ -12751,13 +12747,6 @@ check_encoder_state(struct drm_device *dev) encoder->base.crtc, "connector's crtc doesn't match encoder crtc\n"); } - /* - * for MST connectors if we unplug the connector is gone - * away but the encoder is still connected to a crtc - * until a modeset happens in response to the hotplug. - */ - if (!enabled && encoder->base.encoder_type == DRM_MODE_ENCODER_DPMST) - continue; I915_STATE_WARN(!!encoder->base.crtc != enabled, "encoder's enabled state mismatch " diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 585f0a45b3f1..35f2eb59818a 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c @@ -448,6 +448,49 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo return connector; } +static void +intel_dp_unbind_mst_connector(struct drm_device *dev, + struct drm_connector *connector) +{ + struct drm_atomic_state *state; + struct drm_connector_state *conn_state; + struct drm_crtc *crtc = connector->state->crtc; + int ret; + + if (!crtc) + return; + + state = drm_atomic_state_alloc(dev); + if (!state) + return; + + state->acquire_ctx = dev->mode_config.acquire_ctx; + + conn_state = drm_atomic_get_connector_state(state, connector); + ret = PTR_ERR_OR_ZERO(conn_state); + if (!ret) + ret = drm_atomic_set_crtc_for_connector(conn_state, NULL); + + if (!ret) + ret = drm_atomic_add_affected_connectors(state, crtc); + + if (!ret && !drm_atomic_connectors_for_crtc(state, crtc)) { + struct drm_crtc_state *crtc_state = + drm_atomic_get_existing_crtc_state(state, crtc); + + crtc_state->active = false; + ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL); + } + + if (!ret) + ret = drm_atomic_commit(state); + + if (ret) + drm_atomic_state_free(state); + + I915_STATE_WARN_ON(ret); +} + static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, struct drm_connector *connector) { @@ -455,7 +498,7 @@ static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, struct drm_device *dev = connector->dev; /* need to nuke the connector */ drm_modeset_lock_all(dev); - intel_connector_dpms(connector, DRM_MODE_DPMS_OFF); + intel_dp_unbind_mst_connector(dev, connector); drm_modeset_unlock_all(dev); intel_connector->unregister(intel_connector); _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx