This patch doesn't apply to the .36 stable tree
If someone wants it applied there, please email the backport
to [email protected]

thanks,

greg k-h

> commit: 08deebf98783d3de553eed2c9b6b8dcc7e168567
> From: Chris Wilson <[email protected]>
> Date: Fri, 5 Nov 2010 08:56:38 +0000
> Subject: [PATCH] drm/i915/ringbuffer: Use the HEAD auto-reporting mechanism
> 
> My Sandybridge only reports 0 for the ring buffer registers, causing it
> to hang as soon as we exhaust the available ring. As a workaround, take
> advantage of our huge ring buffers and use the auto-reporting mechanism
> to update the status page with the HEAD location every 64 KiB.
> 
> Cherry-picked from 6aa56062eaba67adfb247cded244fd877329588d.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=31404
> Tested-by: Zhao Jian <[email protected]>
> Cc: [email protected]
> Signed-off-by: Chris Wilson <[email protected]>
> ---
>  drivers/gpu/drm/i915/intel_ringbuffer.c |   13 ++++++++++++-
>  1 files changed, 12 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c 
> b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index 7c1f3ff..b83306f 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -177,7 +177,7 @@ static int init_ring_common(struct drm_device *dev,
>  
>       I915_WRITE_CTL(ring,
>                       ((ring->gem_object->size - PAGE_SIZE) & RING_NR_PAGES)
> -                     | RING_NO_REPORT | RING_VALID);
> +                     | RING_REPORT_64K | RING_VALID);
>  
>       head = I915_READ_HEAD(ring) & HEAD_ADDR;
>       /* If the head is still not zero, the ring is dead */
> @@ -692,6 +692,17 @@ int intel_wait_ring_buffer(struct drm_device *dev,
>  {
>       unsigned long end;
>       drm_i915_private_t *dev_priv = dev->dev_private;
> +     u32 head;
> +
> +     head = intel_read_status_page(ring, 4);
> +     if (head) {
> +             ring->head = head & HEAD_ADDR;
> +             ring->space = ring->head - (ring->tail + 8);
> +             if (ring->space < 0)
> +                     ring->space += ring->size;
> +             if (ring->space >= n)
> +                     return 0;
> +     }
>  
>       trace_i915_ring_wait_begin (dev);
>       end = jiffies + 3 * HZ;
> 
> _______________________________________________
> stable mailing list
> [email protected]
> http://linux.kernel.org/mailman/listinfo/stable

_______________________________________________
stable mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/stable

Reply via email to