drm/i915: Move vblank wait determination to 'check' phase
authorMatt Roper <matthew.d.roper@intel.com>
Wed, 18 Mar 2015 22:04:47 +0000 (15:04 -0700)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 20 Mar 2015 10:48:22 +0000 (11:48 +0100)
Determining whether we'll need to wait for vblanks is something we
should determine during the atomic 'check' phase, not the 'commit'
phase.  Note that we only set these bits in the branch of 'check' where
intel_crtc->active is true so that we don't try to wait on a disabled
CRTC.

The whole 'wait for vblank after update' flag should go away in the
future, once we start handling watermarks in a proper atomic manner.

This regression has been introduced in

commit 2fdd7def16dd7580f297827930126c16b152ec11
Author: Matt Roper <matthew.d.roper@intel.com>
Date:   Wed Mar 4 10:49:04 2015 -0800
    drm/i915: Don't clobber plane state on internal disables

Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Root-cause-analysis-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89550
Testcase: igt/pm_rpm/legacy-planes
Testcase: igt/pm_rpm/legacy-planes-dpms
Testcase: igt/pm_rpm/universal-planes
Testcase: igt/pm_rpm/universal-planes-dpms
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Tested-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_sprite.c

index 03c2d4c11518e646a62f9f9abe32604aff44ee08..cd531fa997de6ba97f5d8c20419cd8372807e36e 100644 (file)
@@ -750,13 +750,6 @@ ivb_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc)
        I915_WRITE(SPRSURF(pipe), 0);
 
        intel_flush_primary_plane(dev_priv, intel_crtc->plane);
-
-       /*
-        * Avoid underruns when disabling the sprite.
-        * FIXME remove once watermark updates are done properly.
-        */
-       intel_crtc->atomic.wait_vblank = true;
-       intel_crtc->atomic.update_sprite_watermarks |= (1 << drm_plane_index(plane));
 }
 
 static int
@@ -941,13 +934,6 @@ ilk_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc)
        I915_WRITE(DVSSURF(pipe), 0);
 
        intel_flush_primary_plane(dev_priv, intel_crtc->plane);
-
-       /*
-        * Avoid underruns when disabling the sprite.
-        * FIXME remove once watermark updates are done properly.
-        */
-       intel_crtc->atomic.wait_vblank = true;
-       intel_crtc->atomic.update_sprite_watermarks |= (1 << drm_plane_index(plane));
 }
 
 /**
@@ -1266,6 +1252,16 @@ finish:
                    plane->state->fb->modifier[0] !=
                    state->base.fb->modifier[0])
                        intel_crtc->atomic.update_wm = true;
+
+               if (!state->visible) {
+                       /*
+                        * Avoid underruns when disabling the sprite.
+                        * FIXME remove once watermark updates are done properly.
+                        */
+                       intel_crtc->atomic.wait_vblank = true;
+                       intel_crtc->atomic.update_sprite_watermarks |=
+                               (1 << drm_plane_index(plane));
+               }
        }
 
        return 0;