drm/i915: Record all error ringbuffers
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 27 Jan 2011 19:15:11 +0000 (19:15 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 28 Jan 2011 11:21:37 +0000 (11:21 +0000)
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_irq.c

index 5825a586015ed27a89ee78135f55481c082a34a4..786c3ba8886c890c30d5265aee777508892d9f32 100644 (file)
@@ -805,15 +805,20 @@ static int i915_error_state(struct seq_file *m, void *unused)
                }
        }
 
-       if (error->ringbuffer) {
-               struct drm_i915_error_object *obj = error->ringbuffer;
-
-               seq_printf(m, "--- ringbuffer = 0x%08x\n", obj->gtt_offset);
-               offset = 0;
-               for (page = 0; page < obj->page_count; page++) {
-                       for (elt = 0; elt < PAGE_SIZE/4; elt++) {
-                               seq_printf(m, "%08x :  %08x\n", offset, obj->pages[page][elt]);
-                               offset += 4;
+       for (i = 0; i < ARRAY_SIZE(error->ringbuffer); i++) {
+               if (error->ringbuffer[i]) {
+                       struct drm_i915_error_object *obj = error->ringbuffer[i];
+                       seq_printf(m, "%s --- ringbuffer = 0x%08x\n",
+                                  dev_priv->ring[i].name,
+                                  obj->gtt_offset);
+                       offset = 0;
+                       for (page = 0; page < obj->page_count; page++) {
+                               for (elt = 0; elt < PAGE_SIZE/4; elt++) {
+                                       seq_printf(m, "%08x :  %08x\n",
+                                                  offset,
+                                                  obj->pages[page][elt]);
+                                       offset += 4;
+                               }
                        }
                }
        }
index ff498b98c9bd3e212957406af53a3e627ece7e10..6e1cfa42f42124bc39a0303cfae203dcd3fc9457 100644 (file)
@@ -174,7 +174,7 @@ struct drm_i915_error_state {
                int page_count;
                u32 gtt_offset;
                u32 *pages[0];
-       } *ringbuffer, *batchbuffer[I915_NUM_RINGS];
+       } *ringbuffer[I915_NUM_RINGS], *batchbuffer[I915_NUM_RINGS];
        struct drm_i915_error_buffer {
                u32 size;
                u32 name;
index a98fb026d388e6ef086f378a1560d8b731d1405e..d388bbbe8c4a5cf95f4a46362e3f288d4f96c659 100644 (file)
@@ -648,9 +648,14 @@ static void
 i915_error_state_free(struct drm_device *dev,
                      struct drm_i915_error_state *error)
 {
-       i915_error_object_free(error->batchbuffer[0]);
-       i915_error_object_free(error->batchbuffer[1]);
-       i915_error_object_free(error->ringbuffer);
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(error->batchbuffer); i++)
+               i915_error_object_free(error->batchbuffer[i]);
+
+       for (i = 0; i < ARRAY_SIZE(error->ringbuffer); i++)
+               i915_error_object_free(error->ringbuffer[i]);
+
        kfree(error->active_bo);
        kfree(error->overlay);
        kfree(error);
@@ -824,15 +829,16 @@ static void i915_capture_error_state(struct drm_device *dev)
        }
        i915_gem_record_fences(dev, error);
 
-       /* Record the active batchbuffers */
-       for (i = 0; i < I915_NUM_RINGS; i++)
+       /* Record the active batch and ring buffers */
+       for (i = 0; i < I915_NUM_RINGS; i++) {
                error->batchbuffer[i] =
                        i915_error_first_batchbuffer(dev_priv,
                                                     &dev_priv->ring[i]);
 
-       /* Record the ringbuffer */
-       error->ringbuffer = i915_error_object_create(dev_priv,
-                                                    dev_priv->ring[RCS].obj);
+               error->ringbuffer[i] =
+                       i915_error_object_create(dev_priv,
+                                                dev_priv->ring[i].obj);
+       }
 
        /* Record buffers on the active and pinned lists. */
        error->active_bo = NULL;