diff --git a/shared-core/nouveau_fifo.c b/shared-core/nouveau_fifo.c
index 437c84f..88a429a 100644
--- a/shared-core/nouveau_fifo.c
+++ b/shared-core/nouveau_fifo.c
@@ -342,6 +342,16 @@ nouveau_fifo_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
 	ret = engine->graph.create_context(chan);
 	if (ret) {
 		nouveau_fifo_free(chan);
+
+		NV_WRITE(NV04_PFIFO_CACHE1_DMA_PUSH,
+		NV_READ(NV04_PFIFO_CACHE1_DMA_PUSH) | 1);
+		NV_WRITE(NV03_PFIFO_CACHE1_PUSH0, 0x00000001);
+		NV_WRITE(NV04_PFIFO_CACHE1_PULL0, 0x00000001);
+		NV_WRITE(NV04_PFIFO_CACHE1_PULL1, 0x00000001);
+
+		/* reenable the fifo caches */
+		NV_WRITE(NV03_PFIFO_CACHES, 1);
+
 		return ret;
 	}
 
@@ -349,6 +359,16 @@ nouveau_fifo_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
 	ret = engine->fifo.create_context(chan);
 	if (ret) {
 		nouveau_fifo_free(chan);
+
+		NV_WRITE(NV04_PFIFO_CACHE1_DMA_PUSH,
+		NV_READ(NV04_PFIFO_CACHE1_DMA_PUSH) | 1);
+		NV_WRITE(NV03_PFIFO_CACHE1_PUSH0, 0x00000001);
+		NV_WRITE(NV04_PFIFO_CACHE1_PULL0, 0x00000001);
+		NV_WRITE(NV04_PFIFO_CACHE1_PULL1, 0x00000001);
+
+		/* reenable the fifo caches */
+		NV_WRITE(NV03_PFIFO_CACHES, 1);
+
 		return ret;
 	}
 

