]> Pileus Git - ~andy/linux/blobdiff - drivers/gpu/drm/i915/i915_irq.c
Merge tag 'drm-intel-next-2012-12-21' of git://people.freedesktop.org/~danvet/drm...
[~andy/linux] / drivers / gpu / drm / i915 / i915_irq.c
index 6ba0573e7f169a6611483c118b98841ca895ff1e..6689a61b02a31c7f9ef1b57c439ab7d44befb918 100644 (file)
@@ -1121,6 +1121,18 @@ i915_error_first_batchbuffer(struct drm_i915_private *dev_priv,
        if (!ring->get_seqno)
                return NULL;
 
+       if (HAS_BROKEN_CS_TLB(dev_priv->dev)) {
+               u32 acthd = I915_READ(ACTHD);
+
+               if (WARN_ON(ring->id != RCS))
+                       return NULL;
+
+               obj = ring->private;
+               if (acthd >= obj->gtt_offset &&
+                   acthd < obj->gtt_offset + obj->base.size)
+                       return i915_error_object_create(dev_priv, obj);
+       }
+
        seqno = ring->get_seqno(ring, false);
        list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) {
                if (obj->ring != ring)
@@ -1500,7 +1512,9 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe)
        spin_lock_irqsave(&dev->event_lock, flags);
        work = intel_crtc->unpin_work;
 
-       if (work == NULL || work->pending || !work->enable_stall_check) {
+       if (work == NULL ||
+           atomic_read(&work->pending) >= INTEL_FLIP_COMPLETE ||
+           !work->enable_stall_check) {
                /* Either the pending flip IRQ arrived, or we're too early. Don't check */
                spin_unlock_irqrestore(&dev->event_lock, flags);
                return;