Move the vblank evasion up from the low-level, hw-specific
update_plane() handlers to the general plane commit operation.
Everything inside commit should now be non-sleeping, so this brings us
closer to how vblank evasion will behave once we move over to atomic.

v2: Restore lost intel_crtc->active check on vblank evasion

Signed-off-by: Matt Roper <matthew.d.ro...@intel.com>
---
 drivers/gpu/drm/i915/intel_display.c | 10 +++++++++
 drivers/gpu/drm/i915/intel_sprite.c  | 42 ------------------------------------
 2 files changed, 10 insertions(+), 42 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 321e217..590a7b1 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -11845,6 +11845,8 @@ intel_update_plane(struct drm_plane *plane, struct 
drm_crtc *crtc,
        struct intel_plane_state state = {{ 0 }};
        struct intel_plane *intel_plane = to_intel_plane(plane);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       unsigned start_vbl_count;
+       bool atomic_update = false;
        int ret;
 
        state.base.crtc = crtc ? crtc : plane->crtc;
@@ -11882,7 +11884,15 @@ intel_update_plane(struct drm_plane *plane, struct 
drm_crtc *crtc,
 
        if (intel_plane->pre_commit)
                intel_plane->pre_commit(plane, &state);
+
+       /* Perform vblank evasion around commit operation */
+       if (intel_crtc->active)
+               atomic_update = intel_pipe_update_start(intel_crtc,
+                                                       &start_vbl_count);
        intel_plane->commit_plane(plane, &state);
+       if (atomic_update)
+               intel_pipe_update_end(intel_crtc, start_vbl_count);
+
        if (intel_plane->post_commit)
                intel_plane->post_commit(plane, &state);
 
diff --git a/drivers/gpu/drm/i915/intel_sprite.c 
b/drivers/gpu/drm/i915/intel_sprite.c
index d18da5d..12fd74d 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -412,8 +412,6 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_crtc 
*crtc,
        u32 sprctl;
        unsigned long sprsurf_offset, linear_offset;
        int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0);
-       u32 start_vbl_count;
-       bool atomic_update;
 
        sprctl = I915_READ(SPCNTR(pipe, plane));
 
@@ -502,8 +500,6 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_crtc 
*crtc,
                linear_offset += src_h * fb->pitches[0] + src_w * pixel_size;
        }
 
-       atomic_update = intel_pipe_update_start(intel_crtc, &start_vbl_count);
-
        intel_update_primary_plane(intel_crtc);
 
        if (IS_CHERRYVIEW(dev) && pipe == PIPE_B)
@@ -525,9 +521,6 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_crtc 
*crtc,
                   sprsurf_offset);
 
        intel_flush_primary_plane(dev_priv, intel_crtc->plane);
-
-       if (atomic_update)
-               intel_pipe_update_end(intel_crtc, start_vbl_count);
 }
 
 static void
@@ -539,10 +532,6 @@ vlv_disable_plane(struct drm_plane *dplane, struct 
drm_crtc *crtc)
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        int pipe = intel_plane->pipe;
        int plane = intel_plane->plane;
-       u32 start_vbl_count;
-       bool atomic_update;
-
-       atomic_update = intel_pipe_update_start(intel_crtc, &start_vbl_count);
 
        intel_update_primary_plane(intel_crtc);
 
@@ -553,9 +542,6 @@ vlv_disable_plane(struct drm_plane *dplane, struct drm_crtc 
*crtc)
 
        intel_flush_primary_plane(dev_priv, intel_crtc->plane);
 
-       if (atomic_update)
-               intel_pipe_update_end(intel_crtc, start_vbl_count);
-
        intel_update_sprite_watermarks(dplane, crtc, 0, 0, 0, false, false);
 }
 
@@ -626,8 +612,6 @@ ivb_update_plane(struct drm_plane *plane, struct drm_crtc 
*crtc,
        u32 sprctl, sprscale = 0;
        unsigned long sprsurf_offset, linear_offset;
        int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0);
