drm/i915: Work around gen7 BLT ring synchronization issues.
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / i915 / intel_ringbuffer.c
index f5dae5deca71ac4ba6e1b1191fbdad3ea5b92dc4..d0eb2280d8d9a9e5f1e9318fa29e83043ea0bbbe 100644 (file)
@@ -791,6 +791,17 @@ ring_add_request(struct intel_ring_buffer *ring,
        return 0;
 }
 
+static bool
+gen7_blt_ring_get_irq(struct intel_ring_buffer *ring)
+{
+       /* The BLT ring on IVB appears to have broken synchronization
+        * between the seqno write and the interrupt, so that the
+        * interrupt appears first.  Returning false here makes
+        * i915_wait_request() do a polling loop, instead.
+        */
+       return false;
+}
+
 static bool
 gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
 {
@@ -1557,5 +1568,8 @@ int intel_init_blt_ring_buffer(struct drm_device *dev)
 
        *ring = gen6_blt_ring;
 
+       if (IS_GEN7(dev))
+               ring->irq_get = gen7_blt_ring_get_irq;
+
        return intel_init_ring_buffer(dev, ring);
 }