aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-01-27 14:15:11 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2011-01-28 06:21:37 -0500
commite2f973d58e80ba00bcfaa171169c42c710e7e826 (patch)
tree2d7111c6bd84f77c995cdc624eb2a425a5bbfe76
parent21dd373486956d7789ffd878347c36efad16923d (diff)
drm/i915: Record all error ringbuffers
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c23
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c22
3 files changed, 29 insertions, 18 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 5825a586015e..786c3ba8886c 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -805,15 +805,20 @@ static int i915_error_state(struct seq_file *m, void *unused)
805 } 805 }
806 } 806 }
807 807
808 if (error->ringbuffer) { 808 for (i = 0; i < ARRAY_SIZE(error->ringbuffer); i++) {
809 struct drm_i915_error_object *obj = error->ringbuffer; 809 if (error->ringbuffer[i]) {
810 810 struct drm_i915_error_object *obj = error->ringbuffer[i];
811 seq_printf(m, "--- ringbuffer = 0x%08x\n", obj->gtt_offset); 811 seq_printf(m, "%s --- ringbuffer = 0x%08x\n",
812 offset = 0; 812 dev_priv->ring[i].name,
813 for (page = 0; page < obj->page_count; page++) { 813 obj->gtt_offset);
814 for (elt = 0; elt < PAGE_SIZE/4; elt++) { 814 offset = 0;
815 seq_printf(m, "%08x : %08x\n", offset, obj->pages[page][elt]); 815 for (page = 0; page < obj->page_count; page++) {
816 offset += 4; 816 for (elt = 0; elt < PAGE_SIZE/4; elt++) {
817 seq_printf(m, "%08x : %08x\n",
818 offset,
819 obj->pages[page][elt]);
820 offset += 4;
821 }
817 } 822 }
818 } 823 }
819 } 824 }
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index ff498b98c9bd..6e1cfa42f421 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -174,7 +174,7 @@ struct drm_i915_error_state {
174 int page_count; 174 int page_count;
175 u32 gtt_offset; 175 u32 gtt_offset;
176 u32 *pages[0]; 176 u32 *pages[0];
177 } *ringbuffer, *batchbuffer[I915_NUM_RINGS]; 177 } *ringbuffer[I915_NUM_RINGS], *batchbuffer[I915_NUM_RINGS];
178 struct drm_i915_error_buffer { 178 struct drm_i915_error_buffer {
179 u32 size; 179 u32 size;
180 u32 name; 180 u32 name;
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index a98fb026d388..d388bbbe8c4a 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -648,9 +648,14 @@ static void
648i915_error_state_free(struct drm_device *dev, 648i915_error_state_free(struct drm_device *dev,
649 struct drm_i915_error_state *error) 649 struct drm_i915_error_state *error)
650{ 650{
651 i915_error_object_free(error->batchbuffer[0]); 651 int i;
652 i915_error_object_free(error->batchbuffer[1]); 652
653 i915_error_object_free(error->ringbuffer); 653 for (i = 0; i < ARRAY_SIZE(error->batchbuffer); i++)
654 i915_error_object_free(error->batchbuffer[i]);
655
656 for (i = 0; i < ARRAY_SIZE(error->ringbuffer); i++)
657 i915_error_object_free(error->ringbuffer[i]);
658
654 kfree(error->active_bo); 659 kfree(error->active_bo);
655 kfree(error->overlay); 660 kfree(error->overlay);
656 kfree(error); 661 kfree(error);
@@ -824,15 +829,16 @@ static void i915_capture_error_state(struct drm_device *dev)
824 } 829 }
825 i915_gem_record_fences(dev, error); 830 i915_gem_record_fences(dev, error);
826 831
827 /* Record the active batchbuffers */ 832 /* Record the active batch and ring buffers */
828 for (i = 0; i < I915_NUM_RINGS; i++) 833 for (i = 0; i < I915_NUM_RINGS; i++) {
829 error->batchbuffer[i] = 834 error->batchbuffer[i] =
830 i915_error_first_batchbuffer(dev_priv, 835 i915_error_first_batchbuffer(dev_priv,
831 &dev_priv->ring[i]); 836 &dev_priv->ring[i]);
832 837
833 /* Record the ringbuffer */ 838 error->ringbuffer[i] =
834 error->ringbuffer = i915_error_object_create(dev_priv, 839 i915_error_object_create(dev_priv,
835 dev_priv->ring[RCS].obj); 840 dev_priv->ring[i].obj);
841 }
836 842
837 /* Record buffers on the active and pinned lists. */ 843 /* Record buffers on the active and pinned lists. */
838 error->active_bo = NULL; 844 error->active_bo = NULL;