drm/i915: introduce i915_hangcheck_ring_hung
authorMika Kuoppala <mika.kuoppala@linux.intel.com>
Mon, 13 May 2013 13:32:11 +0000 (16:32 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 31 May 2013 18:53:54 +0000 (20:53 +0200)
In preparation to track per ring progress in hangcheck,
add i915_hangcheck_ring_hung.

v2: omit dev parameter (Ben Widawsky)

Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: Ben Widawsky <ben@bwidawsk.net>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_irq.c

index 004ad3455992eefd2e121b34c96aa0dc18297973..6efe3b0d3e84c01fbd1d1a7b0c317acecb087a5d 100644 (file)
@@ -2345,28 +2345,33 @@ static bool kick_ring(struct intel_ring_buffer *ring)
        return false;
 }
 
+static bool i915_hangcheck_ring_hung(struct intel_ring_buffer *ring)
+{
+       if (IS_GEN2(ring->dev))
+               return false;
+
+       /* Is the chip hanging on a WAIT_FOR_EVENT?
+        * If so we can simply poke the RB_WAIT bit
+        * and break the hang. This should work on
+        * all but the second generation chipsets.
+        */
+       return !kick_ring(ring);
+}
+
 static bool i915_hangcheck_hung(struct drm_device *dev)
 {
        drm_i915_private_t *dev_priv = dev->dev_private;
 
        if (dev_priv->gpu_error.hangcheck_count++ > 1) {
                bool hung = true;
+               struct intel_ring_buffer *ring;
+               int i;
 
                DRM_ERROR("Hangcheck timer elapsed... GPU hung\n");
                i915_handle_error(dev, true);
 
-               if (!IS_GEN2(dev)) {
-                       struct intel_ring_buffer *ring;
-                       int i;
-
-                       /* Is the chip hanging on a WAIT_FOR_EVENT?
-                        * If so we can simply poke the RB_WAIT bit
-                        * and break the hang. This should work on
-                        * all but the second generation chipsets.
-                        */
-                       for_each_ring(ring, dev_priv, i)
-                               hung &= !kick_ring(ring);
-               }
+               for_each_ring(ring, dev_priv, i)
+                       hung &= i915_hangcheck_ring_hung(ring);
 
                return hung;
        }