drm/nouveau: Fix a crash at card takedown for NV40 and older cards
authorJimmy Rentz <jb17bsome@gmail.com>
Sun, 17 Apr 2011 20:15:09 +0000 (16:15 -0400)
committerBen Skeggs <bskeggs@redhat.com>
Mon, 16 May 2011 00:50:04 +0000 (10:50 +1000)
NV40 and older cards (pre NV50) reserve a vram bo for the vga memory at
card init. This bo is then freed at card shutdown.  The problem is that
the ttm bo vram manager was already freed. So a crash occurs when the
vga bo is freed. The fix is to free the vga bo prior to freeing the ttm
bo vram manager. There might be other solutions but this seemed the
simplest to me.

Signed-off-by: Jimmy Rentz <jb17bsome@gmail.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_mem.c
drivers/gpu/drm/nouveau/nouveau_state.c

index 9c7bc3f396c43cb08279c9dd569c9de6800d2886..ce3cb5eb33d02e998eea6d7bf338d7af6db75862 100644 (file)
@@ -154,8 +154,6 @@ nouveau_mem_vram_fini(struct drm_device *dev)
 {
        struct drm_nouveau_private *dev_priv = dev->dev_private;
 
-       nouveau_bo_ref(NULL, &dev_priv->vga_ram);
-
        ttm_bo_device_release(&dev_priv->ttm.bdev);
 
        nouveau_ttm_global_release(dev_priv);
index f316157217b530d741a3d8223cd26b935ec2525a..8771677d6c5e8a1ff3b9e8fdede033c798bad320 100644 (file)
@@ -738,6 +738,11 @@ static void nouveau_card_takedown(struct drm_device *dev)
        engine->mc.takedown(dev);
        engine->display.late_takedown(dev);
 
+       if (dev_priv->vga_ram) {
+               nouveau_bo_unpin(dev_priv->vga_ram);
+               nouveau_bo_ref(NULL, &dev_priv->vga_ram);
+       }
+
        mutex_lock(&dev->struct_mutex);
        ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_VRAM);
        ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_TT);