Commit ad8beaea authored by Mika Kuoppala's avatar Mika Kuoppala Committed by Daniel Vetter

drm/i915: store ring hangcheck action

For guilty batchbuffer analysis later on when rings are reset,
store what state the ring was on when hang was declared.
This helps to weed out the waiting rings from the active ones.
Signed-off-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Acked-by: default avatarBen Widawsky <ben@bwidawsk.net>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 7d736f4f
...@@ -2380,7 +2380,8 @@ static void semaphore_clear_deadlocks(struct drm_i915_private *dev_priv) ...@@ -2380,7 +2380,8 @@ static void semaphore_clear_deadlocks(struct drm_i915_private *dev_priv)
ring->hangcheck.deadlock = false; ring->hangcheck.deadlock = false;
} }
static enum { wait, active, kick, hung } ring_stuck(struct intel_ring_buffer *ring, u32 acthd) static enum intel_ring_hangcheck_action
ring_stuck(struct intel_ring_buffer *ring, u32 acthd)
{ {
struct drm_device *dev = ring->dev; struct drm_device *dev = ring->dev;
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
...@@ -2483,7 +2484,10 @@ void i915_hangcheck_elapsed(unsigned long data) ...@@ -2483,7 +2484,10 @@ void i915_hangcheck_elapsed(unsigned long data)
* being repeatedly kicked and so responsible * being repeatedly kicked and so responsible
* for stalling the machine. * for stalling the machine.
*/ */
switch (ring_stuck(ring, acthd)) { ring->hangcheck.action = ring_stuck(ring,
acthd);
switch (ring->hangcheck.action) {
case wait: case wait:
score = 0; score = 0;
break; break;
......
...@@ -37,11 +37,14 @@ struct intel_hw_status_page { ...@@ -37,11 +37,14 @@ struct intel_hw_status_page {
#define I915_READ_SYNC_0(ring) I915_READ(RING_SYNC_0((ring)->mmio_base)) #define I915_READ_SYNC_0(ring) I915_READ(RING_SYNC_0((ring)->mmio_base))
#define I915_READ_SYNC_1(ring) I915_READ(RING_SYNC_1((ring)->mmio_base)) #define I915_READ_SYNC_1(ring) I915_READ(RING_SYNC_1((ring)->mmio_base))
enum intel_ring_hangcheck_action { wait, active, kick, hung };
struct intel_ring_hangcheck { struct intel_ring_hangcheck {
bool deadlock; bool deadlock;
u32 seqno; u32 seqno;
u32 acthd; u32 acthd;
int score; int score;
enum intel_ring_hangcheck_action action;
}; };
struct intel_ring_buffer { struct intel_ring_buffer {
......
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