From 601fb4b746ac498e69356fba0c17a1f6ce78df6c Mon Sep 17 00:00:00 2001 From: Christoph Bumiller Date: Tue, 10 Jan 2012 00:38:19 +0100 Subject: [PATCH] nvc0: enable shader watchdog timer Prevent infinite loops in shaders from locking up the GPU. --- src/gallium/drivers/nvc0/nvc0_3d.xml.h | 2 ++ src/gallium/drivers/nvc0/nvc0_screen.c | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/gallium/drivers/nvc0/nvc0_3d.xml.h b/src/gallium/drivers/nvc0/nvc0_3d.xml.h index c32fa3a..8d6ea7e 100644 --- a/src/gallium/drivers/nvc0/nvc0_3d.xml.h +++ b/src/gallium/drivers/nvc0/nvc0_3d.xml.h @@ -315,6 +315,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define NVC0_3D_PATCH_VERTICES 0x00000dcc +#define NVC0_3D_WATCHDOG_TIMER 0x00000de4 + #define NVC0_3D_WINDOW_OFFSET_X 0x00000df8 #define NVC0_3D_WINDOW_OFFSET_Y 0x00000dfc diff --git a/src/gallium/drivers/nvc0/nvc0_screen.c b/src/gallium/drivers/nvc0/nvc0_screen.c index cecca0d..a991e67 100644 --- a/src/gallium/drivers/nvc0/nvc0_screen.c +++ b/src/gallium/drivers/nvc0/nvc0_screen.c @@ -466,6 +466,12 @@ nvc0_screen_create(struct nouveau_device *dev) BEGIN_RING(chan, RING_3D(COND_MODE), 1); OUT_RING (chan, NVC0_3D_COND_MODE_ALWAYS); + if (debug_get_bool_option("NOUVEAU_SHADER_WATCHDOG", TRUE)) { + /* kill shaders after about 1 second (at 100 MHz) */ + BEGIN_RING(chan, RING_3D(WATCHDOG_TIMER), 1); + OUT_RING (chan, 0x17); + } + BEGIN_RING(chan, RING_3D(RT_CONTROL), 1); OUT_RING (chan, 1); -- 2.7.4