|
@@ -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;
|
|
|
}
|
|
|
|