diff options
| author | Dave Airlie <airlied@redhat.com> | 2010-12-15 19:03:47 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2010-12-15 19:03:47 -0500 |
| commit | 044102798ddb0a0e5f43ef7fe0ad0e84b0b5e3a0 (patch) | |
| tree | fd3a6692ca2aae38d9c86988a95bd1983ea81ebf /drivers/gpu/drm/i915/intel_ringbuffer.c | |
| parent | a4851d8f7d6351a395d36ae8fdcf41745a832d76 (diff) | |
| parent | 448f53a1ede54eb854d036abf54573281412d650 (diff) | |
Merge remote branch 'intel/drm-intel-fixes' of /ssd/git/drm-next into drm-fixes
* 'intel/drm-intel-fixes' of /ssd/git/drm-next:
drm/i915/bios: Reverse order of 100/120 Mhz SSC clocks
agp/intel: Fix missed cached memory flags setting in i965_write_entry()
drm/i915/sdvo: Only use the SDVO pin if it is in the valid range
drm/i915/ringbuffer: Handle wrapping of the autoreported HEAD
drm/i915/dp: Fix I2C/EDID handling with active DisplayPort to DVI converter
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; |
