drm/i915: Do not run most checks when there's no modeset.
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Mon, 15 Jun 2015 10:33:50 +0000 (12:33 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 22 Jun 2015 12:27:07 +0000 (14:27 +0200)
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@linux.intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Tested-by(IVB): Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_display.c

index 118c8acc260372fd4bc879ea7cc46cbb190fe63c..57bc49039991b677b3069316a90efc3be7b28bbf 100644 (file)
@@ -13169,18 +13169,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);
@@ -13193,14 +13193,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);
 }
@@ -13213,6 +13219,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)
@@ -13221,7 +13228,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);
@@ -13234,8 +13245,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) {