nvc0: enable shader watchdog timer
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Mon, 9 Jan 2012 23:38:19 +0000 (00:38 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Mon, 9 Jan 2012 23:38:19 +0000 (00:38 +0100)
Prevent infinite loops in shaders from locking up the GPU.

src/gallium/drivers/nvc0/nvc0_3d.xml.h
src/gallium/drivers/nvc0/nvc0_screen.c

index c32fa3ac93949d691be90773c908d8becc2d3175..8d6ea7e2745958c0512d5b03ee45e85025a50311 100644 (file)
@@ -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
index cecca0da515c7da9099c3d2436e47e17c6795f61..a991e67af5c5b9479f51bb90ec34f251ce6410e7 100644 (file)
@@ -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);