drm/nouveau: fix null pointer deref on pre-nv50 chipsets
authorBen Skeggs <bskeggs@redhat.com>
Mon, 13 Jun 2011 02:23:35 +0000 (12:23 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 23 Jun 2011 06:04:03 +0000 (16:04 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_object.c

index 542b451..fb57c11 100644 (file)
@@ -870,16 +870,22 @@ void
 nouveau_gpuobj_channel_takedown(struct nouveau_channel *chan)
 {
        struct drm_device *dev = chan->dev;
+       struct drm_nouveau_private *dev_priv = dev->dev_private;
        int i;
 
        NV_DEBUG(dev, "ch%d\n", chan->id);
 
-       for (i = 0; i < 2; i++) {
-               struct nv50_display_crtc *dispc = &nv50_display(dev)->crtc[i];
-               nouveau_bo_vma_del(dispc->sem.bo, &chan->dispc_vma[i]);
+       if (dev_priv->card_type >= NV_50) {
+               struct nv50_display *disp = nv50_display(dev);
+
+               for (i = 0; i < 2; i++) {
+                       struct nv50_display_crtc *dispc = &disp->crtc[i];
+                       nouveau_bo_vma_del(dispc->sem.bo, &chan->dispc_vma[i]);
+               }
+
+               nouveau_vm_ref(NULL, &chan->vm, chan->vm_pd);
+               nouveau_gpuobj_ref(NULL, &chan->vm_pd);
        }
-       nouveau_vm_ref(NULL, &chan->vm, chan->vm_pd);
-       nouveau_gpuobj_ref(NULL, &chan->vm_pd);
 
        if (drm_mm_initialized(&chan->ramin_heap))
                drm_mm_takedown(&chan->ramin_heap);