Commit 33f3f518 authored by Daniel Vetter's avatar Daniel Vetter

drm/i915: add per-ring fault reg to error_state

This was pretty handy when figuring out what exactly went wrong with
ppgtt and it might also be useful when we stop filling the entire gart
with scratch page entries.

Also add the gen6+ DONE reg while at it.

v2: Chris Wilson suggested to allocate the error_state with kzalloc
for better paranoia. Also kill existing spurious clears of the
error_state while at it.
Reviewed-by: default avatarBen Widawsky <ben@bwidawsk.net>
Reviewed-by: default avatarEugeni Dodonov <eugeni.dodonov@intel.com>
Signed-Off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 4ca4a250
...@@ -718,8 +718,10 @@ static void i915_ring_error_state(struct seq_file *m, ...@@ -718,8 +718,10 @@ static void i915_ring_error_state(struct seq_file *m,
if (INTEL_INFO(dev)->gen >= 4) if (INTEL_INFO(dev)->gen >= 4)
seq_printf(m, " INSTPS: 0x%08x\n", error->instps[ring]); seq_printf(m, " INSTPS: 0x%08x\n", error->instps[ring]);
seq_printf(m, " INSTPM: 0x%08x\n", error->instpm[ring]); seq_printf(m, " INSTPM: 0x%08x\n", error->instpm[ring]);
if (INTEL_INFO(dev)->gen >= 6) if (INTEL_INFO(dev)->gen >= 6) {
seq_printf(m, " FADDR: 0x%08x\n", error->faddr[ring]); seq_printf(m, " FADDR: 0x%08x\n", error->faddr[ring]);
seq_printf(m, " FAULT_REG: 0x%08x\n", error->fault_reg[ring]);
}
seq_printf(m, " seqno: 0x%08x\n", error->seqno[ring]); seq_printf(m, " seqno: 0x%08x\n", error->seqno[ring]);
} }
...@@ -749,8 +751,10 @@ static int i915_error_state(struct seq_file *m, void *unused) ...@@ -749,8 +751,10 @@ static int i915_error_state(struct seq_file *m, void *unused)
for (i = 0; i < dev_priv->num_fence_regs; i++) for (i = 0; i < dev_priv->num_fence_regs; i++)
seq_printf(m, " fence[%d] = %08llx\n", i, error->fence[i]); seq_printf(m, " fence[%d] = %08llx\n", i, error->fence[i]);
if (INTEL_INFO(dev)->gen >= 6) if (INTEL_INFO(dev)->gen >= 6) {
seq_printf(m, "ERROR: 0x%08x\n", error->error); seq_printf(m, "ERROR: 0x%08x\n", error->error);
seq_printf(m, "DONE_REG: 0x%08x\n", error->done_reg);
}
i915_ring_error_state(m, dev, error, RCS); i915_ring_error_state(m, dev, error, RCS);
if (HAS_BLT(dev)) if (HAS_BLT(dev))
......
...@@ -165,6 +165,8 @@ struct drm_i915_error_state { ...@@ -165,6 +165,8 @@ struct drm_i915_error_state {
u32 instdone1; u32 instdone1;
u32 seqno[I915_NUM_RINGS]; u32 seqno[I915_NUM_RINGS];
u64 bbaddr; u64 bbaddr;
u32 fault_reg[I915_NUM_RINGS];
u32 done_reg;
u32 faddr[I915_NUM_RINGS]; u32 faddr[I915_NUM_RINGS];
u64 fence[I915_MAX_NUM_FENCES]; u64 fence[I915_MAX_NUM_FENCES];
struct timeval time; struct timeval time;
......
...@@ -882,8 +882,10 @@ static void i915_record_ring_state(struct drm_device *dev, ...@@ -882,8 +882,10 @@ static void i915_record_ring_state(struct drm_device *dev,
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
if (INTEL_INFO(dev)->gen >= 6) if (INTEL_INFO(dev)->gen >= 6) {
error->faddr[ring->id] = I915_READ(RING_DMA_FADD(ring->mmio_base)); error->faddr[ring->id] = I915_READ(RING_DMA_FADD(ring->mmio_base));
error->fault_reg[ring->id] = I915_READ(RING_FAULT_REG(ring));
}
if (INTEL_INFO(dev)->gen >= 4) { if (INTEL_INFO(dev)->gen >= 4) {
error->ipeir[ring->id] = I915_READ(RING_IPEIR(ring->mmio_base)); error->ipeir[ring->id] = I915_READ(RING_IPEIR(ring->mmio_base));
...@@ -898,7 +900,6 @@ static void i915_record_ring_state(struct drm_device *dev, ...@@ -898,7 +900,6 @@ static void i915_record_ring_state(struct drm_device *dev,
error->ipeir[ring->id] = I915_READ(IPEIR); error->ipeir[ring->id] = I915_READ(IPEIR);
error->ipehr[ring->id] = I915_READ(IPEHR); error->ipehr[ring->id] = I915_READ(IPEHR);
error->instdone[ring->id] = I915_READ(INSTDONE); error->instdone[ring->id] = I915_READ(INSTDONE);
error->bbaddr = 0;
} }
error->instpm[ring->id] = I915_READ(RING_INSTPM(ring->mmio_base)); error->instpm[ring->id] = I915_READ(RING_INSTPM(ring->mmio_base));
...@@ -932,7 +933,7 @@ static void i915_capture_error_state(struct drm_device *dev) ...@@ -932,7 +933,7 @@ static void i915_capture_error_state(struct drm_device *dev)
return; return;
/* Account for pipe specific data like PIPE*STAT */ /* Account for pipe specific data like PIPE*STAT */
error = kmalloc(sizeof(*error), GFP_ATOMIC); error = kzalloc(sizeof(*error), GFP_ATOMIC);
if (!error) { if (!error) {
DRM_DEBUG_DRIVER("out of memory, not capturing error state\n"); DRM_DEBUG_DRIVER("out of memory, not capturing error state\n");
return; return;
...@@ -946,10 +947,10 @@ static void i915_capture_error_state(struct drm_device *dev) ...@@ -946,10 +947,10 @@ static void i915_capture_error_state(struct drm_device *dev)
for_each_pipe(pipe) for_each_pipe(pipe)
error->pipestat[pipe] = I915_READ(PIPESTAT(pipe)); error->pipestat[pipe] = I915_READ(PIPESTAT(pipe));
if (INTEL_INFO(dev)->gen >= 6) if (INTEL_INFO(dev)->gen >= 6) {
error->error = I915_READ(ERROR_GEN6); error->error = I915_READ(ERROR_GEN6);
else error->done_reg = I915_READ(DONE_REG);
error->error = 0; }
i915_record_ring_state(dev, error, &dev_priv->ring[RCS]); i915_record_ring_state(dev, error, &dev_priv->ring[RCS]);
if (HAS_BLT(dev)) if (HAS_BLT(dev))
......
...@@ -319,6 +319,8 @@ ...@@ -319,6 +319,8 @@
#define RING_HWS_PGA(base) ((base)+0x80) #define RING_HWS_PGA(base) ((base)+0x80)
#define RING_HWS_PGA_GEN6(base) ((base)+0x2080) #define RING_HWS_PGA_GEN6(base) ((base)+0x2080)
#define RENDER_HWS_PGA_GEN7 (0x04080) #define RENDER_HWS_PGA_GEN7 (0x04080)
#define RING_FAULT_REG(ring) (0x4094 + 0x100*(ring)->id)
#define DONE_REG 0x40b0
#define BSD_HWS_PGA_GEN7 (0x04180) #define BSD_HWS_PGA_GEN7 (0x04180)
#define BLT_HWS_PGA_GEN7 (0x04280) #define BLT_HWS_PGA_GEN7 (0x04280)
#define RING_ACTHD(base) ((base)+0x74) #define RING_ACTHD(base) ((base)+0x74)
......
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