diff options
Diffstat (limited to 'sys/dev/pci/drm/i915_dma.c')
-rw-r--r-- | sys/dev/pci/drm/i915_dma.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/dev/pci/drm/i915_dma.c b/sys/dev/pci/drm/i915_dma.c index d35007a6fc0..2b8f077338d 100644 --- a/sys/dev/pci/drm/i915_dma.c +++ b/sys/dev/pci/drm/i915_dma.c @@ -40,11 +40,15 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller) { drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_ring_buffer_t *ring = &(dev_priv->ring); - u32 last_head = I915_READ(PRB0_HEAD) & HEAD_ADDR; + u_int32_t acthd_reg = IS_I965G(dev) ? ACTHD_I965 : ACTHD; + u_int32_t last_acthd = I915_READ(acthd_reg); + u_int32_t acthd; + u_int32_t last_head = I915_READ(PRB0_HEAD) & HEAD_ADDR; int i; - for (i = 0; i < 10000; i++) { + for (i = 0; i < 100000; i++) { ring->head = I915_READ(PRB0_HEAD) & HEAD_ADDR; + acthd = I915_READ(acthd_reg); ring->space = ring->head - (ring->tail + 8); if (ring->space < 0) ring->space += ring->Size; @@ -53,9 +57,13 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller) if (ring->head != last_head) i = 0; + if (acthd != last_acthd) + i = 0; last_head = ring->head; - DRM_UDELAY(1); + last_acthd = acthd; + msleep(dev_priv, &dev->dev_lock, PZERO | PCATCH, "i915wt", + hz / 100); } return -EBUSY; |