drm/nvd0: lets not attempt to dereference a nv50_display pointer
authorBen Skeggs <bskeggs@redhat.com>
Mon, 11 Jul 2011 05:46:01 +0000 (15:46 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 20 Sep 2011 06:08:02 +0000 (16:08 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_object.c

index 4406c1751069b89bca3f1b1646d75bb4c902d525..02222c540aee1a38f963dd13eeda7f0f7c7e8844 100644 (file)
@@ -693,6 +693,7 @@ nouveau_gpuobj_channel_init_pramin(struct nouveau_channel *chan)
 static int
 nvc0_gpuobj_channel_init(struct nouveau_channel *chan, struct nouveau_vm *vm)
 {
+       struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
        struct drm_device *dev = chan->dev;
        struct nouveau_gpuobj *pgd = NULL;
        struct nouveau_vm_pgd *vpgd;
@@ -722,6 +723,9 @@ nvc0_gpuobj_channel_init(struct nouveau_channel *chan, struct nouveau_vm *vm)
        nv_wo32(chan->ramin, 0x020c, 0x000000ff);
 
        /* map display semaphore buffers into channel's vm */
+       if (dev_priv->card_type >= NV_D0)
+               return 0;
+
        for (i = 0; i < 2; i++) {
                struct nv50_display_crtc *dispc = &nv50_display(dev)->crtc[i];
 
@@ -875,18 +879,18 @@ nouveau_gpuobj_channel_takedown(struct nouveau_channel *chan)
 
        NV_DEBUG(dev, "ch%d\n", chan->id);
 
-       if (dev_priv->card_type >= NV_50) {
+       if (dev_priv->card_type >= NV_50 && dev_priv->card_type <= NV_C0) {
                struct nv50_display *disp = nv50_display(dev);
 
                for (i = 0; i < dev->mode_config.num_crtc; 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);
        nouveau_gpuobj_ref(NULL, &chan->ramin);