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.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index 79dcb8f896c6..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]);
@@ -247,12 +250,11 @@ static void i915_ring_error_state(struct drm_i915_error_state_buf *m,
247 err_printf(m, " IPEIR: 0x%08x\n", error->ipeir[ring]); 250 err_printf(m, " IPEIR: 0x%08x\n", error->ipeir[ring]);
248 err_printf(m, " IPEHR: 0x%08x\n", error->ipehr[ring]); 251 err_printf(m, " IPEHR: 0x%08x\n", error->ipehr[ring]);
249 err_printf(m, " INSTDONE: 0x%08x\n", error->instdone[ring]); 252 err_printf(m, " INSTDONE: 0x%08x\n", error->instdone[ring]);
250 if (ring == RCS && INTEL_INFO(dev)->gen >= 4) 253 if (INTEL_INFO(dev)->gen >= 4) {
251 err_printf(m, " BBADDR: 0x%08llx\n", error->bbaddr); 254 err_printf(m, " BBADDR: 0x%08llx\n", error->bbaddr[ring]);
252 if (INTEL_INFO(dev)->gen >= 4)
253 err_printf(m, " BB_STATE: 0x%08x\n", error->bbstate[ring]); 255 err_printf(m, " BB_STATE: 0x%08x\n", error->bbstate[ring]);
254 if (INTEL_INFO(dev)->gen >= 4)
255 err_printf(m, " INSTPS: 0x%08x\n", error->instps[ring]); 256 err_printf(m, " INSTPS: 0x%08x\n", error->instps[ring]);
257 }
256 err_printf(m, " INSTPM: 0x%08x\n", error->instpm[ring]); 258 err_printf(m, " INSTPM: 0x%08x\n", error->instpm[ring]);
257 err_printf(m, " FADDR: 0x%08x\n", error->faddr[ring]); 259 err_printf(m, " FADDR: 0x%08x\n", error->faddr[ring]);
258 if (INTEL_INFO(dev)->gen >= 6) { 260 if (INTEL_INFO(dev)->gen >= 6) {
@@ -294,7 +296,6 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
294 struct drm_device *dev = error_priv->dev; 296 struct drm_device *dev = error_priv->dev;
295 drm_i915_private_t *dev_priv = dev->dev_private; 297 drm_i915_private_t *dev_priv = dev->dev_private;
296 struct drm_i915_error_state *error = error_priv->error; 298 struct drm_i915_error_state *error = error_priv->error;
297 struct intel_ring_buffer *ring;
298 int i, j, page, offset, elt; 299 int i, j, page, offset, elt;
299 300
300 if (!error) { 301 if (!error) {
@@ -329,7 +330,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
329 if (INTEL_INFO(dev)->gen == 7) 330 if (INTEL_INFO(dev)->gen == 7)
330 err_printf(m, "ERR_INT: 0x%08x\n", error->err_int); 331 err_printf(m, "ERR_INT: 0x%08x\n", error->err_int);
331 332
332 for_each_ring(ring, dev_priv, i) 333 for (i = 0; i < ARRAY_SIZE(error->ring); i++)
333 i915_ring_error_state(m, dev, error, i); 334 i915_ring_error_state(m, dev, error, i);
334 335
335 if (error->active_bo) 336 if (error->active_bo)
@@ -386,8 +387,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
386 } 387 }
387 } 388 }
388 389
389 obj = error->ring[i].ctx; 390 if ((obj = error->ring[i].ctx)) {
390 if (obj) {
391 err_printf(m, "%s --- HW Context = 0x%08x\n", 391 err_printf(m, "%s --- HW Context = 0x%08x\n",
392 dev_priv->ring[i].name, 392 dev_priv->ring[i].name,
393 obj->gtt_offset); 393 obj->gtt_offset);
@@ -668,7 +668,8 @@ i915_error_first_batchbuffer(struct drm_i915_private *dev_priv,
668 return NULL; 668 return NULL;
669 669
670 obj = ring->scratch.obj; 670 obj = ring->scratch.obj;
671 if (acthd >= i915_gem_obj_ggtt_offset(obj) && 671 if (obj != NULL &&
672 acthd >= i915_gem_obj_ggtt_offset(obj) &&
672 acthd < i915_gem_obj_ggtt_offset(obj) + obj->base.size) 673 acthd < i915_gem_obj_ggtt_offset(obj) + obj->base.size)
673 return i915_error_object_create(dev_priv, obj); 674 return i915_error_object_create(dev_priv, obj);
674 } 675 }
@@ -725,8 +726,9 @@ static void i915_record_ring_state(struct drm_device *dev,
725 error->ipehr[ring->id] = I915_READ(RING_IPEHR(ring->mmio_base)); 726 error->ipehr[ring->id] = I915_READ(RING_IPEHR(ring->mmio_base));
726 error->instdone[ring->id] = I915_READ(RING_INSTDONE(ring->mmio_base)); 727 error->instdone[ring->id] = I915_READ(RING_INSTDONE(ring->mmio_base));
727 error->instps[ring->id] = I915_READ(RING_INSTPS(ring->mmio_base)); 728 error->instps[ring->id] = I915_READ(RING_INSTPS(ring->mmio_base));
728 if (ring->id == RCS) 729 error->bbaddr[ring->id] = I915_READ(RING_BBADDR(ring->mmio_base));
729 error->bbaddr = I915_READ64(BB_ADDR); 730 if (INTEL_INFO(dev)->gen >= 8)
731 error->bbaddr[ring->id] |= (u64) I915_READ(RING_BBADDR_UDW(ring->mmio_base)) << 32;
730 error->bbstate[ring->id] = I915_READ(RING_BBSTATE(ring->mmio_base)); 732 error->bbstate[ring->id] = I915_READ(RING_BBSTATE(ring->mmio_base));
731 } else { 733 } else {
732 error->faddr[ring->id] = I915_READ(DMA_FADD_I8XX); 734 error->faddr[ring->id] = I915_READ(DMA_FADD_I8XX);
@@ -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 =