]> code.ossystems Code Review - openembedded-core.git/blob
8736250f00c78537abba054d57135de9a89c359e
[openembedded-core.git] /
1 commit 1236e8610ab9c6f9f8297e60530bedb2640c7224
2 Author: Keith Packard <keithp@keithp.com>
3 Date:   Wed Jul 30 12:21:20 2008 -0700
4
5     i915: Track progress inside of batchbuffers for determining wedgedness.
6     
7     This avoids early termination for long-running commands.
8     
9     Signed-off-by: Eric Anholt <eric@anholt.net>
10     Signed-off-by: Dave Airlie <airlied@redhat.com>
11
12 diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
13 index 10bfb0c..4c72a01 100644
14 --- a/drivers/gpu/drm/i915/i915_dma.c
15 +++ b/drivers/gpu/drm/i915/i915_dma.c
16 @@ -40,11 +40,15 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller)
17  {
18         drm_i915_private_t *dev_priv = dev->dev_private;
19         drm_i915_ring_buffer_t *ring = &(dev_priv->ring);
20 +       u32 acthd_reg = IS_I965G(dev) ? ACTHD_I965 : ACTHD;
21 +       u32 last_acthd = I915_READ(acthd_reg);
22 +       u32 acthd;
23         u32 last_head = I915_READ(PRB0_HEAD) & HEAD_ADDR;
24         int i;
25  
26 -       for (i = 0; i < 10000; i++) {
27 +       for (i = 0; i < 100000; i++) {
28                 ring->head = I915_READ(PRB0_HEAD) & HEAD_ADDR;
29 +               acthd = I915_READ(acthd_reg);
30                 ring->space = ring->head - (ring->tail + 8);
31                 if (ring->space < 0)
32                         ring->space += ring->Size;
33 @@ -55,8 +59,13 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller)
34  
35                 if (ring->head != last_head)
36                         i = 0;
37 +               if (acthd != last_acthd)
38 +                       i = 0;
39  
40                 last_head = ring->head;
41 +               last_acthd = acthd;
42 +               msleep_interruptible(10);
43 +
44         }
45  
46         return -EBUSY;