nv50: when destroying a channel make sure it's not still current on PFIFO
We won't get a PFIFO context switch when the same channel ID is recreated if the hw still thinks the channel is already active, which causes fun issues. Should allow X to be stopped and started without tearing down the entire card state in lastclose().main
parent
5a0164d1e1
commit
be72762816
|
@ -289,6 +289,7 @@ void
|
||||||
nv50_fifo_destroy_context(struct nouveau_channel *chan)
|
nv50_fifo_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;
|
||||||
|
|
||||||
DRM_DEBUG("ch%d\n", chan->id);
|
DRM_DEBUG("ch%d\n", chan->id);
|
||||||
|
|
||||||
|
@ -298,6 +299,9 @@ nv50_fifo_destroy_context(struct nouveau_channel *chan)
|
||||||
if (chan->id == 0)
|
if (chan->id == 0)
|
||||||
nv50_fifo_channel_disable(dev, 127, 0);
|
nv50_fifo_channel_disable(dev, 127, 0);
|
||||||
|
|
||||||
|
if ((NV_READ(NV03_PFIFO_CACHE1_PUSH1) & 0xffff) == chan->id)
|
||||||
|
NV_WRITE(NV03_PFIFO_CACHE1_PUSH1, 127);
|
||||||
|
|
||||||
nouveau_gpuobj_ref_del(dev, &chan->ramfc);
|
nouveau_gpuobj_ref_del(dev, &chan->ramfc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue