OSDN Git Service

drm/nouveau: fix suspend failure path to reinitialise all engines
authorBen Skeggs <bskeggs@redhat.com>
Fri, 1 Apr 2011 03:26:35 +0000 (13:26 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Mon, 16 May 2011 00:48:42 +0000 (10:48 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_drv.c

index ba87173..126216f 100644 (file)
@@ -162,11 +162,10 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
        struct drm_device *dev = pci_get_drvdata(pdev);
        struct drm_nouveau_private *dev_priv = dev->dev_private;
        struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
-       struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
        struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
        struct nouveau_channel *chan;
        struct drm_crtc *crtc;
-       int ret, i;
+       int ret, i, e;
 
        if (pm_state.event == PM_EVENT_PRETHAW)
                return 0;
@@ -206,19 +205,17 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
                        nouveau_channel_idle(chan);
        }
 
-       pgraph->fifo_access(dev, false);
-       nouveau_wait_for_idle(dev);
-
-       for (i = NVOBJ_ENGINE_NR - 1; i >= 0; i--) {
-               if (dev_priv->eng[i])
-                       dev_priv->eng[i]->fini(dev, i);
-       }
-
        pfifo->reassign(dev, false);
        pfifo->disable(dev);
        pfifo->unload_context(dev);
-       if (pgraph->unload_context)
-               pgraph->unload_context(dev);
+
+       for (e = NVOBJ_ENGINE_NR - 1; e >= 0; e--) {
+               if (dev_priv->eng[e]) {
+                       ret = dev_priv->eng[e]->fini(dev, e);
+                       if (ret)
+                               goto out_abort;
+               }
+       }
 
        ret = pinstmem->suspend(dev);
        if (ret) {
@@ -249,9 +246,12 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
 
 out_abort:
        NV_INFO(dev, "Re-enabling acceleration..\n");
+       for (e = e + 1; e < NVOBJ_ENGINE_NR; e++) {
+               if (dev_priv->eng[e])
+                       dev_priv->eng[e]->init(dev, e);
+       }
        pfifo->enable(dev);
        pfifo->reassign(dev, true);
-       pgraph->fifo_access(dev, true);
        return ret;
 }