Commit 94e39e28 authored by Chris Wilson's avatar Chris Wilson Committed by Daniel Vetter

drm/i915: Capture batchbuffer state upon GPU hang

The bbstate contains useful bits of debugging information such as
whether the batch is being read from GTT or PPGTT, or whether it is
allowed to execute privileged instructions.

v2: Only record BB_STATE for gen4+
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent f4adcd24
...@@ -299,6 +299,7 @@ struct drm_i915_error_state { ...@@ -299,6 +299,7 @@ struct drm_i915_error_state {
u32 cpu_ring_tail[I915_NUM_RINGS]; u32 cpu_ring_tail[I915_NUM_RINGS];
u32 error; /* gen6+ */ u32 error; /* gen6+ */
u32 err_int; /* gen7 */ u32 err_int; /* gen7 */
u32 bbstate[I915_NUM_RINGS];
u32 instpm[I915_NUM_RINGS]; u32 instpm[I915_NUM_RINGS];
u32 instps[I915_NUM_RINGS]; u32 instps[I915_NUM_RINGS];
u32 extra_instdone[I915_NUM_INSTDONE_REG]; u32 extra_instdone[I915_NUM_INSTDONE_REG];
......
...@@ -249,7 +249,8 @@ static void i915_ring_error_state(struct drm_i915_error_state_buf *m, ...@@ -249,7 +249,8 @@ static void i915_ring_error_state(struct drm_i915_error_state_buf *m,
err_printf(m, " INSTDONE: 0x%08x\n", error->instdone[ring]); err_printf(m, " INSTDONE: 0x%08x\n", error->instdone[ring]);
if (ring == RCS && INTEL_INFO(dev)->gen >= 4) if (ring == RCS && INTEL_INFO(dev)->gen >= 4)
err_printf(m, " BBADDR: 0x%08llx\n", error->bbaddr); err_printf(m, " BBADDR: 0x%08llx\n", error->bbaddr);
if (INTEL_INFO(dev)->gen >= 4)
err_printf(m, " BB_STATE: 0x%08x\n", error->bbstate[ring]);
if (INTEL_INFO(dev)->gen >= 4) if (INTEL_INFO(dev)->gen >= 4)
err_printf(m, " INSTPS: 0x%08x\n", error->instps[ring]); err_printf(m, " INSTPS: 0x%08x\n", error->instps[ring]);
err_printf(m, " INSTPM: 0x%08x\n", error->instpm[ring]); err_printf(m, " INSTPM: 0x%08x\n", error->instpm[ring]);
...@@ -725,6 +726,7 @@ static void i915_record_ring_state(struct drm_device *dev, ...@@ -725,6 +726,7 @@ static void i915_record_ring_state(struct drm_device *dev,
error->instps[ring->id] = I915_READ(RING_INSTPS(ring->mmio_base)); error->instps[ring->id] = I915_READ(RING_INSTPS(ring->mmio_base));
if (ring->id == RCS) if (ring->id == RCS)
error->bbaddr = I915_READ64(BB_ADDR); error->bbaddr = I915_READ64(BB_ADDR);
error->bbstate[ring->id] = I915_READ(RING_BBSTATE(ring->mmio_base));
} else { } else {
error->faddr[ring->id] = I915_READ(DMA_FADD_I8XX); error->faddr[ring->id] = I915_READ(DMA_FADD_I8XX);
error->ipeir[ring->id] = I915_READ(IPEIR); error->ipeir[ring->id] = I915_READ(IPEIR);
......
...@@ -718,6 +718,7 @@ ...@@ -718,6 +718,7 @@
#define NOPID 0x02094 #define NOPID 0x02094
#define HWSTAM 0x02098 #define HWSTAM 0x02098
#define DMA_FADD_I8XX 0x020d0 #define DMA_FADD_I8XX 0x020d0
#define RING_BBSTATE(base) ((base)+0x110)
#define ERROR_GEN6 0x040a0 #define ERROR_GEN6 0x040a0
#define GEN7_ERR_INT 0x44040 #define GEN7_ERR_INT 0x44040
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment