Merge tag 'drm-for-v4.15' of git://people.freedesktop.org/~airlied/linux
[linux-2.6-block.git] / drivers / gpu / drm / nouveau / nouveau_sgdma.c
index fde11ce466e45cca46ee81c611e9e345332ab525..11f6ca89769b4d003c3ffe35ced95a01045e5e0a 100644 (file)
@@ -3,6 +3,7 @@
 #include <linux/slab.h>
 
 #include "nouveau_drv.h"
+#include "nouveau_mem.h"
 #include "nouveau_ttm.h"
 
 struct nouveau_sgdma_be {
@@ -10,7 +11,7 @@ struct nouveau_sgdma_be {
         * nouve_bo.c works properly, otherwise have to move them here
         */
        struct ttm_dma_tt ttm;
-       struct nvkm_mem *node;
+       struct nouveau_mem *mem;
 };
 
 static void
@@ -28,19 +29,20 @@ static int
 nv04_sgdma_bind(struct ttm_tt *ttm, struct ttm_mem_reg *reg)
 {
        struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
-       struct nvkm_mem *node = reg->mm_node;
-
-       if (ttm->sg) {
-               node->sg    = ttm->sg;
-               node->pages = NULL;
-       } else {
-               node->sg    = NULL;
-               node->pages = nvbe->ttm.dma_address;
+       struct nouveau_mem *mem = nouveau_mem(reg);
+       int ret;
+
+       ret = nouveau_mem_host(reg, &nvbe->ttm);
+       if (ret)
+               return ret;
+
+       ret = nouveau_mem_map(mem, &mem->cli->vmm.vmm, &mem->vma[0]);
+       if (ret) {
+               nouveau_mem_fini(mem);
+               return ret;
        }
-       node->size = (reg->num_pages << PAGE_SHIFT) >> 12;
 
-       nvkm_vm_map(&node->vma[0], node);
-       nvbe->node = node;
+       nvbe->mem = mem;
        return 0;
 }
 
@@ -48,7 +50,7 @@ static int
 nv04_sgdma_unbind(struct ttm_tt *ttm)
 {
        struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
-       nvkm_vm_unmap(&nvbe->node->vma[0]);
+       nouveau_mem_fini(nvbe->mem);
        return 0;
 }
 
@@ -62,30 +64,20 @@ static int
 nv50_sgdma_bind(struct ttm_tt *ttm, struct ttm_mem_reg *reg)
 {
        struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;
-       struct nvkm_mem *node = reg->mm_node;
-
-       /* noop: bound in move_notify() */
-       if (ttm->sg) {
-               node->sg    = ttm->sg;
-               node->pages = NULL;
-       } else {
-               node->sg    = NULL;
-               node->pages = nvbe->ttm.dma_address;
-       }
-       node->size = (reg->num_pages << PAGE_SHIFT) >> 12;
-       return 0;
-}
+       struct nouveau_mem *mem = nouveau_mem(reg);
+       int ret;
 
-static int
-nv50_sgdma_unbind(struct ttm_tt *ttm)
-{
-       /* noop: unbound in move_notify() */
+       ret = nouveau_mem_host(reg, &nvbe->ttm);
+       if (ret)
+               return ret;
+
+       nvbe->mem = mem;
        return 0;
 }
 
 static struct ttm_backend_func nv50_sgdma_backend = {
        .bind                   = nv50_sgdma_bind,
-       .unbind                 = nv50_sgdma_unbind,
+       .unbind                 = nv04_sgdma_unbind,
        .destroy                = nouveau_sgdma_destroy
 };