drm/nouveau/gr: disable fifo access and idle before suspend ctx unload
authorBen Skeggs <bskeggs@redhat.com>
Wed, 20 Jul 2011 01:44:52 +0000 (11:44 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Sun, 24 Jul 2011 23:43:38 +0000 (09:43 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nv04_graph.c
drivers/gpu/drm/nouveau/nv10_graph.c
drivers/gpu/drm/nouveau/nv20_graph.c
drivers/gpu/drm/nouveau/nv50_graph.c

index 774cb7ab79f2750e335749e7ee4138345be20a43..dbdea8ed3925e85811f41e577535c1ce83733de4 100644 (file)
@@ -540,6 +540,11 @@ nv04_graph_init(struct drm_device *dev, int engine)
 static int
 nv04_graph_fini(struct drm_device *dev, int engine, bool suspend)
 {
+       nv_mask(dev, NV04_PGRAPH_FIFO, 0x00000001, 0x00000000);
+       if (!nv_wait(dev, NV04_PGRAPH_STATUS, ~0, 0) && suspend) {
+               nv_mask(dev, NV04_PGRAPH_FIFO, 0x00000001, 0x00000001);
+               return -EBUSY;
+       }
        nv04_graph_unload_context(dev);
        nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0x00000000);
        return 0;
index f22b323080a54e501e695091680f455e40b76639..7255e4a4d3f3dca38001ff23a163c0efefb39e20 100644 (file)
@@ -959,6 +959,11 @@ nv10_graph_init(struct drm_device *dev, int engine)
 static int
 nv10_graph_fini(struct drm_device *dev, int engine, bool suspend)
 {
+       nv_mask(dev, NV04_PGRAPH_FIFO, 0x00000001, 0x00000000);
+       if (!nv_wait(dev, NV04_PGRAPH_STATUS, ~0, 0) && suspend) {
+               nv_mask(dev, NV04_PGRAPH_FIFO, 0x00000001, 0x00000001);
+               return -EBUSY;
+       }
        nv10_graph_unload_context(dev);
        nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0x00000000);
        return 0;
index a54b7d9e7e262a8ea2323a5df08b1c06e4b8499a..183e37512ef90c6f300e5b7176a716e8fb410f2a 100644 (file)
@@ -656,6 +656,11 @@ nv30_graph_init(struct drm_device *dev, int engine)
 int
 nv20_graph_fini(struct drm_device *dev, int engine, bool suspend)
 {
+       nv_mask(dev, NV04_PGRAPH_FIFO, 0x00000001, 0x00000000);
+       if (!nv_wait(dev, NV04_PGRAPH_STATUS, ~0, 0) && suspend) {
+               nv_mask(dev, NV04_PGRAPH_FIFO, 0x00000001, 0x00000001);
+               return -EBUSY;
+       }
        nv20_graph_unload_context(dev);
        nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0x00000000);
        return 0;
index cce95dd99901a4307a6d44563f92c7ca8e980b12..d27dcf0790de2367336da3e0d4ac8c0c2ab0fa0f 100644 (file)
@@ -256,6 +256,11 @@ nv50_graph_init(struct drm_device *dev, int engine)
 static int
 nv50_graph_fini(struct drm_device *dev, int engine, bool suspend)
 {
+       nv_mask(dev, 0x400500, 0x00010001, 0x00000000);
+       if (!nv_wait(dev, 0x400700, ~0, 0) && suspend) {
+               nv_mask(dev, 0x400500, 0x00010001, 0x00010001);
+               return -EBUSY;
+       }
        nv50_graph_unload_context(dev);
        nv_wr32(dev, 0x40013c, 0x00000000);
        return 0;