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

Commit 6c320fef authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau: pass flag to engine fini() method on suspend



It may not be necessary to fail in certain cases (such as failing to idle)
on module unload, whereas on suspend it's important to ensure a consistent
state can be restored on resume.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 70ad25ab
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -214,9 +214,12 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
	pfifo->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)
		if (!dev_priv->eng[e])
			continue;

		ret = dev_priv->eng[e]->fini(dev, e, true);
		if (ret) {
			NV_ERROR(dev, "... engine %d failed: %d\n", i, ret);
			goto out_abort;
		}
	}
+1 −1
Original line number Diff line number Diff line
@@ -312,7 +312,7 @@ struct nouveau_channel {
struct nouveau_exec_engine {
	void (*destroy)(struct drm_device *, int engine);
	int  (*init)(struct drm_device *, int engine);
	int  (*fini)(struct drm_device *, int engine);
	int  (*fini)(struct drm_device *, int engine, bool suspend);
	int  (*context_new)(struct nouveau_channel *, int engine);
	void (*context_del)(struct nouveau_channel *, int engine);
	int  (*object_new)(struct nouveau_channel *, int engine,
+2 −2
Original line number Diff line number Diff line
@@ -695,7 +695,7 @@ nouveau_card_init(struct drm_device *dev)
		for (e = e - 1; e >= 0; e--) {
			if (!dev_priv->eng[e])
				continue;
			dev_priv->eng[e]->fini(dev, e);
			dev_priv->eng[e]->fini(dev, e, false);
			dev_priv->eng[e]->destroy(dev,e );
		}
	}
@@ -747,7 +747,7 @@ static void nouveau_card_takedown(struct drm_device *dev)
		engine->fifo.takedown(dev);
		for (e = NVOBJ_ENGINE_NR - 1; e >= 0; e--) {
			if (dev_priv->eng[e]) {
				dev_priv->eng[e]->fini(dev, e);
				dev_priv->eng[e]->fini(dev, e, false);
				dev_priv->eng[e]->destroy(dev,e );
			}
		}
+1 −1
Original line number Diff line number Diff line
@@ -538,7 +538,7 @@ nv04_graph_init(struct drm_device *dev, int engine)
}

static int
nv04_graph_fini(struct drm_device *dev, int engine)
nv04_graph_fini(struct drm_device *dev, int engine, bool suspend)
{
	nv04_graph_unload_context(dev);
	nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0x00000000);
+1 −1
Original line number Diff line number Diff line
@@ -957,7 +957,7 @@ nv10_graph_init(struct drm_device *dev, int engine)
}

static int
nv10_graph_fini(struct drm_device *dev, int engine)
nv10_graph_fini(struct drm_device *dev, int engine, bool suspend)
{
	nv10_graph_unload_context(dev);
	nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0x00000000);
Loading