OSDN Git Service

drm/nouveau/mmu: support initialisation of client-managed address-spaces
authorBen Skeggs <bskeggs@redhat.com>
Wed, 13 Jun 2018 06:25:53 +0000 (16:25 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 19 Feb 2019 23:00:00 +0000 (09:00 +1000)
NVKM is currently responsible for managing the allocation of a client's
GPU address-space, but there's various use-cases (ie. HMM address-space
mirroring) where giving a client more direct control is desirable.

This commit allows for a VMM to be created where the area allocated for
NVKM is limited to a client-specified window, the remainder of address-
space is controlled directly by the client.

Leaving a window is necessary to support various internal requirements,
but also to support existing allocation interfaces as not all of the HW
is capable of working with a HMM allocation.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
22 files changed:
drivers/gpu/drm/nouveau/include/nvif/if000c.h
drivers/gpu/drm/nouveau/include/nvif/vmm.h
drivers/gpu/drm/nouveau/nouveau_vmm.c
drivers/gpu/drm/nouveau/nvif/vmm.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/uvmm.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgp100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgp10b.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgv100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmmcp77.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv41.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv44.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmtu102.c

index 2928ecd..f8e29cf 100644 (file)
@@ -3,7 +3,8 @@
 struct nvif_vmm_v0 {
        __u8  version;
        __u8  page_nr;
-       __u8  pad02[6];
+       __u8  managed;
+       __u8  pad03[5];
        __u64 addr;
        __u64 size;
        __u8  data[];
index c5db8a2..79bf85d 100644 (file)
@@ -30,8 +30,8 @@ struct nvif_vmm {
        int page_nr;
 };
 
-int nvif_vmm_init(struct nvif_mmu *, s32 oclass, u64 addr, u64 size,
-                 void *argv, u32 argc, struct nvif_vmm *);
+int nvif_vmm_init(struct nvif_mmu *, s32 oclass, bool managed, u64 addr,
+                 u64 size, void *argv, u32 argc, struct nvif_vmm *);
 void nvif_vmm_fini(struct nvif_vmm *);
 int nvif_vmm_get(struct nvif_vmm *, enum nvif_vmm_get, bool sparse,
                 u8 page, u8 align, u64 size, struct nvif_vma *);
index 2032c3e..724d02d 100644 (file)
@@ -126,7 +126,7 @@ nouveau_vmm_fini(struct nouveau_vmm *vmm)
 int
 nouveau_vmm_init(struct nouveau_cli *cli, s32 oclass, struct nouveau_vmm *vmm)
 {
-       int ret = nvif_vmm_init(&cli->mmu, oclass, PAGE_SIZE, 0, NULL, 0,
+       int ret = nvif_vmm_init(&cli->mmu, oclass, false, PAGE_SIZE, 0, NULL, 0,
                                &vmm->vmm);
        if (ret)
                return ret;
index 6b9c577..11487c0 100644 (file)
@@ -112,8 +112,8 @@ nvif_vmm_fini(struct nvif_vmm *vmm)
 }
 
 int
-nvif_vmm_init(struct nvif_mmu *mmu, s32 oclass, u64 addr, u64 size,
-             void *argv, u32 argc, struct nvif_vmm *vmm)
+nvif_vmm_init(struct nvif_mmu *mmu, s32 oclass, bool managed, u64 addr,
+             u64 size, void *argv, u32 argc, struct nvif_vmm *vmm)
 {
        struct nvif_vmm_v0 *args;
        u32 argn = sizeof(*args) + argc;
@@ -125,6 +125,7 @@ nvif_vmm_init(struct nvif_mmu *mmu, s32 oclass, u64 addr, u64 size,
        if (!(args = kmalloc(argn, GFP_KERNEL)))
                return -ENOMEM;
        args->version = 0;
+       args->managed = managed;
        args->addr = addr;
        args->size = size;
        memcpy(args->data, argv, argc);
index 948a48c..2ad1102 100644 (file)
@@ -28,7 +28,7 @@ struct nvkm_mmu_func {
 
        struct {
                struct nvkm_sclass user;
-               int (*ctor)(struct nvkm_mmu *, u64 addr, u64 size,
+               int (*ctor)(struct nvkm_mmu *, bool managed, u64 addr, u64 size,
                            void *argv, u32 argc, struct lock_class_key *,
                            const char *name, struct nvkm_vmm **);
                bool global;
index 6889076..4b9f07a 100644 (file)
@@ -304,8 +304,10 @@ nvkm_uvmm_new(const struct nvkm_oclass *oclass, void *argv, u32 argc,
        struct nvkm_uvmm *uvmm;
        int ret = -ENOSYS;
        u64 addr, size;
+       bool managed;
 
        if (!(ret = nvif_unpack(ret, &argv, &argc, args->v0, 0, 0, more))) {
+               managed = args->v0.managed != 0;
                addr = args->v0.addr;
                size = args->v0.size;
        } else
@@ -317,7 +319,7 @@ nvkm_uvmm_new(const struct nvkm_oclass *oclass, void *argv, u32 argc,
        *pobject = &uvmm->object;
 
        if (!mmu->vmm) {
-               ret = mmu->func->vmm.ctor(mmu, addr, size, argv, argc,
+               ret = mmu->func->vmm.ctor(mmu, managed, addr, size, argv, argc,
                                          NULL, "user", &uvmm->vmm);
                if (ret)
                        return ret;
index 6b87fff..5274ab0 100644 (file)
@@ -972,16 +972,32 @@ nvkm_vmm_dtor(struct nvkm_vmm *vmm)
        }
 }
 
+static int
+nvkm_vmm_ctor_managed(struct nvkm_vmm *vmm, u64 addr, u64 size)
+{
+       struct nvkm_vma *vma;
+       if (!(vma = nvkm_vma_new(addr, size)))
+               return -ENOMEM;
+       vma->mapref = true;
+       vma->sparse = false;
+       vma->used = true;
+       vma->user = true;
+       nvkm_vmm_node_insert(vmm, vma);
+       list_add_tail(&vma->head, &vmm->list);
+       return 0;
+}
+
 int
 nvkm_vmm_ctor(const struct nvkm_vmm_func *func, struct nvkm_mmu *mmu,
-             u32 pd_header, u64 addr, u64 size, struct lock_class_key *key,
-             const char *name, struct nvkm_vmm *vmm)
+             u32 pd_header, bool managed, u64 addr, u64 size,
+             struct lock_class_key *key, const char *name,
+             struct nvkm_vmm *vmm)
 {
        static struct lock_class_key _key;
        const struct nvkm_vmm_page *page = func->page;
        const struct nvkm_vmm_desc *desc;
        struct nvkm_vma *vma;
-       int levels, bits = 0;
+       int levels, bits = 0, ret;
 
        vmm->func = func;
        vmm->mmu = mmu;
@@ -1009,11 +1025,6 @@ nvkm_vmm_ctor(const struct nvkm_vmm_func *func, struct nvkm_mmu *mmu,
        if (WARN_ON(levels > NVKM_VMM_LEVELS_MAX))
                return -EINVAL;
 
-       vmm->start = addr;
-       vmm->limit = size ? (addr + size) : (1ULL << bits);
-       if (vmm->start > vmm->limit || vmm->limit > (1ULL << bits))
-               return -EINVAL;
-
        /* Allocate top-level page table. */
        vmm->pd = nvkm_vmm_pt_new(desc, false, NULL);
        if (!vmm->pd)
@@ -1036,22 +1047,61 @@ nvkm_vmm_ctor(const struct nvkm_vmm_func *func, struct nvkm_mmu *mmu,
        vmm->free = RB_ROOT;
        vmm->root = RB_ROOT;
 
-       if (!(vma = nvkm_vma_new(vmm->start, vmm->limit - vmm->start)))
-               return -ENOMEM;
+       if (managed) {
+               /* Address-space will be managed by the client for the most
+                * part, except for a specified area where NVKM allocations
+                * are allowed to be placed.
+                */
+               vmm->start = 0;
+               vmm->limit = 1ULL << bits;
+               if (addr + size < addr || addr + size > vmm->limit)
+                       return -EINVAL;
+
+               /* Client-managed area before the NVKM-managed area. */
+               if (addr && (ret = nvkm_vmm_ctor_managed(vmm, 0, addr)))
+                       return ret;
+
+               /* NVKM-managed area. */
+               if (size) {
+                       if (!(vma = nvkm_vma_new(addr, size)))
+                               return -ENOMEM;
+                       nvkm_vmm_free_insert(vmm, vma);
+                       list_add_tail(&vma->head, &vmm->list);
+               }
+
+               /* Client-managed area after the NVKM-managed area. */
+               addr = addr + size;
+               size = vmm->limit - addr;
+               if (size && (ret = nvkm_vmm_ctor_managed(vmm, addr, size)))
+                       return ret;
+       } else {
+               /* Address-space fully managed by NVKM, requiring calls to
+                * nvkm_vmm_get()/nvkm_vmm_put() to allocate address-space.
+                */
+               vmm->start = addr;
+               vmm->limit = size ? (addr + size) : (1ULL << bits);
+               if (vmm->start > vmm->limit || vmm->limit > (1ULL << bits))
+                       return -EINVAL;
+
+               if (!(vma = nvkm_vma_new(vmm->start, vmm->limit - vmm->start)))
+                       return -ENOMEM;
+
+               nvkm_vmm_free_insert(vmm, vma);
+               list_add(&vma->head, &vmm->list);
+       }
 
-       nvkm_vmm_free_insert(vmm, vma);
-       list_add(&vma->head, &vmm->list);
        return 0;
 }
 
 int
 nvkm_vmm_new_(const struct nvkm_vmm_func *func, struct nvkm_mmu *mmu,
-             u32 hdr, u64 addr, u64 size, struct lock_class_key *key,
-             const char *name, struct nvkm_vmm **pvmm)
+             u32 hdr, bool managed, u64 addr, u64 size,
+             struct lock_class_key *key, const char *name,
+             struct nvkm_vmm **pvmm)
 {
        if (!(*pvmm = kzalloc(sizeof(**pvmm), GFP_KERNEL)))
                return -ENOMEM;
-       return nvkm_vmm_ctor(func, mmu, hdr, addr, size, key, name, *pvmm);
+       return nvkm_vmm_ctor(func, mmu, hdr, managed, addr, size, key, name, *pvmm);
 }
 
 void
@@ -1584,7 +1634,8 @@ nvkm_vmm_new(struct nvkm_device *device, u64 addr, u64 size, void *argv,
        struct nvkm_mmu *mmu = device->mmu;
        struct nvkm_vmm *vmm = NULL;
        int ret;
-       ret = mmu->func->vmm.ctor(mmu, addr, size, argv, argc, key, name, &vmm);
+       ret = mmu->func->vmm.ctor(mmu, false, addr, size, argv, argc,
+                                 key, name, &vmm);
        if (ret)
                nvkm_vmm_unref(&vmm);
        *pvmm = vmm;
index 68474f1..e272e81 100644 (file)
@@ -153,11 +153,12 @@ struct nvkm_vmm_join {
 };
 
 int nvkm_vmm_new_(const struct nvkm_vmm_func *, struct nvkm_mmu *,
-                 u32 pd_header, u64 addr, u64 size, struct lock_class_key *,
-                 const char *name, struct nvkm_vmm **);
+                 u32 pd_header, bool managed, u64 addr, u64 size,
+                 struct lock_class_key *, const char *name,
+                 struct nvkm_vmm **);
 int nvkm_vmm_ctor(const struct nvkm_vmm_func *, struct nvkm_mmu *,
-                 u32 pd_header, u64 addr, u64 size, struct lock_class_key *,
-                 const char *name, struct nvkm_vmm *);
+                 u32 pd_header, bool managed, u64 addr, u64 size,
+                 struct lock_class_key *, const char *name, struct nvkm_vmm *);
 struct nvkm_vma *nvkm_vmm_node_search(struct nvkm_vmm *, u64 addr);
 struct nvkm_vma *nvkm_vmm_node_split(struct nvkm_vmm *, struct nvkm_vma *,
                                     u64 addr, u64 size);
@@ -171,7 +172,7 @@ void nvkm_vmm_unmap_region(struct nvkm_vmm *vmm, struct nvkm_vma *vma);
 struct nvkm_vma *nvkm_vma_tail(struct nvkm_vma *, u64 tail);
 
 int nv04_vmm_new_(const struct nvkm_vmm_func *, struct nvkm_mmu *, u32,
-                 u64, u64, void *, u32, struct lock_class_key *,
+                 bool, u64, u64, void *, u32, struct lock_class_key *,
                  const char *, struct nvkm_vmm **);
 int nv04_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *);
 
@@ -181,7 +182,7 @@ int nv50_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *);
 void nv50_vmm_flush(struct nvkm_vmm *, int);
 
 int gf100_vmm_new_(const struct nvkm_vmm_func *, const struct nvkm_vmm_func *,
-                  struct nvkm_mmu *, u64, u64, void *, u32,
+                  struct nvkm_mmu *, bool, u64, u64, void *, u32,
                   struct lock_class_key *, const char *, struct nvkm_vmm **);
 int gf100_vmm_join_(struct nvkm_vmm *, struct nvkm_memory *, u64 base);
 int gf100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);
@@ -195,7 +196,7 @@ void gf100_vmm_invalidate_pdb(struct nvkm_vmm *, u64 addr);
 int gk20a_vmm_aper(enum nvkm_memory_target);
 
 int gm200_vmm_new_(const struct nvkm_vmm_func *, const struct nvkm_vmm_func *,
-                  struct nvkm_mmu *, u64, u64, void *, u32,
+                  struct nvkm_mmu *, bool, u64, u64, void *, u32,
                   struct lock_class_key *, const char *, struct nvkm_vmm **);
 int gm200_vmm_join_(struct nvkm_vmm *, struct nvkm_memory *, u64 base);
 int gm200_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);
@@ -207,46 +208,46 @@ void gp100_vmm_invalidate_pdb(struct nvkm_vmm *, u64 addr);
 
 int gv100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);
 
-int nv04_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int nv04_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                 struct lock_class_key *, const char *, struct nvkm_vmm **);
-int nv41_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int nv41_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                 struct lock_class_key *, const char *, struct nvkm_vmm **);
-int nv44_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int nv44_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                 struct lock_class_key *, const char *, struct nvkm_vmm **);
-int nv50_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int nv50_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                 struct lock_class_key *, const char *, struct nvkm_vmm **);
-int mcp77_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int mcp77_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                  struct lock_class_key *, const char *, struct nvkm_vmm **);
-int g84_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int g84_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                struct lock_class_key *, const char *, struct nvkm_vmm **);
-int gf100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int gf100_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                  struct lock_class_key *, const char *, struct nvkm_vmm **);
-int gk104_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int gk104_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                  struct lock_class_key *, const char *, struct nvkm_vmm **);
-int gk20a_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int gk20a_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                  struct lock_class_key *, const char *, struct nvkm_vmm **);
-int gm200_vmm_new_fixed(struct nvkm_mmu *, u64, u64, void *, u32,
+int gm200_vmm_new_fixed(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                        struct lock_class_key *, const char *,
                        struct nvkm_vmm **);
-int gm200_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int gm200_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                  struct lock_class_key *, const char *,
                  struct nvkm_vmm **);
