drm/nvc0: implement channel structure initialisation
authorBen Skeggs <bskeggs@redhat.com>
Wed, 24 Nov 2010 00:15:05 +0000 (10:15 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 21 Dec 2010 07:17:28 +0000 (17:17 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_object.c

index c64fd971b867edc24ed5eee36ba55a8a82857c83..d77b1fcd19d4ed1c957914a12300f3079e1a301e 100644 (file)
@@ -779,6 +779,25 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan,
 
        NV_DEBUG(dev, "ch%d vram=0x%08x tt=0x%08x\n", chan->id, vram_h, tt_h);
 
+       if (dev_priv->card_type == NV_C0) {
+               struct nouveau_vm *vm = dev_priv->chan_vm;
+               struct nouveau_vm_pgd *vpgd;
+
+               ret = nouveau_gpuobj_new(dev, NULL, 4096, 0x1000, 0,
+                                        &chan->ramin);
+               if (ret)
+                       return ret;
+
+               nouveau_vm_ref(vm, &chan->vm, NULL);
+
+               vpgd = list_first_entry(&vm->pgd_list, struct nouveau_vm_pgd, head);
+               nv_wo32(chan->ramin, 0x0200, lower_32_bits(vpgd->obj->vinst));
+               nv_wo32(chan->ramin, 0x0204, upper_32_bits(vpgd->obj->vinst));
+               nv_wo32(chan->ramin, 0x0208, 0xffffffff);
+               nv_wo32(chan->ramin, 0x020c, 0x000000ff);
+               return 0;
+       }
+
        /* Allocate a chunk of memory for per-channel object storage */
        ret = nouveau_gpuobj_channel_init_pramin(chan);
        if (ret) {
@@ -786,7 +805,7 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan,
                return ret;
        }
 
-       /* NV50/NVC0 VM
+       /* NV50 VM
         *  - Allocate per-channel page-directory
         *  - Link with shared channel VM
         */
@@ -884,9 +903,6 @@ nouveau_gpuobj_channel_takedown(struct nouveau_channel *chan)
 
        NV_DEBUG(dev, "ch%d\n", chan->id);
 
-       if (!chan->ramht)
-               return;
-
        nouveau_ramht_ref(NULL, &chan->ramht, chan);
 
        nouveau_vm_ref(NULL, &chan->vm, chan->vm_pd);