OSDN Git Service

nv50: when destroying a channel make sure it's not still current on PFIFO
authorBen Skeggs <skeggsb@gmail.com>
Wed, 25 Jun 2008 06:45:41 +0000 (16:45 +1000)
committerBen Skeggs <skeggsb@gmail.com>
Wed, 25 Jun 2008 06:49:48 +0000 (16:49 +1000)
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().

shared-core/nv50_fifo.c

index edf4edb..d681066 100644 (file)
@@ -289,6 +289,7 @@ void
 nv50_fifo_destroy_context(struct nouveau_channel *chan)
 {
        struct drm_device *dev = chan->dev;
+       struct drm_nouveau_private *dev_priv = dev->dev_private;
 
        DRM_DEBUG("ch%d\n", chan->id);
 
@@ -298,6 +299,9 @@ nv50_fifo_destroy_context(struct nouveau_channel *chan)
        if (chan->id == 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);
 }