All the checks in intel_modeset_checks are only useful when a modeset occurs, because there is nothing to update otherwise. Same for power/cdclk changes, if there is no modeset they are noops. Unfortunately intel_modeset_pipe_config still gets called without modeset, because atomic hw readout isn't done yet. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> --- drivers/gpu/drm/i915/intel_display.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 6ae9bd0e0283..ae046648c29d 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -13157,18 +13157,18 @@ intel_modeset_compute_config(struct drm_atomic_state *state) struct drm_crtc *crtc; struct drm_crtc_state *crtc_state; int ret, i; + bool any_ms = false; ret = drm_atomic_helper_check_modeset(state->dev, state); if (ret) return ret; for_each_crtc_in_state(state, crtc, crtc_state, i) { - if (!crtc_state->enable && - WARN_ON(crtc_state->active)) - crtc_state->active = false; - - if (!crtc_state->enable) + if (!crtc_state->enable) { + if (needs_modeset(crtc_state)) + any_ms = true; continue; + } if (!needs_modeset(crtc_state)) { ret = drm_atomic_add_affected_connectors(state, crtc); @@ -13181,14 +13181,20 @@ intel_modeset_compute_config(struct drm_atomic_state *state) if (ret) return ret; + if (needs_modeset(crtc_state)) + any_ms = true; + intel_dump_pipe_config(to_intel_crtc(crtc), to_intel_crtc_state(crtc_state), "[modeset]"); } - ret = intel_modeset_checks(state); - if (ret) - return ret; + if (any_ms) { + ret = intel_modeset_checks(state); + + if (ret) + return ret; + } return drm_atomic_helper_check_planes(state->dev, state); } @@ -13201,6 +13207,7 @@ static int __intel_set_mode(struct drm_atomic_state *state) struct drm_crtc_state *crtc_state; int ret = 0; int i; + bool any_ms = false; ret = drm_atomic_helper_prepare_planes(dev, state); if (ret) @@ -13209,7 +13216,11 @@ static int __intel_set_mode(struct drm_atomic_state *state) drm_atomic_helper_swap_state(dev, state); for_each_crtc_in_state(state, crtc, crtc_state, i) { - if (!needs_modeset(crtc->state) || !crtc_state->active) + if (!needs_modeset(crtc->state)) + continue; + + any_ms = true; + if (!crtc_state->active) continue; intel_crtc_disable_planes(crtc); @@ -13222,8 +13233,8 @@ static int __intel_set_mode(struct drm_atomic_state *state) /* The state has been swaped above, so state actually contains the * old state now. */ - - modeset_update_crtc_power_domains(state); + if (any_ms) + modeset_update_crtc_power_domains(state); /* Now enable the clocks, plane, pipe, and connectors that we set up. */ for_each_crtc_in_state(state, crtc, crtc_state, i) { -- 2.1.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx