drm/i915: Reset the HEAD pointer for the ring after writing START
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 7 Aug 2014 14:39:54 +0000 (15:39 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 4 Sep 2014 09:26:17 +0000 (11:26 +0200)
Ville found an old w/a documented for g4x that suggested that we need to
reset the HEAD after writing START. This is a useful fixup for some of
the g4x ring initialisation woes, but as usual, not all.

v2: Do the rewrite unconditionally anyway

References: https://bugs.freedesktop.org/show_bug.cgi?id=76554
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_ringbuffer.c

index f8aadc3c2124d01ca512f90ec1922c47497bc302..85fc2b1a124ad5e3fe72f97371c6fc3719ade829 100644 (file)
@@ -563,6 +563,14 @@ static int init_ring_common(struct intel_engine_cs *ring)
         * also enforces ordering), otherwise the hw might lose the new ring
         * register values. */
        I915_WRITE_START(ring, i915_gem_obj_ggtt_offset(obj));
+
+       /* WaClearRingBufHeadRegAtInit:ctg,elk */
+       if (I915_READ_HEAD(ring))
+               DRM_DEBUG("%s initialization failed [head=%08x], fudging\n",
+                         ring->name, I915_READ_HEAD(ring));
+       I915_WRITE_HEAD(ring, 0);
+       (void)I915_READ_HEAD(ring);
+
        I915_WRITE_CTL(ring,
                        ((ringbuf->size - PAGE_SIZE) & RING_NR_PAGES)
                        | RING_VALID);