Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92abe749 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau: fix suspend failure path to reinitialise all engines



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 39a654d5
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -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;
}