diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gpu_error.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gpu_error.c | 34 |
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 = |