aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gpu_error.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gpu_error.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gpu_error.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index a707cca692e4..d7fd2fd2f0a5 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -239,6 +239,9 @@ static void i915_ring_error_state(struct drm_i915_error_state_buf *m,
239 unsigned ring) 239 unsigned ring)
240{ 240{
241 BUG_ON(ring >= I915_NUM_RINGS); /* shut up confused gcc */ 241 BUG_ON(ring >= I915_NUM_RINGS); /* shut up confused gcc */
242 if (!error->ring[ring].valid)
243 return;
244
242 err_printf(m, "%s command stream:\n", ring_str(ring)); 245 err_printf(m, "%s command stream:\n", ring_str(ring));
243 err_printf(m, " HEAD: 0x%08x\n", error->head[ring]); 246 err_printf(m, " HEAD: 0x%08x\n", error->head[ring]);
244 err_printf(m, " TAIL: 0x%08x\n", error->tail[ring]); 247 err_printf(m, " TAIL: 0x%08x\n", error->tail[ring]);
@@ -293,7 +296,6 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
293 struct drm_device *dev = error_priv->dev; 296 struct drm_device *dev = error_priv->dev;
294 drm_i915_private_t *dev_priv = dev->dev_private; 297 drm_i915_private_t *dev_priv = dev->dev_private;
295 struct drm_i915_error_state *error = error_priv->error; 298 struct drm_i915_error_state *error = error_priv->error;
296 struct intel_ring_buffer *ring;
297 int i, j, page, offset, elt; 299 int i, j, page, offset, elt;
298 300
299 if (!error) { 301 if (!error) {
@@ -328,7 +330,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
328 if (INTEL_INFO(dev)->gen == 7) 330 if (INTEL_INFO(dev)->gen == 7)
329 err_printf(m, "ERR_INT: 0x%08x\n", error->err_int); 331 err_printf(m, "ERR_INT: 0x%08x\n", error->err_int);
330 332
331 for_each_ring(ring, dev_priv, i) 333 for (i = 0; i < ARRAY_SIZE(error->ring); i++)
332 i915_ring_error_state(m, dev, error, i); 334 i915_ring_error_state(m, dev, error, i);
333 335
334 if (error->active_bo) 336 if (error->active_bo)
@@ -385,8 +387,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
385 } 387 }
386 } 388 }
387 389
388 obj = error->ring[i].ctx; 390 if ((obj = error->ring[i].ctx)) {
389 if (obj) {
390 err_printf(m, "%s --- HW Context = 0x%08x\n", 391 err_printf(m, "%s --- HW Context = 0x%08x\n",
391 dev_priv->ring[i].name, 392 dev_priv->ring[i].name,
392 obj->gtt_offset); 393 obj->gtt_offset);
@@ -667,7 +668,8 @@ i915_error_first_batchbuffer(struct drm_i915_private *dev_priv,
667 return NULL; 668 return NULL;
668 669
669 obj = ring->scratch.obj; 670 obj = ring->scratch.obj;
670 if (acthd >= i915_gem_obj_ggtt_offset(obj) && 671 if (obj != NULL &&
672 acthd >= i915_gem_obj_ggtt_offset(obj) &&
671 acthd < i915_gem_obj_ggtt_offset(obj) + obj->base.size) 673 acthd < i915_gem_obj_ggtt_offset(obj) + obj->base.size)
672 return i915_error_object_create(dev_priv, obj); 674 return i915_error_object_create(dev_priv, obj);
673 } 675 }
@@ -775,11 +777,17 @@ static void i915_gem_record_rings(struct drm_device *dev,
775 struct drm_i915_error_state *error) 777 struct drm_i915_error_state *error)
776{ 778{
777 struct drm_i915_private *dev_priv = dev->dev_private; 779 struct drm_i915_private *dev_priv = dev->dev_private;
778 struct intel_ring_buffer *ring;
779 struct drm_i915_gem_request *request; 780 struct drm_i915_gem_request *request;
780 int i, count; 781 int i, count;
781 782
782 for_each_ring(ring, dev_priv, i) { 783 for (i = 0; i < I915_NUM_RINGS; i++) {
784 struct intel_ring_buffer *ring = &dev_priv->ring[i];
785
786 if (ring->dev == NULL)
787 continue;
788
789 error->ring[i].valid = true;
790
783 i915_record_ring_state(dev, error, ring); 791 i915_record_ring_state(dev, error, ring);
784 792
785 error->ring[i].batchbuffer = 793 error->ring[i].batchbuffer =