nouveau: nvc0 drm has no concept of "notifier block"
authorBen Skeggs <bskeggs@redhat.com>
Wed, 8 Dec 2010 23:18:35 +0000 (09:18 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 21 Dec 2010 02:46:50 +0000 (12:46 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
nouveau/nouveau_channel.c

index ded5424..96fa03b 100644 (file)
@@ -75,20 +75,23 @@ nouveau_channel_alloc(struct nouveau_device *dev, uint32_t fb_ctxdma,
                nvchan->base.subc[i].gr = &gr->base;
        }
 
-       ret = nouveau_bo_wrap(dev, nvchan->drm.notifier_handle,
-                             &nvchan->notifier_bo);
-       if (!ret)
-               ret = nouveau_bo_map(nvchan->notifier_bo, NOUVEAU_BO_RDWR);
-       if (ret) {
-               nouveau_channel_free((void *)&nvchan);
-               return ret;
-       }
-
-       ret = nouveau_grobj_alloc(&nvchan->base, 0x00000000, 0x0030,
-                                 &nvchan->base.nullobj);
-       if (ret) {
-               nouveau_channel_free((void *)&nvchan);
-               return ret;
+       if (dev->chipset < 0xc0) {
+               ret = nouveau_bo_wrap(dev, nvchan->drm.notifier_handle,
+                                     &nvchan->notifier_bo);
+               if (!ret)
+                       ret = nouveau_bo_map(nvchan->notifier_bo,
+                                            NOUVEAU_BO_RDWR);
+               if (ret) {
+                       nouveau_channel_free((void *)&nvchan);
+                       return ret;
+               }
+
+               ret = nouveau_grobj_alloc(&nvchan->base, 0x00000000, 0x0030,
+                                         &nvchan->base.nullobj);
+               if (ret) {
+                       nouveau_channel_free((void *)&nvchan);
+                       return ret;
+               }
        }
 
        ret = nouveau_pushbuf_init(&nvchan->base, pushbuf_size);
@@ -119,8 +122,10 @@ nouveau_channel_free(struct nouveau_channel **chan)
        FIRE_RING(&nvchan->base);
 
        nouveau_pushbuf_fini(&nvchan->base);
-       nouveau_bo_unmap(nvchan->notifier_bo);
-       nouveau_bo_ref(NULL, &nvchan->notifier_bo);
+       if (nvchan->notifier_bo) {
+               nouveau_bo_unmap(nvchan->notifier_bo);
+               nouveau_bo_ref(NULL, &nvchan->notifier_bo);
+       }
 
        for (i = 0; i < nvchan->drm.nr_subchan; i++)
                free(nvchan->base.subc[i].gr);