diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 19 | 
1 files changed, 8 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 89a65be8a3f3..31cd7e33e820 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c  | |||
| @@ -696,20 +696,17 @@ int intel_wait_ring_buffer(struct drm_device *dev, | |||
| 696 | drm_i915_private_t *dev_priv = dev->dev_private; | 696 | drm_i915_private_t *dev_priv = dev->dev_private; | 
| 697 | u32 head; | 697 | u32 head; | 
| 698 | 698 | ||
| 699 | head = intel_read_status_page(ring, 4); | ||
| 700 | if (head) { | ||
| 701 | ring->head = head & HEAD_ADDR; | ||
| 702 | ring->space = ring->head - (ring->tail + 8); | ||
| 703 | if (ring->space < 0) | ||
| 704 | ring->space += ring->size; | ||
| 705 | if (ring->space >= n) | ||
| 706 | return 0; | ||
| 707 | } | ||
| 708 | |||
| 709 | trace_i915_ring_wait_begin (dev); | 699 | trace_i915_ring_wait_begin (dev); | 
| 710 | end = jiffies + 3 * HZ; | 700 | end = jiffies + 3 * HZ; | 
| 711 | do { | 701 | do { | 
| 712 | ring->head = I915_READ_HEAD(ring) & HEAD_ADDR; | 702 | /* If the reported head position has wrapped or hasn't advanced, | 
| 703 | * fallback to the slow and accurate path. | ||
| 704 | */ | ||
| 705 | head = intel_read_status_page(ring, 4); | ||
| 706 | if (head < ring->actual_head) | ||
| 707 | head = I915_READ_HEAD(ring); | ||
| 708 | ring->actual_head = head; | ||
| 709 | ring->head = head & HEAD_ADDR; | ||
| 713 | ring->space = ring->head - (ring->tail + 8); | 710 | ring->space = ring->head - (ring->tail + 8); | 
| 714 | if (ring->space < 0) | 711 | if (ring->space < 0) | 
| 715 | ring->space += ring->size; | 712 | ring->space += ring->size; | 
