drm/i915: enable forcewake voodoo also for gen6
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 25 Jan 2012 13:04:00 +0000 (14:04 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 13 Feb 2012 09:57:07 +0000 (10:57 +0100)
We still have reports of missed irqs even on Sandybridge with the
HWSTAM workaround in place. Testing by the bug reporter gets rid of
them with the forcewake voodoo and no HWSTAM writes.

Because I've slightly botched the rebasing I've left out the ACTHD
readback which is also required to get IVB working. Seems to still
work on the tester's machine, so I think we should go with the more
minmal approach on SNB. Especially since I've only found weak evidence
for holding forcewake while waiting for an interrupt to arrive, but
none for the ACTHD readback.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=45181
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=45332
Tested-by: Nicolas Kalkhof nkalkhof()at()web.de
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/intel_ringbuffer.c

index 063b4577d4c6f30513282cbbc461090f019a3eca..bd6168be63d3c4b3955017034fc4199f9c2aade0 100644 (file)
@@ -1785,18 +1785,6 @@ static void ironlake_irq_preinstall(struct drm_device *dev)
 
        I915_WRITE(HWSTAM, 0xeffe);
 
-       if (IS_GEN6(dev)) {
-               /* Workaround stalls observed on Sandy Bridge GPUs by
-                * making the blitter command streamer generate a
-                * write to the Hardware Status Page for
-                * MI_USER_INTERRUPT.  This appears to serialize the
-                * previous seqno write out before the interrupt
-                * happens.
-                */
-               I915_WRITE(GEN6_BLITTER_HWSTAM, ~GEN6_BLITTER_USER_INTERRUPT);
-               I915_WRITE(GEN6_BSD_HWSTAM, ~GEN6_BSD_USER_INTERRUPT);
-       }
-
        /* XXX hotplug from PCH */
 
        I915_WRITE(DEIMR, 0xffffffff);
index 8a983b50a7917ed1570e5c4c81a2c7b0754030ca..e784ebb8cc27285c4f9315e16f9acde4eedbfbfb 100644 (file)
@@ -798,8 +798,7 @@ gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
        /* It looks like we need to prevent the gt from suspending while waiting
         * for an notifiy irq, otherwise irqs seem to get lost on at least the
         * blt/bsd rings on ivb. */
-       if (IS_GEN7(dev))
-               gen6_gt_force_wake_get(dev_priv);
+       gen6_gt_force_wake_get(dev_priv);
 
        spin_lock(&ring->irq_lock);
        if (ring->irq_refcount++ == 0) {
@@ -826,8 +825,7 @@ gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
        }
        spin_unlock(&ring->irq_lock);
 
-       if (IS_GEN7(dev))
-               gen6_gt_force_wake_put(dev_priv);
+       gen6_gt_force_wake_put(dev_priv);
 }
 
 static bool