-       u32 start_vbl_count;
-       bool atomic_update;
 
        sprctl = I915_READ(SPRCTL(pipe));
 
@@ -711,8 +695,6 @@ ivb_update_plane(struct drm_plane *plane, struct drm_crtc 
*crtc,
                }
        }
 
-       atomic_update = intel_pipe_update_start(intel_crtc, &start_vbl_count);
-
        intel_update_primary_plane(intel_crtc);
 
        I915_WRITE(SPRSTRIDE(pipe), fb->pitches[0]);
@@ -735,9 +717,6 @@ ivb_update_plane(struct drm_plane *plane, struct drm_crtc 
*crtc,
                   i915_gem_obj_ggtt_offset(obj) + sprsurf_offset);
 
        intel_flush_primary_plane(dev_priv, intel_crtc->plane);
-
-       if (atomic_update)
-               intel_pipe_update_end(intel_crtc, start_vbl_count);
 }
 
 static void
@@ -748,10 +727,6 @@ ivb_disable_plane(struct drm_plane *plane, struct drm_crtc 
*crtc)
        struct intel_plane *intel_plane = to_intel_plane(plane);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        int pipe = intel_plane->pipe;
-       u32 start_vbl_count;
-       bool atomic_update;
-
-       atomic_update = intel_pipe_update_start(intel_crtc, &start_vbl_count);
 
        intel_update_primary_plane(intel_crtc);
 
@@ -764,9 +739,6 @@ ivb_disable_plane(struct drm_plane *plane, struct drm_crtc 
*crtc)
 
        intel_flush_primary_plane(dev_priv, intel_crtc->plane);
 
-       if (atomic_update)
-               intel_pipe_update_end(intel_crtc, start_vbl_count);
-
        /*
         * Avoid underruns when disabling the sprite.
         * FIXME remove once watermark updates are done properly.
@@ -846,8 +818,6 @@ ilk_update_plane(struct drm_plane *plane, struct drm_crtc 
*crtc,
        unsigned long dvssurf_offset, linear_offset;
        u32 dvscntr, dvsscale;
        int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0);
-       u32 start_vbl_count;
-       bool atomic_update;
 
        dvscntr = I915_READ(DVSCNTR(pipe));
 
@@ -922,8 +892,6 @@ ilk_update_plane(struct drm_plane *plane, struct drm_crtc 
*crtc,
                linear_offset += src_h * fb->pitches[0] + src_w * pixel_size;
        }
 
-       atomic_update = intel_pipe_update_start(intel_crtc, &start_vbl_count);
-
        intel_update_primary_plane(intel_crtc);
 
        I915_WRITE(DVSSTRIDE(pipe), fb->pitches[0]);
@@ -941,9 +909,6 @@ ilk_update_plane(struct drm_plane *plane, struct drm_crtc 
*crtc,
                   i915_gem_obj_ggtt_offset(obj) + dvssurf_offset);
 
        intel_flush_primary_plane(dev_priv, intel_crtc->plane);
-
-       if (atomic_update)
-               intel_pipe_update_end(intel_crtc, start_vbl_count);
 }
 
 static void
@@ -954,10 +919,6 @@ ilk_disable_plane(struct drm_plane *plane, struct drm_crtc 
*crtc)
        struct intel_plane *intel_plane = to_intel_plane(plane);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        int pipe = intel_plane->pipe;
-       u32 start_vbl_count;
-       bool atomic_update;
-
-       atomic_update = intel_pipe_update_start(intel_crtc, &start_vbl_count);
 
        intel_update_primary_plane(intel_crtc);
 
@@ -969,9 +930,6 @@ ilk_disable_plane(struct drm_plane *plane, struct drm_crtc 
*crtc)
 
        intel_flush_primary_plane(dev_priv, intel_crtc->plane);
 
-       if (atomic_update)
-               intel_pipe_update_end(intel_crtc, start_vbl_count);
-
        /*
         * Avoid underruns when disabling the sprite.
         * FIXME remove once watermark updates are done properly.
-- 
1.8.5.1

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

Reply via email to