Using the extracted INSTDONE reading, and our new register definitions,
update our hangcheck and error collection to use it.

v2: Now assuming i915_get_extra_instdone does the memset we can clean up the
code a bit (Jani)
I ignored some of Jani's bikesheds as I didn't see any value to the 
modification.

Cc: Jani Nikula <jani.nik...@intel.com>
Signed-off-by: Ben Widawsky <b...@bwidawsk.net>
---
 drivers/gpu/drm/i915/i915_debugfs.c |  8 ++++---
 drivers/gpu/drm/i915/i915_drv.h     |  5 ++---
 drivers/gpu/drm/i915/i915_irq.c     | 43 ++++++++++++++++++++++---------------
 3 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index a18e936..ee9fd16 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -645,10 +645,9 @@ static void i915_ring_error_state(struct seq_file *m,
        seq_printf(m, "  IPEIR: 0x%08x\n", error->ipeir[ring]);
        seq_printf(m, "  IPEHR: 0x%08x\n", error->ipehr[ring]);
        seq_printf(m, "  INSTDONE: 0x%08x\n", error->instdone[ring]);
-       if (ring == RCS && INTEL_INFO(dev)->gen >= 4) {
-               seq_printf(m, "  INSTDONE1: 0x%08x\n", error->instdone1);
+       if (ring == RCS && INTEL_INFO(dev)->gen >= 4)
                seq_printf(m, "  BBADDR: 0x%08llx\n", error->bbaddr);
-       }
+
        if (INTEL_INFO(dev)->gen >= 4)
                seq_printf(m, "  INSTPS: 0x%08x\n", error->instps[ring]);
        seq_printf(m, "  INSTPM: 0x%08x\n", error->instpm[ring]);
@@ -697,6 +696,9 @@ static int i915_error_state(struct seq_file *m, void 
*unused)
        for (i = 0; i < dev_priv->num_fence_regs; i++)
                seq_printf(m, "  fence[%d] = %08llx\n", i, error->fence[i]);
 
+       for (i = 0; i < I915_NUM_INSTDONE_REG; i++)
+               seq_printf(m, "  INSTDONE_%d: 0x%08x\n", i, 
error->extra_instdone[i]);
+
        if (INTEL_INFO(dev)->gen >= 6) {
                seq_printf(m, "ERROR: 0x%08x\n", error->error);
                seq_printf(m, "DONE_REG: 0x%08x\n", error->done_reg);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index ed3ba70..17dd520 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -198,7 +198,7 @@ struct drm_i915_error_state {
        u32 error; /* gen6+ */
        u32 instpm[I915_NUM_RINGS];
        u32 instps[I915_NUM_RINGS];
-       u32 instdone1;
+       u32 extra_instdone[I915_NUM_INSTDONE_REG];
        u32 seqno[I915_NUM_RINGS];
        u64 bbaddr;
        u32 fault_reg[I915_NUM_RINGS];
@@ -453,8 +453,7 @@ typedef struct drm_i915_private {
        struct timer_list hangcheck_timer;
        int hangcheck_count;
        uint32_t last_acthd[I915_NUM_RINGS];
-       uint32_t last_instdone;
-       uint32_t last_instdone1;
+       uint32_t prev_instdone[I915_NUM_INSTDONE_REG];
 
        unsigned int stop_rings;
 
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 46eb6e9..f595d01 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1078,12 +1078,25 @@ static void i915_get_extra_instdone(struct drm_device 
*dev,
        struct drm_i915_private *dev_priv = dev->dev_private;
        memset(instdone, 0, sizeof(instdone));
 
-       if (INTEL_INFO(dev)->gen < 4) {
+       switch(INTEL_INFO(dev)->gen) {
+       case 2:
+       case 3:
                instdone[0] = I915_READ(INSTDONE);
-               instdone[1] = 0;
-       } else {
+               break;
+       case 4:
+       case 5:
+       case 6:
                instdone[0] = I915_READ(INSTDONE_I965);
                instdone[1] = I915_READ(INSTDONE1);
+               break;
+       default:
+               WARN_ONCE(1, "Unsupported platform\n");
+       case 7:
+               instdone[0] = I915_READ(GEN7_INSTDONE_1);
+               instdone[1] = I915_READ(GEN7_SC_INSTDONE);
+               instdone[2] = I915_READ(GEN7_SAMPLER_INSTDONE);
+               instdone[3] = I915_READ(GEN7_ROW_INSTDONE);
+               break;
        }
 }
 
@@ -1109,10 +1122,8 @@ static void i915_record_ring_state(struct drm_device 
*dev,
                error->ipehr[ring->id] = I915_READ(RING_IPEHR(ring->mmio_base));
                error->instdone[ring->id] = 
I915_READ(RING_INSTDONE(ring->mmio_base));
                error->instps[ring->id] = 
I915_READ(RING_INSTPS(ring->mmio_base));
-               if (ring->id == RCS) {
-                       error->instdone1 = I915_READ(INSTDONE1);
+               if (ring->id == RCS)
                        error->bbaddr = I915_READ64(BB_ADDR);
-               }
        } else {
                error->faddr[ring->id] = I915_READ(DMA_FADD_I8XX);
                error->ipeir[ring->id] = I915_READ(IPEIR);
@@ -1228,6 +1239,8 @@ static void i915_capture_error_state(struct drm_device 
*dev)
                error->done_reg = I915_READ(DONE_REG);
        }
 
+       i915_get_extra_instdone(dev, error->extra_instdone);
+
        i915_gem_record_fences(dev, error);
        i915_gem_record_rings(dev, error);
 
@@ -1305,7 +1318,7 @@ static void i915_report_and_clear_eir(struct drm_device 
*dev)
        struct drm_i915_private *dev_priv = dev->dev_private;
        uint32_t instdone[I915_NUM_INSTDONE_REG];
        u32 eir = I915_READ(EIR);
-       int pipe;
+       int pipe, i;
 
        if (!eir)
                return;
@@ -1320,9 +1333,9 @@ static void i915_report_and_clear_eir(struct drm_device 
*dev)
 
                        pr_err("  IPEIR: 0x%08x\n", I915_READ(IPEIR_I965));
                        pr_err("  IPEHR: 0x%08x\n", I915_READ(IPEHR_I965));
-                       pr_err("  INSTDONE: 0x%08x\n", instdone[0]);
+                       for (i = 0; i < I915_NUM_INSTDONE_REG; i++)
+                               pr_err("  INSTDONE_%d: 0x%08x\n", i, 
instdone[i]);
                        pr_err("  INSTPS: 0x%08x\n", I915_READ(INSTPS));
-                       pr_err("  INSTDONE1: 0x%08x\n", instdone[1]);
                        pr_err("  ACTHD: 0x%08x\n", I915_READ(ACTHD_I965));
                        I915_WRITE(IPEIR_I965, ipeir);
                        POSTING_READ(IPEIR_I965);
@@ -1356,12 +1369,13 @@ static void i915_report_and_clear_eir(struct drm_device 
*dev)
        if (eir & I915_ERROR_INSTRUCTION) {
                pr_err("instruction error\n");
                pr_err("  INSTPM: 0x%08x\n", I915_READ(INSTPM));
+               for (i = 0; i < I915_NUM_INSTDONE_REG; i++)
+                       pr_err("  INSTDONE_%d: 0x%08x\n", i, instdone[i]);
                if (INTEL_INFO(dev)->gen < 4) {
                        u32 ipeir = I915_READ(IPEIR);
 
                        pr_err("  IPEIR: 0x%08x\n", I915_READ(IPEIR));
                        pr_err("  IPEHR: 0x%08x\n", I915_READ(IPEHR));
-                       pr_err("  INSTDONE: 0x%08x\n", instdone[0]);
                        pr_err("  ACTHD: 0x%08x\n", I915_READ(ACTHD));
                        I915_WRITE(IPEIR, ipeir);
                        POSTING_READ(IPEIR);
@@ -1370,9 +1384,7 @@ static void i915_report_and_clear_eir(struct drm_device 
*dev)
 
                        pr_err("  IPEIR: 0x%08x\n", I915_READ(IPEIR_I965));
                        pr_err("  IPEHR: 0x%08x\n", I915_READ(IPEHR_I965));
-                       pr_err("  INSTDONE: 0x%08x\n", instdone[0]);
                        pr_err("  INSTPS: 0x%08x\n", I915_READ(INSTPS));
-                       pr_err("  INSTDONE1: 0x%08x\n", instdone[1]);
                        pr_err("  ACTHD: 0x%08x\n", I915_READ(ACTHD_I965));
                        I915_WRITE(IPEIR_I965, ipeir);
                        POSTING_READ(IPEIR_I965);
@@ -1716,18 +1728,15 @@ void i915_hangcheck_elapsed(unsigned long data)
        }
 
        i915_get_extra_instdone(dev, instdone);
-
        if (memcmp(dev_priv->last_acthd, acthd, sizeof(acthd)) == 0 &&
-           dev_priv->last_instdone == instdone[0] &&
-           dev_priv->last_instdone1 == instdone[1]) {
+           memcmp(dev_priv->prev_instdone, instdone, sizeof(instdone)) == 0) {
                if (i915_hangcheck_hung(dev))
                        return;
        } else {
                dev_priv->hangcheck_count = 0;
 
                memcpy(dev_priv->last_acthd, acthd, sizeof(acthd));
-               dev_priv->last_instdone = instdone[0];
-               dev_priv->last_instdone1 = instdone[1];
+               memcpy(dev_priv->prev_instdone, instdone, sizeof(instdone));
        }
 
 repeat:
-- 
1.7.11.5

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to