-int gm20b_vmm_new_fixed(struct nvkm_mmu *, u64, u64, void *, u32,
+int gm20b_vmm_new_fixed(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                        struct lock_class_key *, const char *,
                        struct nvkm_vmm **);
-int gm20b_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int gm20b_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                  struct lock_class_key *, const char *,
                  struct nvkm_vmm **);
-int gp100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int gp100_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                  struct lock_class_key *, const char *,
                  struct nvkm_vmm **);
-int gp10b_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int gp10b_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                  struct lock_class_key *, const char *,
                  struct nvkm_vmm **);
-int gv100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int gv100_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                  struct lock_class_key *, const char *,
                  struct nvkm_vmm **);
-int tu102_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
+int tu102_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32,
                  struct lock_class_key *, const char *,
                  struct nvkm_vmm **);
 
index b414413..ab6424f 100644 (file)
@@ -400,14 +400,14 @@ gf100_vmm_16 = {
 int
 gf100_vmm_new_(const struct nvkm_vmm_func *func_16,
               const struct nvkm_vmm_func *func_17,
-              struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-              struct lock_class_key *key, const char *name,
-              struct nvkm_vmm **pvmm)
+              struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+              void *argv, u32 argc, struct lock_class_key *key,
+              const char *name, struct nvkm_vmm **pvmm)
 {
        switch (mmu->subdev.device->fb->page) {
-       case 16: return nv04_vmm_new_(func_16, mmu, 0, addr, size,
+       case 16: return nv04_vmm_new_(func_16, mmu, 0, managed, addr, size,
                                      argv, argc, key, name, pvmm);
-       case 17: return nv04_vmm_new_(func_17, mmu, 0, addr, size,
+       case 17: return nv04_vmm_new_(func_17, mmu, 0, managed, addr, size,
                                      argv, argc, key, name, pvmm);
        default:
                WARN_ON(1);
@@ -416,10 +416,10 @@ gf100_vmm_new_(const struct nvkm_vmm_func *func_16,
 }
 
 int
-gf100_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-             struct lock_class_key *key, const char *name,
-             struct nvkm_vmm **pvmm)
+gf100_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+             void *argv, u32 argc, struct lock_class_key *key,
+             const char *name, struct nvkm_vmm **pvmm)
 {
-       return gf100_vmm_new_(&gf100_vmm_16, &gf100_vmm_17, mmu, addr,
+       return gf100_vmm_new_(&gf100_vmm_16, &gf100_vmm_17, mmu, managed, addr,
                              size, argv, argc, key, name, pvmm);
 }
index 2679068..0b59c01 100644 (file)
@@ -95,10 +95,10 @@ gk104_vmm_16 = {
 };
 
 int
-gk104_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-             struct lock_class_key *key, const char *name,
-             struct nvkm_vmm **pvmm)
+gk104_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+             void *argv, u32 argc, struct lock_class_key *key,
+             const char *name, struct nvkm_vmm **pvmm)
 {
-       return gf100_vmm_new_(&gk104_vmm_16, &gk104_vmm_17, mmu, addr,
+       return gf100_vmm_new_(&gk104_vmm_16, &gk104_vmm_17, mmu, managed, addr,
                              size, argv, argc, key, name, pvmm);
 }
index 5c6f645..5a9582d 100644 (file)
@@ -64,10 +64,10 @@ gk20a_vmm_16 = {
 };
 
 int
-gk20a_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-             struct lock_class_key *key, const char *name,
-             struct nvkm_vmm **pvmm)
+gk20a_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+             void *argv, u32 argc, struct lock_class_key *key,
+             const char *name, struct nvkm_vmm **pvmm)
 {
-       return gf100_vmm_new_(&gk20a_vmm_16, &gk20a_vmm_17, mmu, addr,
+       return gf100_vmm_new_(&gk20a_vmm_16, &gk20a_vmm_17, mmu, managed, addr,
                              size, argv, argc, key, name, pvmm);
 }
index dd7f607..2e61af0 100644 (file)
@@ -141,9 +141,9 @@ gm200_vmm_16 = {
 int
 gm200_vmm_new_(const struct nvkm_vmm_func *func_16,
               const struct nvkm_vmm_func *func_17,
-              struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-              struct lock_class_key *key, const char *name,
-              struct nvkm_vmm **pvmm)
+              struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+              void *argv, u32 argc, struct lock_class_key *key,
+              const char *name, struct nvkm_vmm **pvmm)
 {
        const struct nvkm_vmm_func *func;
        union {
@@ -165,23 +165,23 @@ gm200_vmm_new_(const struct nvkm_vmm_func *func_16,
        } else
                return ret;
 
-       return nvkm_vmm_new_(func, mmu, 0, addr, size, key, name, pvmm);
+       return nvkm_vmm_new_(func, mmu, 0, managed, addr, size, key, name, pvmm);
 }
 
 int
-gm200_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-             struct lock_class_key *key, const char *name,
-             struct nvkm_vmm **pvmm)
+gm200_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+             void *argv, u32 argc, struct lock_class_key *key,
+             const char *name, struct nvkm_vmm **pvmm)
 {
-       return gm200_vmm_new_(&gm200_vmm_16, &gm200_vmm_17, mmu, addr,
+       return gm200_vmm_new_(&gm200_vmm_16, &gm200_vmm_17, mmu, managed, addr,
                              size, argv, argc, key, name, pvmm);
 }
 
 int
-gm200_vmm_new_fixed(struct nvkm_mmu *mmu, u64 addr, u64 size,
+gm200_vmm_new_fixed(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
                    void *argv, u32 argc, struct lock_class_key *key,
                    const char *name, struct nvkm_vmm **pvmm)
 {
-       return gf100_vmm_new_(&gm200_vmm_16, &gm200_vmm_17, mmu, addr,
+       return gf100_vmm_new_(&gm200_vmm_16, &gm200_vmm_17, mmu, managed, addr,
                              size, argv, argc, key, name, pvmm);
 }
index 57d763c..96b7596 100644 (file)
@@ -54,19 +54,19 @@ gm20b_vmm_16 = {
 };
 
 int
-gm20b_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-             struct lock_class_key *key, const char *name,
-             struct nvkm_vmm **pvmm)
+gm20b_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+             void *argv, u32 argc, struct lock_class_key *key,
+             const char *name, struct nvkm_vmm **pvmm)
 {
-       return gm200_vmm_new_(&gm20b_vmm_16, &gm20b_vmm_17, mmu, addr,
+       return gm200_vmm_new_(&gm20b_vmm_16, &gm20b_vmm_17, mmu, managed, addr,
                              size, argv, argc, key, name, pvmm);
 }
 
 int
-gm20b_vmm_new_fixed(struct nvkm_mmu *mmu, u64 addr, u64 size,
+gm20b_vmm_new_fixed(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
                    void *argv, u32 argc, struct lock_class_key *key,
                    const char *name, struct nvkm_vmm **pvmm)
 {
-       return gf100_vmm_new_(&gm20b_vmm_16, &gm20b_vmm_17, mmu, addr,
+       return gf100_vmm_new_(&gm20b_vmm_16, &gm20b_vmm_17, mmu, managed, addr,
                              size, argv, argc, key, name, pvmm);
 }
index f9c95c4..4b8ebaa 100644 (file)
@@ -352,10 +352,10 @@ gp100_vmm = {
 };
 
 int
-gp100_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-             struct lock_class_key *key, const char *name,
-             struct nvkm_vmm **pvmm)
+gp100_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+             void *argv, u32 argc, struct lock_class_key *key,
+             const char *name, struct nvkm_vmm **pvmm)
 {
-       return nv04_vmm_new_(&gp100_vmm, mmu, 0, addr, size,
+       return nv04_vmm_new_(&gp100_vmm, mmu, 0, managed, addr, size,
                             argv, argc, key, name, pvmm);
 }
index 13d0d48..07b91d8 100644 (file)
@@ -41,10 +41,10 @@ gp10b_vmm = {
 };
 
 int
-gp10b_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-             struct lock_class_key *key, const char *name,
-             struct nvkm_vmm **pvmm)
+gp10b_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+             void *argv, u32 argc, struct lock_class_key *key,
+             const char *name, struct nvkm_vmm **pvmm)
 {
-       return nv04_vmm_new_(&gp10b_vmm, mmu, 0, addr, size,
+       return nv04_vmm_new_(&gp10b_vmm, mmu, 0, managed, addr, size,
                             argv, argc, key, name, pvmm);
 }
index 8574bc9..da5841a 100644 (file)
@@ -79,10 +79,10 @@ gv100_vmm = {
 };
 
 int
-gv100_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-             struct lock_class_key *key, const char *name,
-             struct nvkm_vmm **pvmm)
+gv100_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+             void *argv, u32 argc, struct lock_class_key *key,
+             const char *name, struct nvkm_vmm **pvmm)
 {
-       return nv04_vmm_new_(&gv100_vmm, mmu, 0, addr, size,
+       return nv04_vmm_new_(&gv100_vmm, mmu, 0, managed, addr, size,
                             argv, argc, key, name, pvmm);
 }
index e63d984..bdddd99 100644 (file)
@@ -36,10 +36,10 @@ mcp77_vmm = {
 };
 
 int
-mcp77_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-             struct lock_class_key *key, const char *name,
-             struct nvkm_vmm **pvmm)
+mcp77_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+             void *argv, u32 argc, struct lock_class_key *key,
+             const char *name, struct nvkm_vmm **pvmm)
 {
-       return nv04_vmm_new_(&mcp77_vmm, mmu, 0, addr, size,
+       return nv04_vmm_new_(&mcp77_vmm, mmu, 0, managed, addr, size,
                             argv, argc, key, name, pvmm);
 }
index 0cab1ff..4c6b3b7 100644 (file)
@@ -100,16 +100,17 @@ nv04_vmm = {
 
 int
 nv04_vmm_new_(const struct nvkm_vmm_func *func, struct nvkm_mmu *mmu,
-             u32 pd_header, u64 addr, u64 size, void *argv, u32 argc,
-             struct lock_class_key *key, const char *name,
-             struct nvkm_vmm **pvmm)
+             u32 pd_header, bool managed, u64 addr, u64 size,
+             void *argv, u32 argc, struct lock_class_key *key,
+             const char *name, struct nvkm_vmm **pvmm)
 {
        union {
                struct nv04_vmm_vn vn;
        } *args = argv;
        int ret;
 
-       ret = nvkm_vmm_new_(func, mmu, pd_header, addr, size, key, name, pvmm);
+       ret = nvkm_vmm_new_(func, mmu, pd_header, managed, addr, size,
+                           key, name, pvmm);
        if (ret)
                return ret;
 
@@ -117,15 +118,15 @@ nv04_vmm_new_(const struct nvkm_vmm_func *func, struct nvkm_mmu *mmu,
 }
 
 int
-nv04_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-            struct lock_class_key *key, const char *name,
+nv04_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+            void *argv, u32 argc, struct lock_class_key *key, const char *name,
             struct nvkm_vmm **pvmm)
 {
        struct nvkm_memory *mem;
        struct nvkm_vmm *vmm;
        int ret;
 
-       ret = nv04_vmm_new_(&nv04_vmm, mmu, 8, addr, size,
+       ret = nv04_vmm_new_(&nv04_vmm, mmu, 8, managed, addr, size,
                            argv, argc, key, name, &vmm);
        *pvmm = vmm;
        if (ret)
index b595f13..1d33696 100644 (file)
@@ -104,10 +104,10 @@ nv41_vmm = {
 };
 
 int
-nv41_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-            struct lock_class_key *key, const char *name,
+nv41_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+            void *argv, u32 argc, struct lock_class_key *key, const char *name,
             struct nvkm_vmm **pvmm)
 {
-       return nv04_vmm_new_(&nv41_vmm, mmu, 0, addr, size,
+       return nv04_vmm_new_(&nv41_vmm, mmu, 0, managed, addr, size,
                             argv, argc, key, name, pvmm);
 }
index b834e43..a82936b 100644 (file)
@@ -205,15 +205,15 @@ nv44_vmm = {
 };
 
 int
-nv44_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-            struct lock_class_key *key, const char *name,
+nv44_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+            void *argv, u32 argc, struct lock_class_key *key, const char *name,
             struct nvkm_vmm **pvmm)
 {
        struct nvkm_subdev *subdev = &mmu->subdev;
        struct nvkm_vmm *vmm;
        int ret;
 
-       ret = nv04_vmm_new_(&nv44_vmm, mmu, 0, addr, size,
+       ret = nv04_vmm_new_(&nv44_vmm, mmu, 0, managed, addr, size,
                            argv, argc, key, name, &vmm);
        *pvmm = vmm;
        if (ret)
index 64f75d9..c98afe3 100644 (file)
@@ -376,10 +376,10 @@ nv50_vmm = {
 };
 
 int
-nv50_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
-            struct lock_class_key *key, const char *name,
+nv50_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
+            void *argv, u32 argc, struct lock_class_key *key, const char *name,
             struct nvkm_vmm **pvmm)
 {
-       return nv04_vmm_new_(&nv50_vmm, mmu, 0, addr, size,
+       return nv04_vmm_new_(&nv50_vmm, mmu, 0, managed, addr, size,
                             argv, argc, key, name, pvmm);
 }
index 56c630d..ddab7c6 100644 (file)
@@ -68,10 +68,10 @@ tu102_vmm = {
 };
 
 int
-tu102_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size,
+tu102_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
              void *argv, u32 argc, struct lock_class_key *key,
              const char *name, struct nvkm_vmm **pvmm)
 {
-       return nv04_vmm_new_(&tu102_vmm, mmu, 0, addr, size,
+       return nv04_vmm_new_(&tu102_vmm, mmu, 0, managed, addr, size,
                             argv, argc, key, name, pvmm);
 }