#!/bin/bash
#
# 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
#

SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
. $SOURCE_DIR/drm_lib.sh

oldpath=`pwd`

cd $i915_dfs_path

if [ ! -f i915_ring_stop ] ; then
	echo "kernel doesn't support ring stopping"
	exit 77
fi

function check_iface {
    dir="$1"
    file="$2"
    mandatory="$3"

    [ -z "$dir" ] && return

    path="$dir/$file"
    echo checking ${path}

    if [ ! -f "$path" ] ; then
	if [  $mandatory != 0 ] ; then
	    echo "'${path}' not found";
	    exit 1;
	else
	    echo "${path} not mandatory";
	    return;
	fi
    fi

    if cat "$path" | grep -v "no error state collected" > /dev/null ; then
	echo "gpu hang detected"
	exit 2
    fi

    echo 0xf > i915_ring_stop
    echo "rings stopped"

    (cd $oldpath; $SOURCE_DIR/gem_exec_big) > /dev/null

    if cat "$path" | grep -v "no error state collected" > /dev/null ; then
	echo "gpu hang correctly detected"
    else
	echo "gpu hang not detected"
	exit 3
    fi

# clear error state
    echo > "$path"

    if cat "$path" | grep -v "no error state collected" > /dev/null ; then
	echo "gpu hang still present"
	exit 4
    fi
}

check_iface "$i915_dfs_path" i915_error_state 1
check_iface "$i915_sfs_path" error 0

exit 0
