Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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];
+3 −1
Original line number Original line Diff line number Diff line
@@ -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,
		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);
+1 −0
Original line number Original line Diff line number Diff line
@@ -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