tests: add ZZ_hangman
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Sun, 15 Jan 2012 15:39:49 +0000 (16:39 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Sun, 15 Jan 2012 15:39:49 +0000 (16:39 +0100)
Not yet enabled by default because the kernel can't recover from this
on chips where we don't have a gpu reset implemented.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
tests/ZZ_hangman [new file with mode: 0755]

diff --git a/tests/ZZ_hangman b/tests/ZZ_hangman
new file mode 100755 (executable)
index 0000000..7afda57
--- /dev/null
@@ -0,0 +1,62 @@
+#!/bin/sh
+#
+# Testcase: Simulate gpu hang
+#
+# This check uses the stop_rings facility to exercise the gpu hang code.
+# by reading /sys/kernel/debug/dri/0/i915_emon_status too quickly
+#
+
+if [ -d /debug/dri ] ; then
+       debugfs_path=/debug_dri
+fi
+
+if [ -d /sys/kernel/debug/dri ] ; then
+       debugfs_path=/sys/kernel/debug/dri
+fi
+
+cur_path=`pwd`
+i915_path=x
+for dir in `ls $debugfs_path` ; do
+       if [ -f $debugfs_path/$dir/i915_error_state ] ; then
+               i915_path=$debugfs_path/$dir
+               break
+       fi
+done
+
+if [ $i915_path = "x" ] ; then
+       echo i915 debugfs path not found.
+       exit 1
+fi
+
+cd $i915_path
+
+if [ ! -f i915_ring_stop ] ; then
+       echo "kernel doesn't support ring stopping"
+       exit 77
+fi
+
+if cat i915_error_state | grep -v "no error state collected" > /dev/null ; then
+       echo "gpu hang dectected"
+       exit 1
+fi
+
+# stop rings
+echo 0xf > i915_ring_stop
+
+# need to run it twice, otherwise there are no waiters
+$cur_path/gem_exec_nop > /dev/null 2>&1 &
+$cur_path/gem_exec_nop > /dev/null 2>&1 &
+
+sleep 10
+
+if cat i915_error_state | grep -v "no error state collected" > /dev/null ; then
+       echo "gpu hang correctly dectected"
+else
+       echo "gpu hang not dectected"
+       exit 2
+fi
+
+# clear error state
+echo 0 > i915_ring_stop
+
+exit 0