A fast modeset can only be performed when connectors and active are
not changed. This prevents a lot of KMS spam when going from a NULL
mode with 0 connectors to an actual mode.

When a crtc is inactive there's no need to evade either, the changes
can be applied when the crtc turns on again.

Signed-off-by: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_display.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index deb76c84a307..eddc81c2d459 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12281,7 +12281,7 @@ intel_compare_link_m_n(const struct intel_link_m_n *m_n,
 
 static bool
 intel_pipe_config_compare(struct drm_device *dev,
-                         struct intel_crtc_state *current_config,
+                         const struct intel_crtc_state *current_config,
                          struct intel_crtc_state *pipe_config,
                          bool adjust)
 {
@@ -13013,14 +13013,15 @@ static int intel_atomic_check(struct drm_device *dev,
                if (ret)
                        return ret;
 
-               if (intel_pipe_config_compare(state->dev,
-                                       to_intel_crtc_state(crtc->state),
-                                       pipe_config, true)) {
+               if (!crtc_state->connectors_changed &&
+                   !crtc_state->active_changed &&
+                   crtc_state->active &&
+                   intel_pipe_config_compare(state->dev,
+                                             to_intel_crtc_state(crtc->state),
+                                             pipe_config, true)) {
                        crtc_state->mode_changed = false;
-                       to_intel_crtc_state(crtc_state)->update_pipe = true;
-               }
-
-               if (needs_modeset(crtc_state)) {
+                       pipe_config->update_pipe = true;
+               } else {
                        any_ms = true;
 
                        ret = drm_atomic_add_affected_planes(state, crtc);
@@ -13029,8 +13030,8 @@ static int intel_atomic_check(struct drm_device *dev,
                }
 
                intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config,
-                                      needs_modeset(crtc_state) ?
-                                      "[modeset]" : "[fastset]");
+                                      pipe_config->update_pipe ?
+                                      "[fastset]" : "[modeset]");
        }
 
        if (any_ms) {
-- 
2.1.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to