Re: [Intel-gfx] [PATCH 3/3] drm/i915: Use new INSTDONE registers

2012-08-16 Thread Jani Nikula
On Thu, 16 Aug 2012, Ben Widawsky b...@bwidawsk.net wrote:
 Using the extracted INSTDONE reading, and our new register definitions,
 update our hangcheck and error collection to use it.

Hi Ben, please find some nitpicks below...

BR,
Jani.


 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 | 47 
 +++--
  3 files changed, 37 insertions(+), 23 deletions(-)

 diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
 b/drivers/gpu/drm/i915/i915_debugfs.c
 index 0e8f14d..c1474fb 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++)

ARRAY_SIZE(error-extra_instdone)?

 + 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 9b69be6..cd2ee29 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];
 @@ -460,8 +460,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 0bf2f92..668bc70 100644
 --- a/drivers/gpu/drm/i915/i915_irq.c
 +++ b/drivers/gpu/drm/i915/i915_irq.c
 @@ -1075,12 +1075,26 @@ static void i915_get_extra_instdone(struct drm_device 
 *dev,
   uint32_t instdone[I915_NUM_INSTDONE_REG])
  {
   struct drm_i915_private *dev_priv = dev-dev_private;
 - 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;
   }
  }
  
 @@ -1106,10 +1120,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);
 @@ -1184,6 +1196,7 @@ static void i915_capture_error_state(struct drm_device 
 *dev)
   struct drm_i915_private *dev_priv = dev-dev_private;
   struct drm_i915_gem_object *obj;
   struct drm_i915_error_state *error;
 + uint32_t instdone[I915_NUM_INSTDONE_REG];
   unsigned long flags;
   int i, pipe;
  
 @@ -1225,6 +1238,10 @@ 

Re: [Intel-gfx] [PATCH 3/3] drm/i915: Use new INSTDONE registers

2012-08-16 Thread Ben Widawsky
On Thu, 16 Aug 2012 09:31:51 +0300
Jani Nikula jani.nik...@linux.intel.com wrote:

 On Thu, 16 Aug 2012, Ben Widawsky b...@bwidawsk.net wrote:
  Using the extracted INSTDONE reading, and our new register definitions,
  update our hangcheck and error collection to use it.
 
 Hi Ben, please find some nitpicks below...
 
 BR,
 Jani.
 
 
  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 | 47 
  +++--
   3 files changed, 37 insertions(+), 23 deletions(-)
 
  diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
  b/drivers/gpu/drm/i915/i915_debugfs.c
  index 0e8f14d..c1474fb 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++)
 
 ARRAY_SIZE(error-extra_instdone)?
 

Agree.

  +   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 9b69be6..cd2ee29 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];
  @@ -460,8 +460,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 0bf2f92..668bc70 100644
  --- a/drivers/gpu/drm/i915/i915_irq.c
  +++ b/drivers/gpu/drm/i915/i915_irq.c
  @@ -1075,12 +1075,26 @@ static void i915_get_extra_instdone(struct 
  drm_device *dev,
  uint32_t instdone[I915_NUM_INSTDONE_REG])
   {
  struct drm_i915_private *dev_priv = dev-dev_private;
  -   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;
  }
   }
   
  @@ -1106,10 +1120,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);
  @@ -1184,6 +1196,7 @@ static void i915_capture_error_state(struct 
  drm_device *dev)
  struct drm_i915_private *dev_priv = dev-dev_private;
  struct drm_i915_gem_object *obj;
  struct drm_i915_error_state *error;
  +   uint32_t 

[Intel-gfx] [PATCH 3/3] drm/i915: Use new INSTDONE registers

2012-08-15 Thread Ben Widawsky
Using the extracted INSTDONE reading, and our new register definitions,
update our hangcheck and error collection to use it.

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 | 47 +++--
 3 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 0e8f14d..c1474fb 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 9b69be6..cd2ee29 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];
@@ -460,8 +460,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 0bf2f92..668bc70 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1075,12 +1075,26 @@ static void i915_get_extra_instdone(struct drm_device 
*dev,
uint32_t instdone[I915_NUM_INSTDONE_REG])
 {
struct drm_i915_private *dev_priv = dev-dev_private;
-   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;
}
 }
 
@@ -1106,10 +1120,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);
@@ -1184,6 +1196,7 @@ static void i915_capture_error_state(struct drm_device 
*dev)
struct drm_i915_private *dev_priv = dev-dev_private;
struct drm_i915_gem_object *obj;
struct drm_i915_error_state *error;
+   uint32_t instdone[I915_NUM_INSTDONE_REG];
unsigned long flags;
int i, pipe;
 
@@ -1225,6 +1238,10 @@ static void i915_capture_error_state(struct drm_device 
*dev)
error-done_reg = I915_READ(DONE_REG);