diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-10-27 15:36:41 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-10-27 18:31:09 -0400 |
commit | f406839f094ef24bb201c9574fdb9ce8e799a975 (patch) | |
tree | 88d6e38c2f2e840d0c11c694460722f2daa0cae6 /drivers/gpu/drm/i915 | |
parent | 71e9339c3389de6a685ecb26261a81b8a583aa1c (diff) |
drm/i915: Capture ERROR register on Sandybridge hangs
This holds error state from the main graphics arbiter mainly involving
the DMA engine and address translation.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 2 |
4 files changed, 17 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 2e5961139326..4fc1e05b769f 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -615,6 +615,9 @@ static int i915_error_state(struct seq_file *m, void *unused) | |||
615 | seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec, | 615 | seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec, |
616 | error->time.tv_usec); | 616 | error->time.tv_usec); |
617 | seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device); | 617 | seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device); |
618 | if (INTEL_INFO(dev)->gen >= 6) { | ||
619 | seq_printf(m, "ERROR: 0x%08x\n", error->error); | ||
620 | } | ||
618 | seq_printf(m, "EIR: 0x%08x\n", error->eir); | 621 | seq_printf(m, "EIR: 0x%08x\n", error->eir); |
619 | seq_printf(m, " PGTBL_ER: 0x%08x\n", error->pgtbl_er); | 622 | seq_printf(m, " PGTBL_ER: 0x%08x\n", error->pgtbl_er); |
620 | seq_printf(m, " INSTPM: 0x%08x\n", error->instpm); | 623 | seq_printf(m, " INSTPM: 0x%08x\n", error->instpm); |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index cdae5d189165..895f9173de58 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -142,6 +142,7 @@ struct sdvo_device_mapping { | |||
142 | struct drm_i915_error_state { | 142 | struct drm_i915_error_state { |
143 | u32 eir; | 143 | u32 eir; |
144 | u32 pgtbl_er; | 144 | u32 pgtbl_er; |
145 | u32 error; /* gen6+ */ | ||
145 | u32 pipeastat; | 146 | u32 pipeastat; |
146 | u32 pipebstat; | 147 | u32 pipebstat; |
147 | u32 ipeir; | 148 | u32 ipeir; |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 29cbcb33b92c..2a29497a4694 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -592,13 +592,11 @@ static void i915_capture_error_state(struct drm_device *dev) | |||
592 | error->pipeastat = I915_READ(PIPEASTAT); | 592 | error->pipeastat = I915_READ(PIPEASTAT); |
593 | error->pipebstat = I915_READ(PIPEBSTAT); | 593 | error->pipebstat = I915_READ(PIPEBSTAT); |
594 | error->instpm = I915_READ(INSTPM); | 594 | error->instpm = I915_READ(INSTPM); |
595 | if (INTEL_INFO(dev)->gen < 4) { | 595 | error->error = 0; |
596 | error->ipeir = I915_READ(IPEIR); | 596 | if (INTEL_INFO(dev)->gen >= 6) { |
597 | error->ipehr = I915_READ(IPEHR); | 597 | error->error = I915_READ(ERROR_GEN6); |
598 | error->instdone = I915_READ(INSTDONE); | 598 | } |
599 | error->acthd = I915_READ(ACTHD); | 599 | if (INTEL_INFO(dev)->gen >= 4) { |
600 | error->bbaddr = 0; | ||
601 | } else { | ||
602 | error->ipeir = I915_READ(IPEIR_I965); | 600 | error->ipeir = I915_READ(IPEIR_I965); |
603 | error->ipehr = I915_READ(IPEHR_I965); | 601 | error->ipehr = I915_READ(IPEHR_I965); |
604 | error->instdone = I915_READ(INSTDONE_I965); | 602 | error->instdone = I915_READ(INSTDONE_I965); |
@@ -606,6 +604,12 @@ static void i915_capture_error_state(struct drm_device *dev) | |||
606 | error->instdone1 = I915_READ(INSTDONE1); | 604 | error->instdone1 = I915_READ(INSTDONE1); |
607 | error->acthd = I915_READ(ACTHD_I965); | 605 | error->acthd = I915_READ(ACTHD_I965); |
608 | error->bbaddr = I915_READ64(BB_ADDR); | 606 | error->bbaddr = I915_READ64(BB_ADDR); |
607 | } else { | ||
608 | error->ipeir = I915_READ(IPEIR); | ||
609 | error->ipehr = I915_READ(IPEHR); | ||
610 | error->instdone = I915_READ(INSTDONE); | ||
611 | error->acthd = I915_READ(ACTHD); | ||
612 | error->bbaddr = 0; | ||
609 | } | 613 | } |
610 | 614 | ||
611 | bbaddr = i915_ringbuffer_last_batch(dev); | 615 | bbaddr = i915_ringbuffer_last_batch(dev); |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 25ed911a3112..fc161196da21 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -306,6 +306,8 @@ | |||
306 | #define NOPID 0x02094 | 306 | #define NOPID 0x02094 |
307 | #define HWSTAM 0x02098 | 307 | #define HWSTAM 0x02098 |
308 | 308 | ||
309 | #define ERROR_GEN6 0x040a0 | ||
310 | |||
309 | #define MI_MODE 0x0209c | 311 | #define MI_MODE 0x0209c |
310 | # define VS_TIMER_DISPATCH (1 << 6) | 312 | # define VS_TIMER_DISPATCH (1 << 6) |
311 | # define MI_FLUSH_ENABLE (1 << 11) | 313 | # define MI_FLUSH_ENABLE (1 << 11) |