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

Commit 34311c73 authored by Francisco Jerez's avatar Francisco Jerez Committed by Ben Skeggs
Browse files

drm/nv50: Fix race with PFIFO during PGRAPH context destruction.

parent 670820c0
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -256,6 +256,7 @@ nv50_graph_destroy_context(struct nouveau_channel *chan)
	struct drm_device *dev = chan->dev;
	struct drm_device *dev = chan->dev;
	struct drm_nouveau_private *dev_priv = dev->dev_private;
	struct drm_nouveau_private *dev_priv = dev->dev_private;
	struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
	struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
	struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
	int i, hdr = (dev_priv->chipset == 0x50) ? 0x200 : 0x20;
	int i, hdr = (dev_priv->chipset == 0x50) ? 0x200 : 0x20;
	unsigned long flags;
	unsigned long flags;


@@ -265,6 +266,7 @@ nv50_graph_destroy_context(struct nouveau_channel *chan)
		return;
		return;


	spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
	spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
	pfifo->reassign(dev, false);
	pgraph->fifo_access(dev, false);
	pgraph->fifo_access(dev, false);


	if (pgraph->channel(dev) == chan)
	if (pgraph->channel(dev) == chan)
@@ -275,6 +277,7 @@ nv50_graph_destroy_context(struct nouveau_channel *chan)
	dev_priv->engine.instmem.flush(dev);
	dev_priv->engine.instmem.flush(dev);


	pgraph->fifo_access(dev, true);
	pgraph->fifo_access(dev, true);
	pfifo->reassign(dev, true);
	spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
	spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);


	nouveau_gpuobj_ref(NULL, &chan->ramin_grctx);
	nouveau_gpuobj_ref(NULL, &chan->ramin_grctx);