drm/nvc0: backup bar3 channel on suspend
authorBen Skeggs <bskeggs@redhat.com>
Wed, 4 Aug 2010 12:48:34 +0000 (22:48 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 5 Aug 2010 22:35:54 +0000 (08:35 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvc0_instmem.c

index e2a0bb84d91076e9345d390dd080ceae5a6f2211..e74bd454f63b640c1ae7ccaf9d24b5fb65669be6 100644 (file)
@@ -141,12 +141,34 @@ nvc0_instmem_flush(struct drm_device *dev)
 int
 nvc0_instmem_suspend(struct drm_device *dev)
 {
+       struct drm_nouveau_private *dev_priv = dev->dev_private;
+       int i;
+
+       dev_priv->susres.ramin_copy = vmalloc(65536);
+       if (!dev_priv->susres.ramin_copy)
+               return -ENOMEM;
+
+       for (i = 0x700000; i < 0x710000; i += 4)
+               dev_priv->susres.ramin_copy[i/4] = nv_rd32(dev, i);
        return 0;
 }
 
 void
 nvc0_instmem_resume(struct drm_device *dev)
 {
+       struct drm_nouveau_private *dev_priv = dev->dev_private;
+       u64 chan;
+       int i;
+
+       chan = dev_priv->vram_size - dev_priv->ramin_rsvd_vram;
+       nv_wr32(dev, 0x001700, chan >> 16);
+
+       for (i = 0x700000; i < 0x710000; i += 4)
+               nv_wr32(dev, i, dev_priv->susres.ramin_copy[i/4]);
+       vfree(dev_priv->susres.ramin_copy);
+       dev_priv->susres.ramin_copy = NULL;
+
+       nv_wr32(dev, 0x001714, 0xc0000000 | (chan >> 12));
 }
 
 int