drm/nouveau/mmu: rename from vmmgr (no binary change)
authorBen Skeggs <bskeggs@redhat.com>
Tue, 13 Jan 2015 23:57:36 +0000 (09:57 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 22 Jan 2015 02:17:43 +0000 (12:17 +1000)
Switch to NVIDIA's name for the device.

The namespace of NVKM is being changed to nvkm_ instead of nouveau_,
which will be used for the DRM part of the driver.  This is being
done in order to make it very clear as to what part of the driver a
given symbol belongs to, and as a minor step towards splitting the
DRM driver out to be able to stand on its own (for virt).

Because there's already a large amount of churn here anyway, this is
as good a time as any to also switch to NVIDIA's device and chipset
naming to ease collaboration with them.

A comparison of objdump disassemblies proves no code changes.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
50 files changed:
drivers/gpu/drm/nouveau/include/nvif/device.h
drivers/gpu/drm/nouveau/include/nvkm/core/device.h
drivers/gpu/drm/nouveau/include/nvkm/core/engctx.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/fb.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h [new file with mode: 0644]
drivers/gpu/drm/nouveau/include/nvkm/subdev/vm.h [deleted file]
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_chan.c
drivers/gpu/drm/nouveau/nouveau_display.h
drivers/gpu/drm/nouveau/nouveau_ttm.c
drivers/gpu/drm/nouveau/nvkm/core/engctx.c
drivers/gpu/drm/nouveau/nvkm/core/gpuobj.c
drivers/gpu/drm/nouveau/nvkm/engine/copy/nva3.c
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
drivers/gpu/drm/nouveau/nvkm/engine/device/gm100.c
drivers/gpu/drm/nouveau/nvkm/engine/device/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/device/nv10.c
drivers/gpu/drm/nouveau/nvkm/engine/device/nv20.c
drivers/gpu/drm/nouveau/nvkm/engine/device/nv30.c
drivers/gpu/drm/nouveau/nvkm/engine/device/nv40.c
drivers/gpu/drm/nouveau/nvkm/engine/device/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/device/nvc0.c
drivers/gpu/drm/nouveau/nvkm/engine/device/nve0.c
drivers/gpu/drm/nouveau/nvkm/engine/dmaobj/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nvc0.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nve0.c
drivers/gpu/drm/nouveau/nvkm/engine/graph/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/graph/nvc0.h
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv84.c
drivers/gpu/drm/nouveau/nvkm/subdev/Kbuild
drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/bar/nvc0.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv04.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv04.h [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv41.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv44.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv50.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nvc0.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/vm/Kbuild [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/vm/base.c [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv04.c [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv04.h [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv41.c [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv44.c [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv50.c [deleted file]
drivers/gpu/drm/nouveau/nvkm/subdev/vm/nvc0.c [deleted file]

index e73a16dd97fa93e1794b3393c748f2c0149c329e..93acd5153beea5fe47734c4b818a9da6e205b823 100644 (file)
@@ -29,7 +29,7 @@ void nvif_device_ref(struct nvif_device *, struct nvif_device **);
 /*XXX*/
 #include <subdev/bios.h>
 #include <subdev/fb.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 #include <subdev/bar.h>
 #include <subdev/gpio.h>
 #include <subdev/clk.h>
@@ -40,7 +40,7 @@ void nvif_device_ref(struct nvif_device *, struct nvif_device **);
 #define nvkm_device(a) nv_device(nvkm_object((a)))
 #define nvkm_bios(a) nouveau_bios(nvkm_device(a))
 #define nvkm_fb(a) nouveau_fb(nvkm_device(a))
-#define nvkm_vmmgr(a) nouveau_vmmgr(nvkm_device(a))
+#define nvkm_mmu(a) nouveau_mmu(nvkm_device(a))
 #define nvkm_bar(a) nouveau_bar(nvkm_device(a))
 #define nvkm_gpio(a) nouveau_gpio(nvkm_device(a))
 #define nvkm_clk(a) nouveau_clk(nvkm_device(a))
index a2828ac6a65ebbf9d17597538398d383668efe39..82625c5d68d7a95e0cd8df4cb62062be61f546f3 100644 (file)
@@ -33,7 +33,7 @@ enum nv_subdev_type {
        NVDEV_SUBDEV_FB,
        NVDEV_SUBDEV_LTC,
        NVDEV_SUBDEV_INSTMEM,
-       NVDEV_SUBDEV_VM,
+       NVDEV_SUBDEV_MMU,
        NVDEV_SUBDEV_BAR,
        NVDEV_SUBDEV_PMU,
        NVDEV_SUBDEV_VOLT,
index dbc6a3e6dd44bf3f303390678c99e2125aa60d87..9d696e4747e78ca94d419fb67783b0d5ee0cd5be 100644 (file)
@@ -4,7 +4,7 @@
 #include <core/object.h>
 #include <core/gpuobj.h>
 
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #define NV_ENGCTX_(eng,var) (NV_ENGCTX_CLASS | ((var) << 8) | (eng))
 #define NV_ENGCTX(name,var)  NV_ENGCTX_(NVDEV_ENGINE_##name, (var))
index 889603fbb0cf2b0b17df2c79905d7fb299f21573..0277585c90675bad1c27d816d8fb754354bd3956 100644 (file)
@@ -5,7 +5,7 @@
 #include <core/device.h>
 #include <core/mm.h>
 
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 /* memory type/access flags, do not match hardware values */
 #define NV_MEM_ACCESS_RO  1
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h
new file mode 100644 (file)
index 0000000..2c3b299
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2010 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Ben Skeggs
+ */
+
+#ifndef __NOUVEAU_MMU_H__
+#define __NOUVEAU_MMU_H__
+
+#include <core/object.h>
+#include <core/subdev.h>
+#include <core/device.h>
+#include <core/mm.h>
+
+struct nouveau_vm_pgt {
+       struct nouveau_gpuobj *obj[2];
+       u32 refcount[2];
+};
+
+struct nouveau_vm_pgd {
+       struct list_head head;
+       struct nouveau_gpuobj *obj;
+};
+
+struct nouveau_gpuobj;
+struct nouveau_mem;
+
+struct nouveau_vma {
+       struct list_head head;
+       int refcount;
+       struct nouveau_vm *vm;
+       struct nouveau_mm_node *node;
+       u64 offset;
+       u32 access;
+};
+
+struct nouveau_vm {
+       struct nouveau_mmu *mmu;
+       struct nouveau_mm mm;
+       struct kref refcount;
+
+       struct list_head pgd_list;
+       atomic_t engref[NVDEV_SUBDEV_NR];
+
+       struct nouveau_vm_pgt *pgt;
+       u32 fpde;
+       u32 lpde;
+};
+
+struct nouveau_mmu {
+       struct nouveau_subdev base;
+
+       u64 limit;
+       u8  dma_bits;
+       u32 pgt_bits;
+       u8  spg_shift;
+       u8  lpg_shift;
+
+       int  (*create)(struct nouveau_mmu *, u64 offset, u64 length,
+                      u64 mm_offset, struct nouveau_vm **);
+
+       void (*map_pgt)(struct nouveau_gpuobj *pgd, u32 pde,
+                       struct nouveau_gpuobj *pgt[2]);
+       void (*map)(struct nouveau_vma *, struct nouveau_gpuobj *,
+                   struct nouveau_mem *, u32 pte, u32 cnt,
+                   u64 phys, u64 delta);
+       void (*map_sg)(struct nouveau_vma *, struct nouveau_gpuobj *,
+                      struct nouveau_mem *, u32 pte, u32 cnt, dma_addr_t *);
+       void (*unmap)(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt);
+       void (*flush)(struct nouveau_vm *);
+};
+
+static inline struct nouveau_mmu *
+nouveau_mmu(void *obj)
+{
+       return (void *)nouveau_subdev(obj, NVDEV_SUBDEV_MMU);
+}
+
+#define nouveau_mmu_create(p,e,o,i,f,d)                                      \
+       nouveau_subdev_create((p), (e), (o), 0, (i), (f), (d))
+#define nouveau_mmu_destroy(p)                                               \
+       nouveau_subdev_destroy(&(p)->base)
+#define nouveau_mmu_init(p)                                                  \
+       nouveau_subdev_init(&(p)->base)
+#define nouveau_mmu_fini(p,s)                                                \
+       nouveau_subdev_fini(&(p)->base, (s))
+
+#define _nouveau_mmu_dtor _nouveau_subdev_dtor
+#define _nouveau_mmu_init _nouveau_subdev_init
+#define _nouveau_mmu_fini _nouveau_subdev_fini
+
+extern struct nouveau_oclass nv04_mmu_oclass;
+extern struct nouveau_oclass nv41_mmu_oclass;
+extern struct nouveau_oclass nv44_mmu_oclass;
+extern struct nouveau_oclass nv50_mmu_oclass;
+extern struct nouveau_oclass nvc0_mmu_oclass;
+
+int  nv04_vm_create(struct nouveau_mmu *, u64, u64, u64,
+                   struct nouveau_vm **);
+void nv04_mmu_dtor(struct nouveau_object *);
+
+/* nouveau_vm.c */
+int  nouveau_vm_create(struct nouveau_mmu *, u64 offset, u64 length,
+                      u64 mm_offset, u32 block, struct nouveau_vm **);
+int  nouveau_vm_new(struct nouveau_device *, u64 offset, u64 length,
+                   u64 mm_offset, struct nouveau_vm **);
+int  nouveau_vm_ref(struct nouveau_vm *, struct nouveau_vm **,
+                   struct nouveau_gpuobj *pgd);
+int  nouveau_vm_get(struct nouveau_vm *, u64 size, u32 page_shift,
+                   u32 access, struct nouveau_vma *);
+void nouveau_vm_put(struct nouveau_vma *);
+void nouveau_vm_map(struct nouveau_vma *, struct nouveau_mem *);
+void nouveau_vm_map_at(struct nouveau_vma *, u64 offset, struct nouveau_mem *);
+void nouveau_vm_unmap(struct nouveau_vma *);
+void nouveau_vm_unmap_at(struct nouveau_vma *, u64 offset, u64 length);
+
+#endif
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/vm.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/vm.h
deleted file mode 100644 (file)
index d56585f..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2010 Red Hat Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: Ben Skeggs
- */
-
-#ifndef __NOUVEAU_VM_H__
-#define __NOUVEAU_VM_H__
-
-#include <core/object.h>
-#include <core/subdev.h>
-#include <core/device.h>
-#include <core/mm.h>
-
-struct nouveau_vm_pgt {
-       struct nouveau_gpuobj *obj[2];
-       u32 refcount[2];
-};
-
-struct nouveau_vm_pgd {
-       struct list_head head;
-       struct nouveau_gpuobj *obj;
-};
-
-struct nouveau_gpuobj;
-struct nouveau_mem;
-
-struct nouveau_vma {
-       struct list_head head;
-       int refcount;
-       struct nouveau_vm *vm;
-       struct nouveau_mm_node *node;
-       u64 offset;
-       u32 access;
-};
-
-struct nouveau_vm {
-       struct nouveau_vmmgr *vmm;
-       struct nouveau_mm mm;
-       struct kref refcount;
-
-       struct list_head pgd_list;
-       atomic_t engref[NVDEV_SUBDEV_NR];
-
-       struct nouveau_vm_pgt *pgt;
-       u32 fpde;
-       u32 lpde;
-};
-
-struct nouveau_vmmgr {
-       struct nouveau_subdev base;
-
-       u64 limit;
-       u8  dma_bits;
-       u32 pgt_bits;
-       u8  spg_shift;
-       u8  lpg_shift;
-
-       int  (*create)(struct nouveau_vmmgr *, u64 offset, u64 length,
-                      u64 mm_offset, struct nouveau_vm **);
-
-       void (*map_pgt)(struct nouveau_gpuobj *pgd, u32 pde,
-                       struct nouveau_gpuobj *pgt[2]);
-       void (*map)(struct nouveau_vma *, struct nouveau_gpuobj *,
-                   struct nouveau_mem *, u32 pte, u32 cnt,
-                   u64 phys, u64 delta);
-       void (*map_sg)(struct nouveau_vma *, struct nouveau_gpuobj *,
-                      struct nouveau_mem *, u32 pte, u32 cnt, dma_addr_t *);
-       void (*unmap)(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt);
-       void (*flush)(struct nouveau_vm *);
-};
-
-static inline struct nouveau_vmmgr *
-nouveau_vmmgr(void *obj)
-{
-       return (void *)nouveau_subdev(obj, NVDEV_SUBDEV_VM);
-}
-
-#define nouveau_vmmgr_create(p,e,o,i,f,d)                                      \
-       nouveau_subdev_create((p), (e), (o), 0, (i), (f), (d))
-#define nouveau_vmmgr_destroy(p)                                               \
-       nouveau_subdev_destroy(&(p)->base)
-#define nouveau_vmmgr_init(p)                                                  \
-       nouveau_subdev_init(&(p)->base)
-#define nouveau_vmmgr_fini(p,s)                                                \
-       nouveau_subdev_fini(&(p)->base, (s))
-
-#define _nouveau_vmmgr_dtor _nouveau_subdev_dtor
-#define _nouveau_vmmgr_init _nouveau_subdev_init
-#define _nouveau_vmmgr_fini _nouveau_subdev_fini
-
-extern struct nouveau_oclass nv04_vmmgr_oclass;
-extern struct nouveau_oclass nv41_vmmgr_oclass;
-extern struct nouveau_oclass nv44_vmmgr_oclass;
-extern struct nouveau_oclass nv50_vmmgr_oclass;
-extern struct nouveau_oclass nvc0_vmmgr_oclass;
-
-int  nv04_vm_create(struct nouveau_vmmgr *, u64, u64, u64,
-                   struct nouveau_vm **);
-void nv04_vmmgr_dtor(struct nouveau_object *);
-
-/* nouveau_vm.c */
-int  nouveau_vm_create(struct nouveau_vmmgr *, u64 offset, u64 length,
-                      u64 mm_offset, u32 block, struct nouveau_vm **);
-int  nouveau_vm_new(struct nouveau_device *, u64 offset, u64 length,
-                   u64 mm_offset, struct nouveau_vm **);
-int  nouveau_vm_ref(struct nouveau_vm *, struct nouveau_vm **,
-                   struct nouveau_gpuobj *pgd);
-int  nouveau_vm_get(struct nouveau_vm *, u64 size, u32 page_shift,
-                   u32 access, struct nouveau_vma *);
-void nouveau_vm_put(struct nouveau_vma *);
-void nouveau_vm_map(struct nouveau_vma *, struct nouveau_mem *);
-void nouveau_vm_map_at(struct nouveau_vma *, u64 offset, struct nouveau_mem *);
-void nouveau_vm_unmap(struct nouveau_vma *);
-void nouveau_vm_unmap_at(struct nouveau_vma *, u64 offset, u64 length);
-
-#endif
index d96fe3524dbd5955840fc15ff898f861921cc60a..d2f0929c2d731b58d81dfc16deb0e666ac8acdd0 100644 (file)
@@ -193,7 +193,7 @@ nouveau_bo_new(struct drm_device *dev, int size, int align,
        int max_size;
 
        if (drm->client.vm)
-               lpg_shift = drm->client.vm->vmm->lpg_shift;
+               lpg_shift = drm->client.vm->mmu->lpg_shift;
        max_size = INT_MAX & ~((1 << lpg_shift) - 1);
 
        if (size <= 0 || size > max_size) {
@@ -220,7 +220,7 @@ nouveau_bo_new(struct drm_device *dev, int size, int align,
        nvbo->page_shift = 12;
        if (drm->client.vm) {
                if (!(flags & TTM_PL_FLAG_TT) && size > 256 * 1024)
-                       nvbo->page_shift = drm->client.vm->vmm->lpg_shift;
+                       nvbo->page_shift = drm->client.vm->mmu->lpg_shift;
        }
 
        nouveau_bo_fixup_align(nvbo, flags, &align, &size);
@@ -1240,7 +1240,7 @@ nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem)
        list_for_each_entry(vma, &nvbo->vma_list, head) {
                if (new_mem && new_mem->mem_type != TTM_PL_SYSTEM &&
                              (new_mem->mem_type == TTM_PL_VRAM ||
-                              nvbo->page_shift != vma->vm->vmm->lpg_shift)) {
+                              nvbo->page_shift != vma->vm->mmu->lpg_shift)) {
                        nouveau_vm_map(vma, new_mem->mm_node);
                } else {
                        nouveau_vm_unmap(vma);
@@ -1639,7 +1639,7 @@ nouveau_bo_vma_add(struct nouveau_bo *nvbo, struct nouveau_vm *vm,
 
        if ( nvbo->bo.mem.mem_type != TTM_PL_SYSTEM &&
            (nvbo->bo.mem.mem_type == TTM_PL_VRAM ||
-            nvbo->page_shift != vma->vm->vmm->lpg_shift))
+            nvbo->page_shift != vma->vm->mmu->lpg_shift))
                nouveau_vm_map(vma, nvbo->bo.mem.mm_node);
 
        list_add_tail(&vma->head, &nvbo->vma_list);
index aff9099aae6cca23b6e51247ee07068f23b691c1..80302530ead79d549e0a0df4654187b6e62c965d 100644 (file)
@@ -88,7 +88,7 @@ nouveau_channel_prep(struct nouveau_drm *drm, struct nvif_device *device,
                     u32 handle, u32 size, struct nouveau_channel **pchan)
 {
        struct nouveau_cli *cli = (void *)nvif_client(&device->base);
-       struct nouveau_vmmgr *vmm = nvkm_vmmgr(device);
+       struct nouveau_mmu *mmu = nvkm_mmu(device);
        struct nv_dma_v0 args = {};
        struct nouveau_channel *chan;
        u32 target;
@@ -136,7 +136,7 @@ nouveau_channel_prep(struct nouveau_drm *drm, struct nvif_device *device,
                args.target = NV_DMA_V0_TARGET_VM;
                args.access = NV_DMA_V0_ACCESS_VM;
                args.start = 0;
-               args.limit = cli->vm->vmm->limit - 1;
+               args.limit = cli->vm->mmu->limit - 1;
        } else
        if (chan->push.buffer->bo.mem.mem_type == TTM_PL_VRAM) {
                if (device->info.family == NV_DEVICE_INFO_V0_TNT) {
@@ -165,7 +165,7 @@ nouveau_channel_prep(struct nouveau_drm *drm, struct nvif_device *device,
                        args.target = NV_DMA_V0_TARGET_VM;
                        args.access = NV_DMA_V0_ACCESS_RDWR;
                        args.start = 0;
-                       args.limit = vmm->limit - 1;
+                       args.limit = mmu->limit - 1;
                }
        }
 
@@ -281,7 +281,7 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart)
 {
        struct nvif_device *device = chan->device;
        struct nouveau_cli *cli = (void *)nvif_client(&device->base);
-       struct nouveau_vmmgr *vmm = nvkm_vmmgr(device);
+       struct nouveau_mmu *mmu = nvkm_mmu(device);
        struct nouveau_software_chan *swch;
        struct nv_dma_v0 args = {};
        int ret, i;
@@ -294,7 +294,7 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart)
                        args.target = NV_DMA_V0_TARGET_VM;
                        args.access = NV_DMA_V0_ACCESS_VM;
                        args.start = 0;
-                       args.limit = cli->vm->vmm->limit - 1;
+                       args.limit = cli->vm->mmu->limit - 1;
                } else {
                        args.target = NV_DMA_V0_TARGET_VRAM;
                        args.access = NV_DMA_V0_ACCESS_RDWR;
@@ -312,7 +312,7 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart)
                        args.target = NV_DMA_V0_TARGET_VM;
                        args.access = NV_DMA_V0_ACCESS_VM;
                        args.start = 0;
-                       args.limit = cli->vm->vmm->limit - 1;
+                       args.limit = cli->vm->mmu->limit - 1;
                } else
                if (chan->drm->agp.stat == ENABLED) {
                        args.target = NV_DMA_V0_TARGET_AGP;
@@ -324,7 +324,7 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart)
                        args.target = NV_DMA_V0_TARGET_VM;
                        args.access = NV_DMA_V0_ACCESS_RDWR;
                        args.start = 0;
-                       args.limit = vmm->limit - 1;
+                       args.limit = mmu->limit - 1;
                }
 
                ret = nvif_object_init(chan->object, NULL, gart,
index be3d5947c6be0a6a51fa1730d41501c49fb582c2..a94dcdaccf59f19837b04caf455dbb9a11ff16bf 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __NOUVEAU_DISPLAY_H__
 #define __NOUVEAU_DISPLAY_H__
 
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #include "nouveau_drm.h"
 
index 2e0d1d998ca679bd7d9f1f243b954bf92b992200..aa8321706103138ae346f50b31574c9ed114d24d 100644 (file)
@@ -203,13 +203,13 @@ const struct ttm_mem_type_manager_func nouveau_gart_manager = {
 };
 
 /*XXX*/
-#include <subdev/vm/nv04.h>
+#include <subdev/mmu/nv04.h>
 static int
 nv04_gart_manager_init(struct ttm_mem_type_manager *man, unsigned long psize)
 {
        struct nouveau_drm *drm = nouveau_bdev(man->bdev);
-       struct nouveau_vmmgr *vmm = nvkm_vmmgr(&drm->device);
-       struct nv04_vmmgr_priv *priv = (void *)vmm;
+       struct nouveau_mmu *mmu = nvkm_mmu(&drm->device);
+       struct nv04_mmu_priv *priv = (void *)mmu;
        struct nouveau_vm *vm = NULL;
        nouveau_vm_ref(priv->vm, &vm, NULL);
        man->priv = vm;
@@ -354,7 +354,7 @@ nouveau_ttm_init(struct nouveau_drm *drm)
        u32 bits;
        int ret;
 
-       bits = nvkm_vmmgr(&drm->device)->dma_bits;
+       bits = nvkm_mmu(&drm->device)->dma_bits;
        if (nv_device_is_pci(nvkm_device(&drm->device))) {
                if (drm->agp.stat == ENABLED ||
                     !pci_dma_supported(dev->pdev, DMA_BIT_MASK(bits)))
@@ -401,7 +401,7 @@ nouveau_ttm_init(struct nouveau_drm *drm)
 
        /* GART init */
        if (drm->agp.stat != ENABLED) {
-               drm->gem.gart_available = nvkm_vmmgr(&drm->device)->limit;
+               drm->gem.gart_available = nvkm_mmu(&drm->device)->limit;
        } else {
                drm->gem.gart_available = drm->agp.size;
        }
index 16f09b1280dc47e4ed603d3e7b31fa838d20cd97..892baa461575df616eba509378cc69c09a10953f 100644 (file)
@@ -28,7 +28,7 @@
 #include <core/client.h>
 #include <core/engctx.h>
 
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 static inline int
 nouveau_engctx_exists(struct nouveau_object *parent,
index 0fa64576b8d64d4148da3689c558874a0d59f4b5..68a4232d35cce210c1279bc175a2dfa6d0779f01 100644 (file)
@@ -27,7 +27,7 @@
 
 #include <subdev/instmem.h>
 #include <subdev/bar.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 void
 nouveau_gpuobj_destroy(struct nouveau_gpuobj *gpuobj)
index 13c05e09ff873ab89ca83c795e18045923ee1082..6ae64969e2e5b01b16d4d8aa18186bb62b5e04ae 100644 (file)
@@ -27,7 +27,7 @@
 #include <engine/copy.h>
 
 #include <subdev/fb.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #include <core/client.h>
 #include <core/enum.h>
index e141dff31553f2fa2da6666b6944ea8182c04e47..eb9f387d735638e1908bf1c5e06a63962b328ed4 100644 (file)
@@ -218,7 +218,7 @@ static const u64 disable_map[] = {
        [NVDEV_SUBDEV_LTC]      = NV_DEVICE_V0_DISABLE_CORE,
        [NVDEV_SUBDEV_IBUS]     = NV_DEVICE_V0_DISABLE_CORE,
        [NVDEV_SUBDEV_INSTMEM]  = NV_DEVICE_V0_DISABLE_CORE,
-       [NVDEV_SUBDEV_VM]       = NV_DEVICE_V0_DISABLE_CORE,
+       [NVDEV_SUBDEV_MMU]      = NV_DEVICE_V0_DISABLE_CORE,
        [NVDEV_SUBDEV_BAR]      = NV_DEVICE_V0_DISABLE_CORE,
        [NVDEV_SUBDEV_VOLT]     = NV_DEVICE_V0_DISABLE_CORE,
        [NVDEV_SUBDEV_THERM]    = NV_DEVICE_V0_DISABLE_CORE,
index 763572fcb7d4d614a396ce4695b08188bbc7ab86..130d225377ee6f50f53ca55c0fd2207dc32b5537 100644 (file)
@@ -37,7 +37,7 @@
 #include <subdev/ltc.h>
 #include <subdev/ibus.h>
 #include <subdev/instmem.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 #include <subdev/bar.h>
 #include <subdev/pmu.h>
 #include <subdev/volt.h>
@@ -75,7 +75,7 @@ gm100_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gm107_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nve0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nv108_pmu_oclass;
 
@@ -119,7 +119,7 @@ gm100_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gm107_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nve0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nv108_pmu_oclass;
 #if 0
index dff51984ea941656d53e564a23ebdeb6cf555460..7f98385acec7b4d9f5899ae7cf7faf69c28f2483 100644 (file)
@@ -31,7 +31,7 @@
 #include <subdev/timer.h>
 #include <subdev/fb.h>
 #include <subdev/instmem.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #include <engine/device.h>
 #include <engine/dmaobj.h>
@@ -55,7 +55,7 @@ nv04_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv04_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv04_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv04_software_oclass;
@@ -73,7 +73,7 @@ nv04_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv04_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv04_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv04_software_oclass;
index af63f5b95f01dcdef770e9397b6dee63693b36eb..6a7ece0fc789b3d08b5af91fd3df42b6d9f607f8 100644 (file)
@@ -32,7 +32,7 @@
 #include <subdev/timer.h>
 #include <subdev/fb.h>
 #include <subdev/instmem.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #include <engine/device.h>
 #include <engine/dmaobj.h>
@@ -57,7 +57,7 @@ nv10_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv10_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_GR     ] = &nv10_graph_oclass;
                device->oclass[NVDEV_ENGINE_DISP   ] =  nv04_disp_oclass;
@@ -74,7 +74,7 @@ nv10_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv10_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv10_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -93,7 +93,7 @@ nv10_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv10_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv10_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -112,7 +112,7 @@ nv10_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv1a_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv10_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -131,7 +131,7 @@ nv10_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv10_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv10_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -150,7 +150,7 @@ nv10_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv10_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -169,7 +169,7 @@ nv10_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv1a_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -188,7 +188,7 @@ nv10_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv10_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
index eddeb126c7ec9cc63d2eb1041bc951cc73fc37da..e3b17fde89e65713fb18b3ad40c5a0f39c96cbb3 100644 (file)
@@ -33,7 +33,7 @@
 #include <subdev/timer.h>
 #include <subdev/fb.h>
 #include <subdev/instmem.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #include <engine/device.h>
 #include <engine/dmaobj.h>
@@ -58,7 +58,7 @@ nv20_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv20_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -77,7 +77,7 @@ nv20_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv25_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -96,7 +96,7 @@ nv20_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv25_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -115,7 +115,7 @@ nv20_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv25_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
index 6fe2d130a2cea9cc22c1d35e88c647a7605acd63..8f67f4d402d7b9652237597a8650f8fdf5dac3e5 100644 (file)
@@ -32,7 +32,7 @@
 #include <subdev/timer.h>
 #include <subdev/fb.h>
 #include <subdev/instmem.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #include <engine/device.h>
 #include <engine/dmaobj.h>
@@ -58,7 +58,7 @@ nv30_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv30_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -77,7 +77,7 @@ nv30_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv35_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -96,7 +96,7 @@ nv30_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv30_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -116,7 +116,7 @@ nv30_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv36_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
@@ -136,7 +136,7 @@ nv30_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv10_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv04_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv17_fifo_oclass;
                device->oclass[NVDEV_ENGINE_SW     ] =  nv10_software_oclass;
index d85edd87cec8c00431ca0b81553ff08648dfeff8..49c68d7c093c53adada70ba92f7fb9510babad1d 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <subdev/bios.h>
 #include <subdev/bus.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 #include <subdev/gpio.h>
 #include <subdev/i2c.h>
 #include <subdev/clk.h>
@@ -34,7 +34,7 @@
 #include <subdev/timer.h>
 #include <subdev/fb.h>
 #include <subdev/instmem.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 #include <subdev/volt.h>
 
 #include <engine/device.h>
@@ -63,7 +63,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv40_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -86,7 +86,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv41_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv41_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv41_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -109,7 +109,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv41_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv41_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv41_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -132,7 +132,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv41_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv41_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv41_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -155,7 +155,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv40_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv04_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv04_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -178,7 +178,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv47_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv41_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv41_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -201,7 +201,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv49_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv41_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv41_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -224,7 +224,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv49_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv41_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv41_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -247,7 +247,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv44_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv44_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv44_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -270,7 +270,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv46_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv44_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv44_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -293,7 +293,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv44_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv44_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv44_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -316,7 +316,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv46_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv44_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv44_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -339,7 +339,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv4e_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv44_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv44_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -362,7 +362,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv46_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv44_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv44_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -385,7 +385,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv46_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv44_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv44_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
@@ -408,7 +408,7 @@ nv40_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv46_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv40_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv44_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv44_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv04_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nv40_fifo_oclass;
index 867b79a0679a2aafb6d55b1e70504b71e94f4149..f9afee4f844d465085d6239d0a2e383a32d14070 100644 (file)
@@ -35,7 +35,7 @@
 #include <subdev/timer.h>
 #include <subdev/fb.h>
 #include <subdev/instmem.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 #include <subdev/bar.h>
 #include <subdev/pmu.h>
 #include <subdev/volt.h>
@@ -73,7 +73,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv50_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv50_dmaeng_oclass;
@@ -99,7 +99,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv84_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv50_dmaeng_oclass;
@@ -128,7 +128,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv84_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv50_dmaeng_oclass;
@@ -157,7 +157,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv84_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv50_dmaeng_oclass;
@@ -186,7 +186,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv84_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv50_dmaeng_oclass;
@@ -215,7 +215,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv84_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv50_dmaeng_oclass;
@@ -244,7 +244,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv84_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv50_dmaeng_oclass;
@@ -273,7 +273,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nv84_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv50_dmaeng_oclass;
@@ -302,7 +302,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nvaa_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv50_dmaeng_oclass;
@@ -331,7 +331,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nvaa_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nv50_dmaeng_oclass;
@@ -360,7 +360,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nva3_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nva3_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -391,7 +391,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nva3_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nva3_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -421,7 +421,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nva3_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nva3_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -451,7 +451,7 @@ nv50_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_TIMER  ] = &nv04_timer_oclass;
                device->oclass[NVDEV_SUBDEV_FB     ] =  nvaf_fb_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nv50_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nv50_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nv50_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nva3_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
index d54d6ac4cea5a4947ece8436e03818e748c5e64e..0db51092732a3b0c998b05792f83159b87f71a90 100644 (file)
@@ -37,7 +37,7 @@
 #include <subdev/ltc.h>
 #include <subdev/ibus.h>
 #include <subdev/instmem.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 #include <subdev/bar.h>
 #include <subdev/pmu.h>
 #include <subdev/volt.h>
@@ -75,7 +75,7 @@ nvc0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gf100_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nvc0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nvc0_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -108,7 +108,7 @@ nvc0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gf100_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nvc0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nvc0_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -141,7 +141,7 @@ nvc0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gf100_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nvc0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nvc0_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -173,7 +173,7 @@ nvc0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gf100_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nvc0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nvc0_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -206,7 +206,7 @@ nvc0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gf100_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nvc0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nvc0_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -238,7 +238,7 @@ nvc0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gf100_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nvc0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nvc0_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -270,7 +270,7 @@ nvc0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gf100_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nvc0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nvc0_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -303,7 +303,7 @@ nvc0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gf100_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nvc0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nvd0_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -335,7 +335,7 @@ nvc0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gf100_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nvc0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nvd0_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  nvc0_fifo_oclass;
index 39b3fe32b9fbad52f847f07d8f85ea083037e4ef..a565bc8b663614e76860ece1df32fb792c766bee 100644 (file)
@@ -37,7 +37,7 @@
 #include <subdev/ltc.h>
 #include <subdev/ibus.h>
 #include <subdev/instmem.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 #include <subdev/bar.h>
 #include <subdev/pmu.h>
 #include <subdev/volt.h>
@@ -75,7 +75,7 @@ nve0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gk104_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nve0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  gk104_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -109,7 +109,7 @@ nve0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gk104_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nve0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nvd0_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -143,7 +143,7 @@ nve0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gk104_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nve0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  gk104_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -171,7 +171,7 @@ nve0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gk104_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &gk20a_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] = nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &gk20a_bar_oclass;
                device->oclass[NVDEV_ENGINE_DMAOBJ ] =  nvd0_dmaeng_oclass;
                device->oclass[NVDEV_ENGINE_FIFO   ] =  gk20a_fifo_oclass;
@@ -199,7 +199,7 @@ nve0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gk104_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nve0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nvd0_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -233,7 +233,7 @@ nve0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gk104_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nve0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nvd0_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -267,7 +267,7 @@ nve0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gk104_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nve0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nv108_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
@@ -300,7 +300,7 @@ nve0_identify(struct nouveau_device *device)
                device->oclass[NVDEV_SUBDEV_LTC    ] =  gk104_ltc_oclass;
                device->oclass[NVDEV_SUBDEV_IBUS   ] = &nve0_ibus_oclass;
                device->oclass[NVDEV_SUBDEV_INSTMEM] =  nv50_instmem_oclass;
-               device->oclass[NVDEV_SUBDEV_VM     ] = &nvc0_vmmgr_oclass;
+               device->oclass[NVDEV_SUBDEV_MMU    ] = &nvc0_mmu_oclass;
                device->oclass[NVDEV_SUBDEV_BAR    ] = &nvc0_bar_oclass;
                device->oclass[NVDEV_SUBDEV_PMU    ] =  nv108_pmu_oclass;
                device->oclass[NVDEV_SUBDEV_VOLT   ] = &nv40_volt_oclass;
index 20c9dbfe3b2e9124ae07978857a92c4197a1598d..8089310f11572624209f9a41cc97fb4eac060a0f 100644 (file)
@@ -26,7 +26,7 @@
 #include <nvif/class.h>
 
 #include <subdev/fb.h>
-#include <subdev/vm/nv04.h>
+#include <subdev/mmu/nv04.h>
 
 #include "priv.h"
 
@@ -62,8 +62,8 @@ nv04_dmaobj_bind(struct nouveau_dmaobj *dmaobj,
        }
 
        if (priv->clone) {
-               struct nv04_vmmgr_priv *vmm = nv04_vmmgr(dmaobj);
-               struct nouveau_gpuobj *pgt = vmm->vm->pgt[0].obj[0];
+               struct nv04_mmu_priv *mmu = nv04_mmu(dmaobj);
+               struct nouveau_gpuobj *pgt = mmu->vm->pgt[0].obj[0];
                if (!dmaobj->start)
                        return nouveau_gpuobj_dup(parent, pgt, pgpuobj);
                offset  = nv_ro32(pgt, 8 + (offset >> 10));
@@ -88,7 +88,7 @@ nv04_dmaobj_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
                 struct nouveau_object **pobject)
 {
        struct nouveau_dmaeng *dmaeng = (void *)engine;
-       struct nv04_vmmgr_priv *vmm = nv04_vmmgr(engine);
+       struct nv04_mmu_priv *mmu = nv04_mmu(engine);
        struct nv04_dmaobj_priv *priv;
        int ret;
 
@@ -98,7 +98,7 @@ nv04_dmaobj_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
                return ret;
 
        if (priv->base.target == NV_MEM_TARGET_VM) {
-               if (nv_object(vmm)->oclass == &nv04_vmmgr_oclass)
+               if (nv_object(mmu)->oclass == &nv04_mmu_oclass)
                        priv->clone = true;
                priv->base.target = NV_MEM_TARGET_PCI;
                priv->base.access = NV_MEM_ACCESS_RW;
index e8ef8cb058cd6eb401f05d9dc51b34f91a834a3a..e5d1e969945e049a507e97fb40dff621bbc429b7 100644 (file)
@@ -35,7 +35,7 @@
 #include <subdev/timer.h>
 #include <subdev/bar.h>
 #include <subdev/fb.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #include <engine/dmaobj.h>
 #include <engine/fifo.h>
index c9c168035b4d042ba2990798ebc1169fd8afb6a7..bf2b9e2df3d081d7157ed00a2b711e24c31f9e4f 100644 (file)
@@ -35,7 +35,7 @@
 #include <subdev/timer.h>
 #include <subdev/bar.h>
 #include <subdev/fb.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #include <engine/dmaobj.h>
 
index 38e0aa26f1cdf389f4092e09f93115559460cbb6..896e17b56f453b272ac05ef9e2c82d62e4587f0a 100644 (file)
@@ -29,7 +29,7 @@
 #include <core/enum.h>
 
 #include <subdev/fb.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 #include <subdev/timer.h>
 
 #include <engine/fifo.h>
index 7ed9e89c34350bc30f8e1e5da3fd5cff7749ce81..86b7735242e18b53a61f1c6895e02719a1fb2523 100644 (file)
@@ -34,7 +34,7 @@
 #include <nvif/class.h>
 
 #include <subdev/fb.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 #include <subdev/bar.h>
 #include <subdev/timer.h>
 #include <subdev/mc.h>
index cae33f86b11ac69f902c27e1b9b24b906f556119..b62c301b31a192ce2448183e03d98275686c2548 100644 (file)
@@ -25,7 +25,7 @@
 #include <core/os.h>
 #include <core/engctx.h>
 
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 #include <subdev/bar.h>
 #include <subdev/timer.h>
 
index e9cc8b116a242d4733eeaaa66e048d518fd724c6..97c8343e1a080044e2c44429aa36bc5ba1e45ff7 100644 (file)
@@ -25,7 +25,7 @@
 #include <core/os.h>
 #include <core/engctx.h>
 
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 #include <subdev/bar.h>
 #include <subdev/timer.h>
 
index 55090f73bab4d8045a4745204210d3a97172372f..dbcea4930a1d3efe45303d7ba456ce2d671d36bf 100644 (file)
@@ -15,5 +15,5 @@ include $(src)/nvkm/subdev/mxm/Kbuild
 include $(src)/nvkm/subdev/pmu/Kbuild
 include $(src)/nvkm/subdev/therm/Kbuild
 include $(src)/nvkm/subdev/timer/Kbuild
-include $(src)/nvkm/subdev/vm/Kbuild
+include $(src)/nvkm/subdev/mmu/Kbuild
 include $(src)/nvkm/subdev/volt/Kbuild
index 188c638411b2d5f6bbe89c539dc7dfc802be9de3..1b37afe4a4ea64bdafab25040531b1f4b4f04b96 100644 (file)
@@ -25,7 +25,7 @@
 #include <core/object.h>
 
 #include <subdev/fb.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #include "priv.h"
 
index f748ba49dfc8c941c1fae80039c7d2a24b8cea50..6d0dd6a01e644b5a31db82260d5e6e1dbcfbbb37 100644 (file)
@@ -26,7 +26,7 @@
 
 #include <subdev/timer.h>
 #include <subdev/fb.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #include "priv.h"
 
index 8320ee0509c371082b64a98b50eb12da925cbfda..c7ac57ba8e351eec8c3b7c07bb34a430ca04cf05 100644 (file)
@@ -26,7 +26,7 @@
 
 #include <subdev/timer.h>
 #include <subdev/fb.h>
-#include <subdev/vm.h>
+#include <subdev/mmu.h>
 
 #include "priv.h"
 
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild
new file mode 100644 (file)
index 0000000..729e27f
--- /dev/null
@@ -0,0 +1,6 @@
+nvkm-y += nvkm/subdev/mmu/base.o
+nvkm-y += nvkm/subdev/mmu/nv04.o
+nvkm-y += nvkm/subdev/mmu/nv41.o
+nvkm-y += nvkm/subdev/mmu/nv44.o
+nvkm-y += nvkm/subdev/mmu/nv50.o
+nvkm-y += nvkm/subdev/mmu/nvc0.o
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c
new file mode 100644 (file)
index 0000000..e3cb186
--- /dev/null
@@ -0,0 +1,483 @@
+/*
+ * Copyright 2010 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Ben Skeggs
+ */
+
+#include <core/gpuobj.h>
+#include <core/mm.h>
+
+#include <subdev/fb.h>
+#include <subdev/mmu.h>
+
+void
+nouveau_vm_map_at(struct nouveau_vma *vma, u64 delta, struct nouveau_mem *node)
+{
+       struct nouveau_vm *vm = vma->vm;
+       struct nouveau_mmu *mmu = vm->mmu;
+       struct nouveau_mm_node *r;
+       int big = vma->node->type != mmu->spg_shift;
+       u32 offset = vma->node->offset + (delta >> 12);
+       u32 bits = vma->node->type - 12;
+       u32 pde  = (offset >> mmu->pgt_bits) - vm->fpde;
+       u32 pte  = (offset & ((1 << mmu->pgt_bits) - 1)) >> bits;
+       u32 max  = 1 << (mmu->pgt_bits - bits);
+       u32 end, len;
+
+       delta = 0;
+       list_for_each_entry(r, &node->regions, rl_entry) {
+               u64 phys = (u64)r->offset << 12;
+               u32 num  = r->length >> bits;
+
+               while (num) {
+                       struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
+
+                       end = (pte + num);
+                       if (unlikely(end >= max))
+                               end = max;
+                       len = end - pte;
+
+                       mmu->map(vma, pgt, node, pte, len, phys, delta);
+
+                       num -= len;
+                       pte += len;
+                       if (unlikely(end >= max)) {
+                               phys += len << (bits + 12);
+                               pde++;
+                               pte = 0;
+                       }
+
+                       delta += (u64)len << vma->node->type;
+               }
+       }
+
+       mmu->flush(vm);
+}
+
+static void
+nouveau_vm_map_sg_table(struct nouveau_vma *vma, u64 delta, u64 length,
+                       struct nouveau_mem *mem)
+{
+       struct nouveau_vm *vm = vma->vm;
+       struct nouveau_mmu *mmu = vm->mmu;
+       int big = vma->node->type != mmu->spg_shift;
+       u32 offset = vma->node->offset + (delta >> 12);
+       u32 bits = vma->node->type - 12;
+       u32 num  = length >> vma->node->type;
+       u32 pde  = (offset >> mmu->pgt_bits) - vm->fpde;
+       u32 pte  = (offset & ((1 << mmu->pgt_bits) - 1)) >> bits;
+       u32 max  = 1 << (mmu->pgt_bits - bits);
+       unsigned m, sglen;
+       u32 end, len;
+       int i;
+       struct scatterlist *sg;
+
+       for_each_sg(mem->sg->sgl, sg, mem->sg->nents, i) {
+               struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
+               sglen = sg_dma_len(sg) >> PAGE_SHIFT;
+
+               end = pte + sglen;
+               if (unlikely(end >= max))
+                       end = max;
+               len = end - pte;
+
+               for (m = 0; m < len; m++) {
+                       dma_addr_t addr = sg_dma_address(sg) + (m << PAGE_SHIFT);
+
+                       mmu->map_sg(vma, pgt, mem, pte, 1, &addr);
+                       num--;
+                       pte++;
+
+                       if (num == 0)
+                               goto finish;
+               }
+               if (unlikely(end >= max)) {
+                       pde++;
+                       pte = 0;
+               }
+               if (m < sglen) {
+                       for (; m < sglen; m++) {
+                               dma_addr_t addr = sg_dma_address(sg) + (m << PAGE_SHIFT);
+
+                               mmu->map_sg(vma, pgt, mem, pte, 1, &addr);
+                               num--;
+                               pte++;
+                               if (num == 0)
+                                       goto finish;
+                       }
+               }
+
+       }
+finish:
+       mmu->flush(vm);
+}
+
+static void
+nouveau_vm_map_sg(struct nouveau_vma *vma, u64 delta, u64 length,
+                 struct nouveau_mem *mem)
+{
+       struct nouveau_vm *vm = vma->vm;
+       struct nouveau_mmu *mmu = vm->mmu;
+       dma_addr_t *list = mem->pages;
+       int big = vma->node->type != mmu->spg_shift;
+       u32 offset = vma->node->offset + (delta >> 12);
+       u32 bits = vma->node->type - 12;
+       u32 num  = length >> vma->node->type;
+       u32 pde  = (offset >> mmu->pgt_bits) - vm->fpde;
+       u32 pte  = (offset & ((1 << mmu->pgt_bits) - 1)) >> bits;
+       u32 max  = 1 << (mmu->pgt_bits - bits);
+       u32 end, len;
+
+       while (num) {
+               struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
+
+               end = (pte + num);
+               if (unlikely(end >= max))
+                       end = max;
+               len = end - pte;
+
+               mmu->map_sg(vma, pgt, mem, pte, len, list);
+
+               num  -= len;
+               pte  += len;
+               list += len;
+               if (unlikely(end >= max)) {
+                       pde++;
+                       pte = 0;
+               }
+       }
+
+       mmu->flush(vm);
+}
+
+void
+nouveau_vm_map(struct nouveau_vma *vma, struct nouveau_mem *node)
+{
+       if (node->sg)
+               nouveau_vm_map_sg_table(vma, 0, node->size << 12, node);
+       else
+       if (node->pages)
+               nouveau_vm_map_sg(vma, 0, node->size << 12, node);
+       else
+               nouveau_vm_map_at(vma, 0, node);
+}
+
+void
+nouveau_vm_unmap_at(struct nouveau_vma *vma, u64 delta, u64 length)
+{
+       struct nouveau_vm *vm = vma->vm;
+       struct nouveau_mmu *mmu = vm->mmu;
+       int big = vma->node->type != mmu->spg_shift;
+       u32 offset = vma->node->offset + (delta >> 12);
+       u32 bits = vma->node->type - 12;
+       u32 num  = length >> vma->node->type;
+       u32 pde  = (offset >> mmu->pgt_bits) - vm->fpde;
+       u32 pte  = (offset & ((1 << mmu->pgt_bits) - 1)) >> bits;
+       u32 max  = 1 << (mmu->pgt_bits - bits);
+       u32 end, len;
+
+       while (num) {
+               struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
+
+               end = (pte + num);
+               if (unlikely(end >= max))
+                       end = max;
+               len = end - pte;
+
+               mmu->unmap(pgt, pte, len);
+
+               num -= len;
+               pte += len;
+               if (unlikely(end >= max)) {
+                       pde++;
+                       pte = 0;
+               }
+       }
+
+       mmu->flush(vm);
+}
+
+void
+nouveau_vm_unmap(struct nouveau_vma *vma)
+{
+       nouveau_vm_unmap_at(vma, 0, (u64)vma->node->length << 12);
+}
+
+static void
+nouveau_vm_unmap_pgt(struct nouveau_vm *vm, int big, u32 fpde, u32 lpde)
+{
+       struct nouveau_mmu *mmu = vm->mmu;
+       struct nouveau_vm_pgd *vpgd;
+       struct nouveau_vm_pgt *vpgt;
+       struct nouveau_gpuobj *pgt;
+       u32 pde;
+
+       for (pde = fpde; pde <= lpde; pde++) {
+               vpgt = &vm->pgt[pde - vm->fpde];
+               if (--vpgt->refcount[big])
+                       continue;
+
+               pgt = vpgt->obj[big];
+               vpgt->obj[big] = NULL;
+
+               list_for_each_entry(vpgd, &vm->pgd_list, head) {
+                       mmu->map_pgt(vpgd->obj, pde, vpgt->obj);
+               }
+
+               mutex_unlock(&nv_subdev(mmu)->mutex);
+               nouveau_gpuobj_ref(NULL, &pgt);
+               mutex_lock(&nv_subdev(mmu)->mutex);
+       }
+}
+
+static int
+nouveau_vm_map_pgt(struct nouveau_vm *vm, u32 pde, u32 type)
+{
+       struct nouveau_mmu *mmu = vm->mmu;
+       struct nouveau_vm_pgt *vpgt = &vm->pgt[pde - vm->fpde];
+       struct nouveau_vm_pgd *vpgd;
+       struct nouveau_gpuobj *pgt;
+       int big = (type != mmu->spg_shift);
+       u32 pgt_size;
+       int ret;
+
+       pgt_size  = (1 << (mmu->pgt_bits + 12)) >> type;
+       pgt_size *= 8;
+
+       mutex_unlock(&nv_subdev(mmu)->mutex);
+       ret = nouveau_gpuobj_new(nv_object(vm->mmu), NULL, pgt_size, 0x1000,
+                                NVOBJ_FLAG_ZERO_ALLOC, &pgt);
+       mutex_lock(&nv_subdev(mmu)->mutex);
+       if (unlikely(ret))
+               return ret;
+
+       /* someone beat us to filling the PDE while we didn't have the lock */
+       if (unlikely(vpgt->refcount[big]++)) {
+               mutex_unlock(&nv_subdev(mmu)->mutex);
+               nouveau_gpuobj_ref(NULL, &pgt);
+               mutex_lock(&nv_subdev(mmu)->mutex);
+               return 0;
+       }
+
+       vpgt->obj[big] = pgt;
+       list_for_each_entry(vpgd, &vm->pgd_list, head) {
+               mmu->map_pgt(vpgd->obj, pde, vpgt->obj);
+       }
+
+       return 0;
+}
+
+int
+nouveau_vm_get(struct nouveau_vm *vm, u64 size, u32 page_shift,
+              u32 access, struct nouveau_vma *vma)
+{
+       struct nouveau_mmu *mmu = vm->mmu;
+       u32 align = (1 << page_shift) >> 12;
+       u32 msize = size >> 12;
+       u32 fpde, lpde, pde;
+       int ret;
+
+       mutex_lock(&nv_subdev(mmu)->mutex);
+       ret = nouveau_mm_head(&vm->mm, 0, page_shift, msize, msize, align,
+                            &vma->node);
+       if (unlikely(ret != 0)) {
+               mutex_unlock(&nv_subdev(mmu)->mutex);
+               return ret;
+       }
+
+       fpde = (vma->node->offset >> mmu->pgt_bits);
+       lpde = (vma->node->offset + vma->node->length - 1) >> mmu->pgt_bits;
+
+       for (pde = fpde; pde <= lpde; pde++) {
+               struct nouveau_vm_pgt *vpgt = &vm->pgt[pde - vm->fpde];
+               int big = (vma->node->type != mmu->spg_shift);
+
+               if (likely(vpgt->refcount[big])) {
+                       vpgt->refcount[big]++;
+                       continue;
+               }
+
+               ret = nouveau_vm_map_pgt(vm, pde, vma->node->type);
+               if (ret) {
+                       if (pde != fpde)
+                               nouveau_vm_unmap_pgt(vm, big, fpde, pde - 1);
+                       nouveau_mm_free(&vm->mm, &vma->node);
+                       mutex_unlock(&nv_subdev(mmu)->mutex);
+                       return ret;
+               }
+       }
+       mutex_unlock(&nv_subdev(mmu)->mutex);
+
+       vma->vm = NULL;
+       nouveau_vm_ref(vm, &vma->vm, NULL);
+       vma->offset = (u64)vma->node->offset << 12;
+       vma->access = access;
+       return 0;
+}
+
+void
+nouveau_vm_put(struct nouveau_vma *vma)
+{
+       struct nouveau_vm *vm = vma->vm;
+       struct nouveau_mmu *mmu = vm->mmu;
+       u32 fpde, lpde;
+
+       if (unlikely(vma->node == NULL))
+               return;
+       fpde = (vma->node->offset >> mmu->pgt_bits);
+       lpde = (vma->node->offset + vma->node->length - 1) >> mmu->pgt_bits;
+
+       mutex_lock(&nv_subdev(mmu)->mutex);
+       nouveau_vm_unmap_pgt(vm, vma->node->type != mmu->spg_shift, fpde, lpde);
+       nouveau_mm_free(&vm->mm, &vma->node);
+       mutex_unlock(&nv_subdev(mmu)->mutex);
+
+       nouveau_vm_ref(NULL, &vma->vm, NULL);
+}
+
+int
+nouveau_vm_create(struct nouveau_mmu *mmu, u64 offset, u64 length,
+                 u64 mm_offset, u32 block, struct nouveau_vm **pvm)
+{
+       struct nouveau_vm *vm;
+       u64 mm_length = (offset + length) - mm_offset;
+       int ret;
+
+       vm = kzalloc(sizeof(*vm), GFP_KERNEL);
+       if (!vm)
+               return -ENOMEM;
+
+       INIT_LIST_HEAD(&vm->pgd_list);
+       vm->mmu = mmu;
+       kref_init(&vm->refcount);
+       vm->fpde = offset >> (mmu->pgt_bits + 12);
+       vm->lpde = (offset + length - 1) >> (mmu->pgt_bits + 12);
+
+       vm->pgt  = vzalloc((vm->lpde - vm->fpde + 1) * sizeof(*vm->pgt));
+       if (!vm->pgt) {
+               kfree(vm);
+               return -ENOMEM;
+       }
+
+       ret = nouveau_mm_init(&vm->mm, mm_offset >> 12, mm_length >> 12,
+                             block >> 12);
+       if (ret) {
+               vfree(vm->pgt);
+               kfree(vm);
+               return ret;
+       }
+
+       *pvm = vm;
+
+       return 0;
+}
+
+int
+nouveau_vm_new(struct nouveau_device *device, u64 offset, u64 length,
+              u64 mm_offset, struct nouveau_vm **pvm)
+{
+       struct nouveau_mmu *mmu = nouveau_mmu(device);
+       return mmu->create(mmu, offset, length, mm_offset, pvm);
+}
+
+static int
+nouveau_vm_link(struct nouveau_vm *vm, struct nouveau_gpuobj *pgd)
+{
+       struct nouveau_mmu *mmu = vm->mmu;
+       struct nouveau_vm_pgd *vpgd;
+       int i;
+
+       if (!pgd)
+               return 0;
+
+       vpgd = kzalloc(sizeof(*vpgd), GFP_KERNEL);
+       if (!vpgd)
+               return -ENOMEM;
+
+       nouveau_gpuobj_ref(pgd, &vpgd->obj);
+
+       mutex_lock(&nv_subdev(mmu)->mutex);
+       for (i = vm->fpde; i <= vm->lpde; i++)
+               mmu->map_pgt(pgd, i, vm->pgt[i - vm->fpde].obj);
+       list_add(&vpgd->head, &vm->pgd_list);
+       mutex_unlock(&nv_subdev(mmu)->mutex);
+       return 0;
+}
+
+static void
+nouveau_vm_unlink(struct nouveau_vm *vm, struct nouveau_gpuobj *mpgd)
+{
+       struct nouveau_mmu *mmu = vm->mmu;
+       struct nouveau_vm_pgd *vpgd, *tmp;
+       struct nouveau_gpuobj *pgd = NULL;
+
+       if (!mpgd)
+               return;
+
+       mutex_lock(&nv_subdev(mmu)->mutex);
+       list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) {
+               if (vpgd->obj == mpgd) {
+                       pgd = vpgd->obj;
+                       list_del(&vpgd->head);
+                       kfree(vpgd);
+                       break;
+               }
+       }
+       mutex_unlock(&nv_subdev(mmu)->mutex);
+
+       nouveau_gpuobj_ref(NULL, &pgd);
+}
+
+static void
+nouveau_vm_del(struct kref *kref)
+{
+       struct nouveau_vm *vm = container_of(kref, typeof(*vm), refcount);
+       struct nouveau_vm_pgd *vpgd, *tmp;
+
+       list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) {
+               nouveau_vm_unlink(vm, vpgd->obj);
+       }
+
+       nouveau_mm_fini(&vm->mm);
+       vfree(vm->pgt);
+       kfree(vm);
+}
+
+int
+nouveau_vm_ref(struct nouveau_vm *ref, struct nouveau_vm **ptr,
+              struct nouveau_gpuobj *pgd)
+{
+       if (ref) {
+               int ret = nouveau_vm_link(ref, pgd);
+               if (ret)
+                       return ret;
+
+               kref_get(&ref->refcount);
+       }
+
+       if (*ptr) {
+               nouveau_vm_unlink(*ptr, pgd);
+               kref_put(&(*ptr)->refcount, nouveau_vm_del);
+       }
+
+       *ptr = ref;
+       return 0;
+}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv04.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv04.c
new file mode 100644 (file)
index 0000000..a317d8f
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2012 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Ben Skeggs
+ */
+
+#include <core/gpuobj.h>
+
+#include "nv04.h"
+
+#define NV04_PDMA_SIZE (128 * 1024 * 1024)
+#define NV04_PDMA_PAGE (  4 * 1024)
+
+/*******************************************************************************
+ * VM map/unmap callbacks
+ ******************************************************************************/
+
+static void
+nv04_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+              struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
+{
+       pte = 0x00008 + (pte * 4);
+       while (cnt) {
+               u32 page = PAGE_SIZE / NV04_PDMA_PAGE;
+               u32 phys = (u32)*list++;
+               while (cnt && page--) {
+                       nv_wo32(pgt, pte, phys | 3);
+                       phys += NV04_PDMA_PAGE;
+                       pte += 4;
+                       cnt -= 1;
+               }
+       }
+}
+
+static void
+nv04_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
+{
+       pte = 0x00008 + (pte * 4);
+       while (cnt--) {
+               nv_wo32(pgt, pte, 0x00000000);
+               pte += 4;
+       }
+}
+
+static void
+nv04_vm_flush(struct nouveau_vm *vm)
+{
+}
+
+/*******************************************************************************
+ * VM object
+ ******************************************************************************/
+
+int
+nv04_vm_create(struct nouveau_mmu *mmu, u64 offset, u64 length, u64 mmstart,
+              struct nouveau_vm **pvm)
+{
+       return -EINVAL;
+}
+
+/*******************************************************************************
+ * MMU subdev
+ ******************************************************************************/
+
+static int
+nv04_mmu_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
+               struct nouveau_oclass *oclass, void *data, u32 size,
+               struct nouveau_object **pobject)
+{
+       struct nv04_mmu_priv *priv;
+       struct nouveau_gpuobj *dma;
+       int ret;
+
+       ret = nouveau_mmu_create(parent, engine, oclass, "PCIGART",
+                                  "pcigart", &priv);
+       *pobject = nv_object(priv);
+       if (ret)
+               return ret;
+
+       priv->base.create = nv04_vm_create;
+       priv->base.limit = NV04_PDMA_SIZE;
+       priv->base.dma_bits = 32;
+       priv->base.pgt_bits = 32 - 12;
+       priv->base.spg_shift = 12;
+       priv->base.lpg_shift = 12;
+       priv->base.map_sg = nv04_vm_map_sg;
+       priv->base.unmap = nv04_vm_unmap;
+       priv->base.flush = nv04_vm_flush;
+
+       ret = nouveau_vm_create(&priv->base, 0, NV04_PDMA_SIZE, 0, 4096,
+                               &priv->vm);
+       if (ret)
+               return ret;
+
+       ret = nouveau_gpuobj_new(nv_object(priv), NULL,
+                                (NV04_PDMA_SIZE / NV04_PDMA_PAGE) * 4 +
+                                8, 16, NVOBJ_FLAG_ZERO_ALLOC,
+                                &priv->vm->pgt[0].obj[0]);
+       dma = priv->vm->pgt[0].obj[0];
+       priv->vm->pgt[0].refcount[0] = 1;
+       if (ret)
+               return ret;
+
+       nv_wo32(dma, 0x00000, 0x0002103d); /* PCI, RW, PT, !LN */
+       nv_wo32(dma, 0x00004, NV04_PDMA_SIZE - 1);
+       return 0;
+}
+
+void
+nv04_mmu_dtor(struct nouveau_object *object)
+{
+       struct nv04_mmu_priv *priv = (void *)object;
+       if (priv->vm) {
+               nouveau_gpuobj_ref(NULL, &priv->vm->pgt[0].obj[0]);
+               nouveau_vm_ref(NULL, &priv->vm, NULL);
+       }
+       if (priv->nullp) {
+               pci_free_consistent(nv_device(priv)->pdev, 16 * 1024,
+                                   priv->nullp, priv->null);
+       }
+       nouveau_mmu_destroy(&priv->base);
+}
+
+struct nouveau_oclass
+nv04_mmu_oclass = {
+       .handle = NV_SUBDEV(MMU, 0x04),
+       .ofuncs = &(struct nouveau_ofuncs) {
+               .ctor = nv04_mmu_ctor,
+               .dtor = nv04_mmu_dtor,
+               .init = _nouveau_mmu_init,
+               .fini = _nouveau_mmu_fini,
+       },
+};
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv04.h b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv04.h
new file mode 100644 (file)
index 0000000..919b254
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef __NV04_MMU_PRIV__
+#define __NV04_MMU_PRIV__
+
+#include <subdev/mmu.h>
+
+struct nv04_mmu_priv {
+       struct nouveau_mmu base;
+       struct nouveau_vm *vm;
+       dma_addr_t null;
+       void *nullp;
+};
+
+static inline struct nv04_mmu_priv *
+nv04_mmu(void *obj)
+{
+       return (void *)nouveau_mmu(obj);
+}
+
+#endif
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv41.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv41.c
new file mode 100644 (file)
index 0000000..61af036
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2012 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Ben Skeggs
+ */
+
+#include <core/gpuobj.h>
+#include <core/option.h>
+
+#include <subdev/timer.h>
+#include <subdev/mmu.h>
+
+#include "nv04.h"
+
+#define NV41_GART_SIZE (512 * 1024 * 1024)
+#define NV41_GART_PAGE (  4 * 1024)
+
+/*******************************************************************************
+ * VM map/unmap callbacks
+ ******************************************************************************/
+
+static void
+nv41_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+              struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
+{
+       pte = pte * 4;
+       while (cnt) {
+               u32 page = PAGE_SIZE / NV41_GART_PAGE;
+               u64 phys = (u64)*list++;
+               while (cnt && page--) {
+                       nv_wo32(pgt, pte, (phys >> 7) | 1);
+                       phys += NV41_GART_PAGE;
+                       pte += 4;
+                       cnt -= 1;
+               }
+       }
+}
+
+static void
+nv41_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
+{
+       pte = pte * 4;
+       while (cnt--) {
+               nv_wo32(pgt, pte, 0x00000000);
+               pte += 4;
+       }
+}
+
+static void
+nv41_vm_flush(struct nouveau_vm *vm)
+{
+       struct nv04_mmu_priv *priv = (void *)vm->mmu;
+
+       mutex_lock(&nv_subdev(priv)->mutex);
+       nv_wr32(priv, 0x100810, 0x00000022);
+       if (!nv_wait(priv, 0x100810, 0x00000020, 0x00000020)) {
+               nv_warn(priv, "flush timeout, 0x%08x\n",
+                       nv_rd32(priv, 0x100810));
+       }
+       nv_wr32(priv, 0x100810, 0x00000000);
+       mutex_unlock(&nv_subdev(priv)->mutex);
+}
+
+/*******************************************************************************
+ * MMU subdev
+ ******************************************************************************/
+
+static int
+nv41_mmu_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
+               struct nouveau_oclass *oclass, void *data, u32 size,
+               struct nouveau_object **pobject)
+{
+       struct nouveau_device *device = nv_device(parent);
+       struct nv04_mmu_priv *priv;
+       int ret;
+
+       if (pci_find_capability(device->pdev, PCI_CAP_ID_AGP) ||
+           !nouveau_boolopt(device->cfgopt, "NvPCIE", true)) {
+               return nouveau_object_ctor(parent, engine, &nv04_mmu_oclass,
+                                          data, size, pobject);
+       }
+
+       ret = nouveau_mmu_create(parent, engine, oclass, "PCIEGART",
+                                  "pciegart", &priv);
+       *pobject = nv_object(priv);
+       if (ret)
+               return ret;
+
+       priv->base.create = nv04_vm_create;
+       priv->base.limit = NV41_GART_SIZE;
+       priv->base.dma_bits = 39;
+       priv->base.pgt_bits = 32 - 12;
+       priv->base.spg_shift = 12;
+       priv->base.lpg_shift = 12;
+       priv->base.map_sg = nv41_vm_map_sg;
+       priv->base.unmap = nv41_vm_unmap;
+       priv->base.flush = nv41_vm_flush;
+
+       ret = nouveau_vm_create(&priv->base, 0, NV41_GART_SIZE, 0, 4096,
+                               &priv->vm);
+       if (ret)
+               return ret;
+
+       ret = nouveau_gpuobj_new(nv_object(priv), NULL,
+                               (NV41_GART_SIZE / NV41_GART_PAGE) * 4,
+                                16, NVOBJ_FLAG_ZERO_ALLOC,
+                                &priv->vm->pgt[0].obj[0]);
+       priv->vm->pgt[0].refcount[0] = 1;
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int
+nv41_mmu_init(struct nouveau_object *object)
+{
+       struct nv04_mmu_priv *priv = (void *)object;
+       struct nouveau_gpuobj *dma = priv->vm->pgt[0].obj[0];
+       int ret;
+
+       ret = nouveau_mmu_init(&priv->base);
+       if (ret)
+               return ret;
+
+       nv_wr32(priv, 0x100800, dma->addr | 0x00000002);
+       nv_mask(priv, 0x10008c, 0x00000100, 0x00000100);
+       nv_wr32(priv, 0x100820, 0x00000000);
+       return 0;
+}
+
+struct nouveau_oclass
+nv41_mmu_oclass = {
+       .handle = NV_SUBDEV(MMU, 0x41),
+       .ofuncs = &(struct nouveau_ofuncs) {
+               .ctor = nv41_mmu_ctor,
+               .dtor = nv04_mmu_dtor,
+               .init = nv41_mmu_init,
+               .fini = _nouveau_mmu_fini,
+       },
+};
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv44.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv44.c
new file mode 100644 (file)
index 0000000..f5319e3
--- /dev/null
@@ -0,0 +1,249 @@
+/*
+ * Copyright 2012 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Ben Skeggs
+ */
+
+#include <core/gpuobj.h>
+#include <core/option.h>
+
+#include <subdev/timer.h>
+#include <subdev/mmu.h>
+
+#include "nv04.h"
+
+#define NV44_GART_SIZE (512 * 1024 * 1024)
+#define NV44_GART_PAGE (  4 * 1024)
+
+/*******************************************************************************
+ * VM map/unmap callbacks
+ ******************************************************************************/
+
+static void
+nv44_vm_fill(struct nouveau_gpuobj *pgt, dma_addr_t null,
+            dma_addr_t *list, u32 pte, u32 cnt)
+{
+       u32 base = (pte << 2) & ~0x0000000f;
+       u32 tmp[4];
+
+       tmp[0] = nv_ro32(pgt, base + 0x0);
+       tmp[1] = nv_ro32(pgt, base + 0x4);
+       tmp[2] = nv_ro32(pgt, base + 0x8);
+       tmp[3] = nv_ro32(pgt, base + 0xc);
+
+       while (cnt--) {
+               u32 addr = list ? (*list++ >> 12) : (null >> 12);
+               switch (pte++ & 0x3) {
+               case 0:
+                       tmp[0] &= ~0x07ffffff;
+                       tmp[0] |= addr;
+                       break;
+               case 1:
+                       tmp[0] &= ~0xf8000000;
+                       tmp[0] |= addr << 27;
+                       tmp[1] &= ~0x003fffff;
+                       tmp[1] |= addr >> 5;
+                       break;
+               case 2:
+                       tmp[1] &= ~0xffc00000;
+                       tmp[1] |= addr << 22;
+                       tmp[2] &= ~0x0001ffff;
+                       tmp[2] |= addr >> 10;
+                       break;
+               case 3:
+                       tmp[2] &= ~0xfffe0000;
+                       tmp[2] |= addr << 17;
+                       tmp[3] &= ~0x00000fff;
+                       tmp[3] |= addr >> 15;
+                       break;
+               }
+       }
+
+       nv_wo32(pgt, base + 0x0, tmp[0]);
+       nv_wo32(pgt, base + 0x4, tmp[1]);
+       nv_wo32(pgt, base + 0x8, tmp[2]);
+       nv_wo32(pgt, base + 0xc, tmp[3] | 0x40000000);
+}
+
+static void
+nv44_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+              struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
+{
+       struct nv04_mmu_priv *priv = (void *)vma->vm->mmu;
+       u32 tmp[4];
+       int i;
+
+       if (pte & 3) {
+               u32  max = 4 - (pte & 3);
+               u32 part = (cnt > max) ? max : cnt;
+               nv44_vm_fill(pgt, priv->null, list, pte, part);
+               pte  += part;
+               list += part;
+               cnt  -= part;
+       }
+
+       while (cnt >= 4) {
+               for (i = 0; i < 4; i++)
+                       tmp[i] = *list++ >> 12;
+               nv_wo32(pgt, pte++ * 4, tmp[0] >>  0 | tmp[1] << 27);
+               nv_wo32(pgt, pte++ * 4, tmp[1] >>  5 | tmp[2] << 22);
+               nv_wo32(pgt, pte++ * 4, tmp[2] >> 10 | tmp[3] << 17);
+               nv_wo32(pgt, pte++ * 4, tmp[3] >> 15 | 0x40000000);
+               cnt -= 4;
+       }
+
+       if (cnt)
+               nv44_vm_fill(pgt, priv->null, list, pte, cnt);
+}
+
+static void
+nv44_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
+{
+       struct nv04_mmu_priv *priv = (void *)nouveau_mmu(pgt);
+
+       if (pte & 3) {
+               u32  max = 4 - (pte & 3);
+               u32 part = (cnt > max) ? max : cnt;
+               nv44_vm_fill(pgt, priv->null, NULL, pte, part);
+               pte  += part;
+               cnt  -= part;
+       }
+
+       while (cnt >= 4) {
+               nv_wo32(pgt, pte++ * 4, 0x00000000);
+               nv_wo32(pgt, pte++ * 4, 0x00000000);
+               nv_wo32(pgt, pte++ * 4, 0x00000000);
+               nv_wo32(pgt, pte++ * 4, 0x00000000);
+               cnt -= 4;
+       }
+
+       if (cnt)
+               nv44_vm_fill(pgt, priv->null, NULL, pte, cnt);
+}
+
+static void
+nv44_vm_flush(struct nouveau_vm *vm)
+{
+       struct nv04_mmu_priv *priv = (void *)vm->mmu;
+       nv_wr32(priv, 0x100814, priv->base.limit - NV44_GART_PAGE);
+       nv_wr32(priv, 0x100808, 0x00000020);
+       if (!nv_wait(priv, 0x100808, 0x00000001, 0x00000001))
+               nv_error(priv, "timeout: 0x%08x\n", nv_rd32(priv, 0x100808));
+       nv_wr32(priv, 0x100808, 0x00000000);
+}
+
+/*******************************************************************************
+ * MMU subdev
+ ******************************************************************************/
+
+static int
+nv44_mmu_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
+               struct nouveau_oclass *oclass, void *data, u32 size,
+               struct nouveau_object **pobject)
+{
+       struct nouveau_device *device = nv_device(parent);
+       struct nv04_mmu_priv *priv;
+       int ret;
+
+       if (pci_find_capability(device->pdev, PCI_CAP_ID_AGP) ||
+           !nouveau_boolopt(device->cfgopt, "NvPCIE", true)) {
+               return nouveau_object_ctor(parent, engine, &nv04_mmu_oclass,
+                                          data, size, pobject);
+       }
+
+       ret = nouveau_mmu_create(parent, engine, oclass, "PCIEGART",
+                                  "pciegart", &priv);
+       *pobject = nv_object(priv);
+       if (ret)
+               return ret;
+
+       priv->base.create = nv04_vm_create;
+       priv->base.limit = NV44_GART_SIZE;
+       priv->base.dma_bits = 39;
+       priv->base.pgt_bits = 32 - 12;
+       priv->base.spg_shift = 12;
+       priv->base.lpg_shift = 12;
+       priv->base.map_sg = nv44_vm_map_sg;
+       priv->base.unmap = nv44_vm_unmap;
+       priv->base.flush = nv44_vm_flush;
+
+       priv->nullp = pci_alloc_consistent(device->pdev, 16 * 1024, &priv->null);
+       if (!priv->nullp) {
+               nv_error(priv, "unable to allocate dummy pages\n");
+               return -ENOMEM;
+       }
+
+       ret = nouveau_vm_create(&priv->base, 0, NV44_GART_SIZE, 0, 4096,
+                               &priv->vm);
+       if (ret)
+               return ret;
+
+       ret = nouveau_gpuobj_new(nv_object(priv), NULL,
+                               (NV44_GART_SIZE / NV44_GART_PAGE) * 4,
+                                512 * 1024, NVOBJ_FLAG_ZERO_ALLOC,
+                                &priv->vm->pgt[0].obj[0]);
+       priv->vm->pgt[0].refcount[0] = 1;
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int
+nv44_mmu_init(struct nouveau_object *object)
+{
+       struct nv04_mmu_priv *priv = (void *)object;
+       struct nouveau_gpuobj *gart = priv->vm->pgt[0].obj[0];
+       u32 addr;
+       int ret;
+
+       ret = nouveau_mmu_init(&priv->base);
+       if (ret)
+               return ret;
+
+       /* calculate vram address of this PRAMIN block, object must be
+        * allocated on 512KiB alignment, and not exceed a total size
+        * of 512KiB for this to work correctly
+        */
+       addr  = nv_rd32(priv, 0x10020c);
+       addr -= ((gart->addr >> 19) + 1) << 19;
+
+       nv_wr32(priv, 0x100850, 0x80000000);
+       nv_wr32(priv, 0x100818, priv->null);
+       nv_wr32(priv, 0x100804, NV44_GART_SIZE);
+       nv_wr32(priv, 0x100850, 0x00008000);
+       nv_mask(priv, 0x10008c, 0x00000200, 0x00000200);
+       nv_wr32(priv, 0x100820, 0x00000000);
+       nv_wr32(priv, 0x10082c, 0x00000001);
+       nv_wr32(priv, 0x100800, addr | 0x00000010);
+       return 0;
+}
+
+struct nouveau_oclass
+nv44_mmu_oclass = {
+       .handle = NV_SUBDEV(MMU, 0x44),
+       .ofuncs = &(struct nouveau_ofuncs) {
+               .ctor = nv44_mmu_ctor,
+               .dtor = nv04_mmu_dtor,
+               .init = nv44_mmu_init,
+               .fini = _nouveau_mmu_fini,
+       },
+};
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv50.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv50.c
new file mode 100644 (file)
index 0000000..6ddc65d
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2010 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Ben Skeggs
+ */
+
+#include <core/device.h>
+#include <core/gpuobj.h>
+
+#include <subdev/timer.h>
+#include <subdev/fb.h>
+#include <subdev/bar.h>
+#include <subdev/mmu.h>
+
+struct nv50_mmu_priv {
+       struct nouveau_mmu base;
+};
+
+static void
+nv50_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,
+               struct nouveau_gpuobj *pgt[2])
+{
+       u64 phys = 0xdeadcafe00000000ULL;
+       u32 coverage = 0;
+
+       if (pgt[0]) {
+               phys = 0x00000003 | pgt[0]->addr; /* present, 4KiB pages */
+               coverage = (pgt[0]->size >> 3) << 12;
+       } else
+       if (pgt[1]) {
+               phys = 0x00000001 | pgt[1]->addr; /* present */
+               coverage = (pgt[1]->size >> 3) << 16;
+       }
+
+       if (phys & 1) {
+               if (coverage <= 32 * 1024 * 1024)
+                       phys |= 0x60;
+               else if (coverage <= 64 * 1024 * 1024)
+                       phys |= 0x40;
+               else if (coverage <= 128 * 1024 * 1024)
+                       phys |= 0x20;
+       }
+
+       nv_wo32(pgd, (pde * 8) + 0, lower_32_bits(phys));
+       nv_wo32(pgd, (pde * 8) + 4, upper_32_bits(phys));
+}
+
+static inline u64
+vm_addr(struct nouveau_vma *vma, u64 phys, u32 memtype, u32 target)
+{
+       phys |= 1; /* present */
+       phys |= (u64)memtype << 40;
+       phys |= target << 4;
+       if (vma->access & NV_MEM_ACCESS_SYS)
+               phys |= (1 << 6);
+       if (!(vma->access & NV_MEM_ACCESS_WO))
+               phys |= (1 << 3);
+       return phys;
+}
+
+static void
+nv50_vm_map(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+           struct nouveau_mem *mem, u32 pte, u32 cnt, u64 phys, u64 delta)
+{
+       u32 comp = (mem->memtype & 0x180) >> 7;
+       u32 block, target;
+       int i;
+
+       /* IGPs don't have real VRAM, re-target to stolen system memory */
+       target = 0;
+       if (nouveau_fb(vma->vm->mmu)->ram->stolen) {
+               phys += nouveau_fb(vma->vm->mmu)->ram->stolen;
+               target = 3;
+       }
+
+       phys  = vm_addr(vma, phys, mem->memtype, target);
+       pte <<= 3;
+       cnt <<= 3;
+
+       while (cnt) {
+               u32 offset_h = upper_32_bits(phys);
+               u32 offset_l = lower_32_bits(phys);
+
+               for (i = 7; i >= 0; i--) {
+                       block = 1 << (i + 3);
+                       if (cnt >= block && !(pte & (block - 1)))
+                               break;
+               }
+               offset_l |= (i << 7);
+
+               phys += block << (vma->node->type - 3);
+               cnt  -= block;
+               if (comp) {
+                       u32 tag = mem->tag->offset + ((delta >> 16) * comp);
+                       offset_h |= (tag << 17);
+                       delta    += block << (vma->node->type - 3);
+               }
+
+               while (block) {
+                       nv_wo32(pgt, pte + 0, offset_l);
+                       nv_wo32(pgt, pte + 4, offset_h);
+                       pte += 8;
+                       block -= 8;
+               }
+       }
+}
+
+static void
+nv50_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+              struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
+{
+       u32 target = (vma->access & NV_MEM_ACCESS_NOSNOOP) ? 3 : 2;
+       pte <<= 3;
+       while (cnt--) {
+               u64 phys = vm_addr(vma, (u64)*list++, mem->memtype, target);
+               nv_wo32(pgt, pte + 0, lower_32_bits(phys));
+               nv_wo32(pgt, pte + 4, upper_32_bits(phys));
+               pte += 8;
+       }
+}
+
+static void
+nv50_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
+{
+       pte <<= 3;
+       while (cnt--) {
+               nv_wo32(pgt, pte + 0, 0x00000000);
+               nv_wo32(pgt, pte + 4, 0x00000000);
+               pte += 8;
+       }
+}
+
+static void
+nv50_vm_flush(struct nouveau_vm *vm)
+{
+       struct nv50_mmu_priv *priv = (void *)vm->mmu;
+       struct nouveau_bar *bar = nouveau_bar(priv);
+       struct nouveau_engine *engine;
+       int i, vme;
+
+       bar->flush(bar);
+
+       mutex_lock(&nv_subdev(priv)->mutex);
+       for (i = 0; i < NVDEV_SUBDEV_NR; i++) {
+               if (!atomic_read(&vm->engref[i]))
+                       continue;
+
+               /* unfortunate hw bug workaround... */
+               engine = nouveau_engine(priv, i);
+               if (engine && engine->tlb_flush) {
+                       engine->tlb_flush(engine);
+                       continue;
+               }
+
+               switch (i) {
+               case NVDEV_ENGINE_GR   : vme = 0x00; break;
+               case NVDEV_ENGINE_VP   : vme = 0x01; break;
+               case NVDEV_SUBDEV_BAR  : vme = 0x06; break;
+               case NVDEV_ENGINE_PPP  :
+               case NVDEV_ENGINE_MPEG : vme = 0x08; break;
+               case NVDEV_ENGINE_BSP  : vme = 0x09; break;
+               case NVDEV_ENGINE_CRYPT: vme = 0x0a; break;
+               case NVDEV_ENGINE_COPY0: vme = 0x0d; break;
+               default:
+                       continue;
+               }
+
+               nv_wr32(priv, 0x100c80, (vme << 16) | 1);
+               if (!nv_wait(priv, 0x100c80, 0x00000001, 0x00000000))
+                       nv_error(priv, "vm flush timeout: engine %d\n", vme);
+       }
+       mutex_unlock(&nv_subdev(priv)->mutex);
+}
+
+static int
+nv50_vm_create(struct nouveau_mmu *mmu, u64 offset, u64 length,
+              u64 mm_offset, struct nouveau_vm **pvm)
+{
+       u32 block = (1 << (mmu->pgt_bits + 12));
+       if (block > length)
+               block = length;
+
+       return nouveau_vm_create(mmu, offset, length, mm_offset, block, pvm);
+}
+
+static int
+nv50_mmu_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
+               struct nouveau_oclass *oclass, void *data, u32 size,
+               struct nouveau_object **pobject)
+{
+       struct nv50_mmu_priv *priv;
+       int ret;
+
+       ret = nouveau_mmu_create(parent, engine, oclass, "VM", "vm", &priv);
+       *pobject = nv_object(priv);
+       if (ret)
+               return ret;
+
+       priv->base.limit = 1ULL << 40;
+       priv->base.dma_bits = 40;
+       priv->base.pgt_bits  = 29 - 12;
+       priv->base.spg_shift = 12;
+       priv->base.lpg_shift = 16;
+       priv->base.create = nv50_vm_create;
+       priv->base.map_pgt = nv50_vm_map_pgt;
+       priv->base.map = nv50_vm_map;
+       priv->base.map_sg = nv50_vm_map_sg;
+       priv->base.unmap = nv50_vm_unmap;
+       priv->base.flush = nv50_vm_flush;
+       return 0;
+}
+
+struct nouveau_oclass
+nv50_mmu_oclass = {
+       .handle = NV_SUBDEV(MMU, 0x50),
+       .ofuncs = &(struct nouveau_ofuncs) {
+               .ctor = nv50_mmu_ctor,
+               .dtor = _nouveau_mmu_dtor,
+               .init = _nouveau_mmu_init,
+               .fini = _nouveau_mmu_fini,
+       },
+};
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nvc0.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nvc0.c
new file mode 100644 (file)
index 0000000..bd695c5
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2010 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Ben Skeggs
+ */
+
+#include <core/device.h>
+#include <core/gpuobj.h>
+
+#include <subdev/timer.h>
+#include <subdev/fb.h>
+#include <subdev/mmu.h>
+#include <subdev/ltc.h>
+#include <subdev/bar.h>
+
+struct nvc0_mmu_priv {
+       struct nouveau_mmu base;
+};
+
+
+/* Map from compressed to corresponding uncompressed storage type.
+ * The value 0xff represents an invalid storage type.
+ */
+const u8 nvc0_pte_storage_type_map[256] =
+{
+       0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0xff, 0x01, /* 0x00 */
+       0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, /* 0x10 */
+       0x11, 0x11, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x26, 0x27, /* 0x20 */
+       0x28, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30 */
+       0xff, 0xff, 0x26, 0x27, 0x28, 0x29, 0x26, 0x27,
+       0x28, 0x29, 0xff, 0xff, 0xff, 0xff, 0x46, 0xff, /* 0x40 */
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, /* 0x50 */
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60 */
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70 */
+       0xff, 0xff, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x7b, /* 0x80 */
+       0x7b, 0x7b, 0xff, 0x8b, 0x8c, 0x8d, 0x8e, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90 */
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0x8b, 0x8c, 0x8d, 0x8e, 0xa7, /* 0xa0 */
+       0xa8, 0xa9, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0 */
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7,
+       0xa8, 0xa9, 0xaa, 0xc3, 0xff, 0xff, 0xff, 0xff, /* 0xc0 */
+       0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xc3, 0xc3,
+       0xc3, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0 */
+       0xfe, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe,
+       0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, /* 0xe0 */
+       0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xff,
+       0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xf0 */
+       0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfd, 0xfe, 0xff
+};
+
+
+static void
+nvc0_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 index,
+               struct nouveau_gpuobj *pgt[2])
+{
+       u32 pde[2] = { 0, 0 };
+
+       if (pgt[0])
+               pde[1] = 0x00000001 | (pgt[0]->addr >> 8);
+       if (pgt[1])
+               pde[0] = 0x00000001 | (pgt[1]->addr >> 8);
+
+       nv_wo32(pgd, (index * 8) + 0, pde[0]);
+       nv_wo32(pgd, (index * 8) + 4, pde[1]);
+}
+
+static inline u64
+nvc0_vm_addr(struct nouveau_vma *vma, u64 phys, u32 memtype, u32 target)
+{
+       phys >>= 8;
+
+       phys |= 0x00000001; /* present */
+       if (vma->access & NV_MEM_ACCESS_SYS)
+               phys |= 0x00000002;
+
+       phys |= ((u64)target  << 32);
+       phys |= ((u64)memtype << 36);
+
+       return phys;
+}
+
+static void
+nvc0_vm_map(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+           struct nouveau_mem *mem, u32 pte, u32 cnt, u64 phys, u64 delta)
+{
+       u64 next = 1 << (vma->node->type - 8);
+
+       phys  = nvc0_vm_addr(vma, phys, mem->memtype, 0);
+       pte <<= 3;
+
+       if (mem->tag) {
+               struct nouveau_ltc *ltc = nouveau_ltc(vma->vm->mmu);
+               u32 tag = mem->tag->offset + (delta >> 17);
+               phys |= (u64)tag << (32 + 12);
+               next |= (u64)1   << (32 + 12);
+               ltc->tags_clear(ltc, tag, cnt);
+       }
+
+       while (cnt--) {
+               nv_wo32(pgt, pte + 0, lower_32_bits(phys));
+               nv_wo32(pgt, pte + 4, upper_32_bits(phys));
+               phys += next;
+               pte  += 8;
+       }
+}
+
+static void
+nvc0_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
+              struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
+{
+       u32 target = (vma->access & NV_MEM_ACCESS_NOSNOOP) ? 7 : 5;
+       /* compressed storage types are invalid for system memory */
+       u32 memtype = nvc0_pte_storage_type_map[mem->memtype & 0xff];
+
+       pte <<= 3;
+       while (cnt--) {
+               u64 phys = nvc0_vm_addr(vma, *list++, memtype, target);
+               nv_wo32(pgt, pte + 0, lower_32_bits(phys));
+               nv_wo32(pgt, pte + 4, upper_32_bits(phys));
+               pte += 8;
+       }
+}
+
+static void
+nvc0_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
+{
+       pte <<= 3;
+       while (cnt--) {
+               nv_wo32(pgt, pte + 0, 0x00000000);
+               nv_wo32(pgt, pte + 4, 0x00000000);
+               pte += 8;
+       }
+}
+
+static void
+nvc0_vm_flush(struct nouveau_vm *vm)
+{
+       struct nvc0_mmu_priv *priv = (void *)vm->mmu;
+       struct nouveau_bar *bar = nouveau_bar(priv);
+       struct nouveau_vm_pgd *vpgd;
+       u32 type;
+
+       bar->flush(bar);
+
+       type = 0x00000001; /* PAGE_ALL */
+       if (atomic_read(&vm->engref[NVDEV_SUBDEV_BAR]))
+               type |= 0x00000004; /* HUB_ONLY */
+
+       mutex_lock(&nv_subdev(priv)->mutex);
+       list_for_each_entry(vpgd, &vm->pgd_list, head) {
+               /* looks like maybe a "free flush slots" counter, the
+                * faster you write to 0x100cbc to more it decreases
+                */
+               if (!nv_wait_ne(priv, 0x100c80, 0x00ff0000, 0x00000000)) {
+                       nv_error(priv, "vm timeout 0: 0x%08x %d\n",
+                                nv_rd32(priv, 0x100c80), type);
+               }
+
+               nv_wr32(priv, 0x100cb8, vpgd->obj->addr >> 8);
+               nv_wr32(priv, 0x100cbc, 0x80000000 | type);
+
+               /* wait for flush to be queued? */
+               if (!nv_wait(priv, 0x100c80, 0x00008000, 0x00008000)) {
+                       nv_error(priv, "vm timeout 1: 0x%08x %d\n",
+                                nv_rd32(priv, 0x100c80), type);
+               }
+       }
+       mutex_unlock(&nv_subdev(priv)->mutex);
+}
+
+static int
+nvc0_vm_create(struct nouveau_mmu *mmu, u64 offset, u64 length,
+              u64 mm_offset, struct nouveau_vm **pvm)
+{
+       return nouveau_vm_create(mmu, offset, length, mm_offset, 4096, pvm);
+}
+
+static int
+nvc0_mmu_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
+               struct nouveau_oclass *oclass, void *data, u32 size,
+               struct nouveau_object **pobject)
+{
+       struct nvc0_mmu_priv *priv;
+       int ret;
+
+       ret = nouveau_mmu_create(parent, engine, oclass, "VM", "vm", &priv);
+       *pobject = nv_object(priv);
+       if (ret)
+               return ret;
+
+       priv->base.limit = 1ULL << 40;
+       priv->base.dma_bits = 40;
+       priv->base.pgt_bits  = 27 - 12;
+       priv->base.spg_shift = 12;
+       priv->base.lpg_shift = 17;
+       priv->base.create = nvc0_vm_create;
+       priv->base.map_pgt = nvc0_vm_map_pgt;
+       priv->base.map = nvc0_vm_map;
+       priv->base.map_sg = nvc0_vm_map_sg;
+       priv->base.unmap = nvc0_vm_unmap;
+       priv->base.flush = nvc0_vm_flush;
+       return 0;
+}
+
+struct nouveau_oclass
+nvc0_mmu_oclass = {
+       .handle = NV_SUBDEV(MMU, 0xc0),
+       .ofuncs = &(struct nouveau_ofuncs) {
+               .ctor = nvc0_mmu_ctor,
+               .dtor = _nouveau_mmu_dtor,
+               .init = _nouveau_mmu_init,
+               .fini = _nouveau_mmu_fini,
+       },
+};
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/vm/Kbuild b/drivers/gpu/drm/nouveau/nvkm/subdev/vm/Kbuild
deleted file mode 100644 (file)
index b0290c0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-nvkm-y += nvkm/subdev/vm/base.o
-nvkm-y += nvkm/subdev/vm/nv04.o
-nvkm-y += nvkm/subdev/vm/nv41.o
-nvkm-y += nvkm/subdev/vm/nv44.o
-nvkm-y += nvkm/subdev/vm/nv50.o
-nvkm-y += nvkm/subdev/vm/nvc0.o
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/vm/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/vm/base.c
deleted file mode 100644 (file)
index f75a683..0000000
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * Copyright 2010 Red Hat Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: Ben Skeggs
- */
-
-#include <core/gpuobj.h>
-#include <core/mm.h>
-
-#include <subdev/fb.h>
-#include <subdev/vm.h>
-
-void
-nouveau_vm_map_at(struct nouveau_vma *vma, u64 delta, struct nouveau_mem *node)
-{
-       struct nouveau_vm *vm = vma->vm;
-       struct nouveau_vmmgr *vmm = vm->vmm;
-       struct nouveau_mm_node *r;
-       int big = vma->node->type != vmm->spg_shift;
-       u32 offset = vma->node->offset + (delta >> 12);
-       u32 bits = vma->node->type - 12;
-       u32 pde  = (offset >> vmm->pgt_bits) - vm->fpde;
-       u32 pte  = (offset & ((1 << vmm->pgt_bits) - 1)) >> bits;
-       u32 max  = 1 << (vmm->pgt_bits - bits);
-       u32 end, len;
-
-       delta = 0;
-       list_for_each_entry(r, &node->regions, rl_entry) {
-               u64 phys = (u64)r->offset << 12;
-               u32 num  = r->length >> bits;
-
-               while (num) {
-                       struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
-
-                       end = (pte + num);
-                       if (unlikely(end >= max))
-                               end = max;
-                       len = end - pte;
-
-                       vmm->map(vma, pgt, node, pte, len, phys, delta);
-
-                       num -= len;
-                       pte += len;
-                       if (unlikely(end >= max)) {
-                               phys += len << (bits + 12);
-                               pde++;
-                               pte = 0;
-                       }
-
-                       delta += (u64)len << vma->node->type;
-               }
-       }
-
-       vmm->flush(vm);
-}
-
-static void
-nouveau_vm_map_sg_table(struct nouveau_vma *vma, u64 delta, u64 length,
-                       struct nouveau_mem *mem)
-{
-       struct nouveau_vm *vm = vma->vm;
-       struct nouveau_vmmgr *vmm = vm->vmm;
-       int big = vma->node->type != vmm->spg_shift;
-       u32 offset = vma->node->offset + (delta >> 12);
-       u32 bits = vma->node->type - 12;
-       u32 num  = length >> vma->node->type;
-       u32 pde  = (offset >> vmm->pgt_bits) - vm->fpde;
-       u32 pte  = (offset & ((1 << vmm->pgt_bits) - 1)) >> bits;
-       u32 max  = 1 << (vmm->pgt_bits - bits);
-       unsigned m, sglen;
-       u32 end, len;
-       int i;
-       struct scatterlist *sg;
-
-       for_each_sg(mem->sg->sgl, sg, mem->sg->nents, i) {
-               struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
-               sglen = sg_dma_len(sg) >> PAGE_SHIFT;
-
-               end = pte + sglen;
-               if (unlikely(end >= max))
-                       end = max;
-               len = end - pte;
-
-               for (m = 0; m < len; m++) {
-                       dma_addr_t addr = sg_dma_address(sg) + (m << PAGE_SHIFT);
-
-                       vmm->map_sg(vma, pgt, mem, pte, 1, &addr);
-                       num--;
-                       pte++;
-
-                       if (num == 0)
-                               goto finish;
-               }
-               if (unlikely(end >= max)) {
-                       pde++;
-                       pte = 0;
-               }
-               if (m < sglen) {
-                       for (; m < sglen; m++) {
-                               dma_addr_t addr = sg_dma_address(sg) + (m << PAGE_SHIFT);
-
-                               vmm->map_sg(vma, pgt, mem, pte, 1, &addr);
-                               num--;
-                               pte++;
-                               if (num == 0)
-                                       goto finish;
-                       }
-               }
-
-       }
-finish:
-       vmm->flush(vm);
-}
-
-static void
-nouveau_vm_map_sg(struct nouveau_vma *vma, u64 delta, u64 length,
-                 struct nouveau_mem *mem)
-{
-       struct nouveau_vm *vm = vma->vm;
-       struct nouveau_vmmgr *vmm = vm->vmm;
-       dma_addr_t *list = mem->pages;
-       int big = vma->node->type != vmm->spg_shift;
-       u32 offset = vma->node->offset + (delta >> 12);
-       u32 bits = vma->node->type - 12;
-       u32 num  = length >> vma->node->type;
-       u32 pde  = (offset >> vmm->pgt_bits) - vm->fpde;
-       u32 pte  = (offset & ((1 << vmm->pgt_bits) - 1)) >> bits;
-       u32 max  = 1 << (vmm->pgt_bits - bits);
-       u32 end, len;
-
-       while (num) {
-               struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
-
-               end = (pte + num);
-               if (unlikely(end >= max))
-                       end = max;
-               len = end - pte;
-
-               vmm->map_sg(vma, pgt, mem, pte, len, list);
-
-               num  -= len;
-               pte  += len;
-               list += len;
-               if (unlikely(end >= max)) {
-                       pde++;
-                       pte = 0;
-               }
-       }
-
-       vmm->flush(vm);
-}
-
-void
-nouveau_vm_map(struct nouveau_vma *vma, struct nouveau_mem *node)
-{
-       if (node->sg)
-               nouveau_vm_map_sg_table(vma, 0, node->size << 12, node);
-       else
-       if (node->pages)
-               nouveau_vm_map_sg(vma, 0, node->size << 12, node);
-       else
-               nouveau_vm_map_at(vma, 0, node);
-}
-
-void
-nouveau_vm_unmap_at(struct nouveau_vma *vma, u64 delta, u64 length)
-{
-       struct nouveau_vm *vm = vma->vm;
-       struct nouveau_vmmgr *vmm = vm->vmm;
-       int big = vma->node->type != vmm->spg_shift;
-       u32 offset = vma->node->offset + (delta >> 12);
-       u32 bits = vma->node->type - 12;
-       u32 num  = length >> vma->node->type;
-       u32 pde  = (offset >> vmm->pgt_bits) - vm->fpde;
-       u32 pte  = (offset & ((1 << vmm->pgt_bits) - 1)) >> bits;
-       u32 max  = 1 << (vmm->pgt_bits - bits);
-       u32 end, len;
-
-       while (num) {
-               struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
-
-               end = (pte + num);
-               if (unlikely(end >= max))
-                       end = max;
-               len = end - pte;
-
-               vmm->unmap(pgt, pte, len);
-
-               num -= len;
-               pte += len;
-               if (unlikely(end >= max)) {
-                       pde++;
-                       pte = 0;
-               }
-       }
-
-       vmm->flush(vm);
-}
-
-void
-nouveau_vm_unmap(struct nouveau_vma *vma)
-{
-       nouveau_vm_unmap_at(vma, 0, (u64)vma->node->length << 12);
-}
-
-static void
-nouveau_vm_unmap_pgt(struct nouveau_vm *vm, int big, u32 fpde, u32 lpde)
-{
-       struct nouveau_vmmgr *vmm = vm->vmm;
-       struct nouveau_vm_pgd *vpgd;
-       struct nouveau_vm_pgt *vpgt;
-       struct nouveau_gpuobj *pgt;
-       u32 pde;
-
-       for (pde = fpde; pde <= lpde; pde++) {
-               vpgt = &vm->pgt[pde - vm->fpde];
-               if (--vpgt->refcount[big])
-                       continue;
-
-               pgt = vpgt->obj[big];
-               vpgt->obj[big] = NULL;
-
-               list_for_each_entry(vpgd, &vm->pgd_list, head) {
-                       vmm->map_pgt(vpgd->obj, pde, vpgt->obj);
-               }
-
-               mutex_unlock(&nv_subdev(vmm)->mutex);
-               nouveau_gpuobj_ref(NULL, &pgt);
-               mutex_lock(&nv_subdev(vmm)->mutex);
-       }
-}
-
-static int
-nouveau_vm_map_pgt(struct nouveau_vm *vm, u32 pde, u32 type)
-{
-       struct nouveau_vmmgr *vmm = vm->vmm;
-       struct nouveau_vm_pgt *vpgt = &vm->pgt[pde - vm->fpde];
-       struct nouveau_vm_pgd *vpgd;
-       struct nouveau_gpuobj *pgt;
-       int big = (type != vmm->spg_shift);
-       u32 pgt_size;
-       int ret;
-
-       pgt_size  = (1 << (vmm->pgt_bits + 12)) >> type;
-       pgt_size *= 8;
-
-       mutex_unlock(&nv_subdev(vmm)->mutex);
-       ret = nouveau_gpuobj_new(nv_object(vm->vmm), NULL, pgt_size, 0x1000,
-                                NVOBJ_FLAG_ZERO_ALLOC, &pgt);
-       mutex_lock(&nv_subdev(vmm)->mutex);
-       if (unlikely(ret))
-               return ret;
-
-       /* someone beat us to filling the PDE while we didn't have the lock */
-       if (unlikely(vpgt->refcount[big]++)) {
-               mutex_unlock(&nv_subdev(vmm)->mutex);
-               nouveau_gpuobj_ref(NULL, &pgt);
-               mutex_lock(&nv_subdev(vmm)->mutex);
-               return 0;
-       }
-
-       vpgt->obj[big] = pgt;
-       list_for_each_entry(vpgd, &vm->pgd_list, head) {
-               vmm->map_pgt(vpgd->obj, pde, vpgt->obj);
-       }
-
-       return 0;
-}
-
-int
-nouveau_vm_get(struct nouveau_vm *vm, u64 size, u32 page_shift,
-              u32 access, struct nouveau_vma *vma)
-{
-       struct nouveau_vmmgr *vmm = vm->vmm;
-       u32 align = (1 << page_shift) >> 12;
-       u32 msize = size >> 12;
-       u32 fpde, lpde, pde;
-       int ret;
-
-       mutex_lock(&nv_subdev(vmm)->mutex);
-       ret = nouveau_mm_head(&vm->mm, 0, page_shift, msize, msize, align,
-                            &vma->node);
-       if (unlikely(ret != 0)) {
-               mutex_unlock(&nv_subdev(vmm)->mutex);
-               return ret;
-       }
-
-       fpde = (vma->node->offset >> vmm->pgt_bits);
-       lpde = (vma->node->offset + vma->node->length - 1) >> vmm->pgt_bits;
-
-       for (pde = fpde; pde <= lpde; pde++) {
-               struct nouveau_vm_pgt *vpgt = &vm->pgt[pde - vm->fpde];
-               int big = (vma->node->type != vmm->spg_shift);
-
-               if (likely(vpgt->refcount[big])) {
-                       vpgt->refcount[big]++;
-                       continue;
-               }
-
-               ret = nouveau_vm_map_pgt(vm, pde, vma->node->type);
-               if (ret) {
-                       if (pde != fpde)
-                               nouveau_vm_unmap_pgt(vm, big, fpde, pde - 1);
-                       nouveau_mm_free(&vm->mm, &vma->node);
-                       mutex_unlock(&nv_subdev(vmm)->mutex);
-                       return ret;
-               }
-       }
-       mutex_unlock(&nv_subdev(vmm)->mutex);
-
-       vma->vm = NULL;
-       nouveau_vm_ref(vm, &vma->vm, NULL);
-       vma->offset = (u64)vma->node->offset << 12;
-       vma->access = access;
-       return 0;
-}
-
-void
-nouveau_vm_put(struct nouveau_vma *vma)
-{
-       struct nouveau_vm *vm = vma->vm;
-       struct nouveau_vmmgr *vmm = vm->vmm;
-       u32 fpde, lpde;
-
-       if (unlikely(vma->node == NULL))
-               return;
-       fpde = (vma->node->offset >> vmm->pgt_bits);
-       lpde = (vma->node->offset + vma->node->length - 1) >> vmm->pgt_bits;
-
-       mutex_lock(&nv_subdev(vmm)->mutex);
-       nouveau_vm_unmap_pgt(vm, vma->node->type != vmm->spg_shift, fpde, lpde);
-       nouveau_mm_free(&vm->mm, &vma->node);
-       mutex_unlock(&nv_subdev(vmm)->mutex);
-
-       nouveau_vm_ref(NULL, &vma->vm, NULL);
-}
-
-int
-nouveau_vm_create(struct nouveau_vmmgr *vmm, u64 offset, u64 length,
-                 u64 mm_offset, u32 block, struct nouveau_vm **pvm)
-{
-       struct nouveau_vm *vm;
-       u64 mm_length = (offset + length) - mm_offset;
-       int ret;
-
-       vm = kzalloc(sizeof(*vm), GFP_KERNEL);
-       if (!vm)
-               return -ENOMEM;
-
-       INIT_LIST_HEAD(&vm->pgd_list);
-       vm->vmm = vmm;
-       kref_init(&vm->refcount);
-       vm->fpde = offset >> (vmm->pgt_bits + 12);
-       vm->lpde = (offset + length - 1) >> (vmm->pgt_bits + 12);
-
-       vm->pgt  = vzalloc((vm->lpde - vm->fpde + 1) * sizeof(*vm->pgt));
-       if (!vm->pgt) {
-               kfree(vm);
-               return -ENOMEM;
-       }
-
-       ret = nouveau_mm_init(&vm->mm, mm_offset >> 12, mm_length >> 12,
-                             block >> 12);
-       if (ret) {
-               vfree(vm->pgt);
-               kfree(vm);
-               return ret;
-       }
-
-       *pvm = vm;
-
-       return 0;
-}
-
-int
-nouveau_vm_new(struct nouveau_device *device, u64 offset, u64 length,
-              u64 mm_offset, struct nouveau_vm **pvm)
-{
-       struct nouveau_vmmgr *vmm = nouveau_vmmgr(device);
-       return vmm->create(vmm, offset, length, mm_offset, pvm);
-}
-
-static int
-nouveau_vm_link(struct nouveau_vm *vm, struct nouveau_gpuobj *pgd)
-{
-       struct nouveau_vmmgr *vmm = vm->vmm;
-       struct nouveau_vm_pgd *vpgd;
-       int i;
-
-       if (!pgd)
-               return 0;
-
-       vpgd = kzalloc(sizeof(*vpgd), GFP_KERNEL);
-       if (!vpgd)
-               return -ENOMEM;
-
-       nouveau_gpuobj_ref(pgd, &vpgd->obj);
-
-       mutex_lock(&nv_subdev(vmm)->mutex);
-       for (i = vm->fpde; i <= vm->lpde; i++)
-               vmm->map_pgt(pgd, i, vm->pgt[i - vm->fpde].obj);
-       list_add(&vpgd->head, &vm->pgd_list);
-       mutex_unlock(&nv_subdev(vmm)->mutex);
-       return 0;
-}
-
-static void
-nouveau_vm_unlink(struct nouveau_vm *vm, struct nouveau_gpuobj *mpgd)
-{
-       struct nouveau_vmmgr *vmm = vm->vmm;
-       struct nouveau_vm_pgd *vpgd, *tmp;
-       struct nouveau_gpuobj *pgd = NULL;
-
-       if (!mpgd)
-               return;
-
-       mutex_lock(&nv_subdev(vmm)->mutex);
-       list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) {
-               if (vpgd->obj == mpgd) {
-                       pgd = vpgd->obj;
-                       list_del(&vpgd->head);
-                       kfree(vpgd);
-                       break;
-               }
-       }
-       mutex_unlock(&nv_subdev(vmm)->mutex);
-
-       nouveau_gpuobj_ref(NULL, &pgd);
-}
-
-static void
-nouveau_vm_del(struct kref *kref)
-{
-       struct nouveau_vm *vm = container_of(kref, typeof(*vm), refcount);
-       struct nouveau_vm_pgd *vpgd, *tmp;
-
-       list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) {
-               nouveau_vm_unlink(vm, vpgd->obj);
-       }
-
-       nouveau_mm_fini(&vm->mm);
-       vfree(vm->pgt);
-       kfree(vm);
-}
-
-int
-nouveau_vm_ref(struct nouveau_vm *ref, struct nouveau_vm **ptr,
-              struct nouveau_gpuobj *pgd)
-{
-       if (ref) {
-               int ret = nouveau_vm_link(ref, pgd);
-               if (ret)
-                       return ret;
-
-               kref_get(&ref->refcount);
-       }
-
-       if (*ptr) {
-               nouveau_vm_unlink(*ptr, pgd);
-               kref_put(&(*ptr)->refcount, nouveau_vm_del);
-       }
-
-       *ptr = ref;
-       return 0;
-}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv04.c b/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv04.c
deleted file mode 100644 (file)
index ed45437..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright 2012 Red Hat Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: Ben Skeggs
- */
-
-#include <core/gpuobj.h>
-
-#include "nv04.h"
-
-#define NV04_PDMA_SIZE (128 * 1024 * 1024)
-#define NV04_PDMA_PAGE (  4 * 1024)
-
-/*******************************************************************************
- * VM map/unmap callbacks
- ******************************************************************************/
-
-static void
-nv04_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
-              struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
-{
-       pte = 0x00008 + (pte * 4);
-       while (cnt) {
-               u32 page = PAGE_SIZE / NV04_PDMA_PAGE;
-               u32 phys = (u32)*list++;
-               while (cnt && page--) {
-                       nv_wo32(pgt, pte, phys | 3);
-                       phys += NV04_PDMA_PAGE;
-                       pte += 4;
-                       cnt -= 1;
-               }
-       }
-}
-
-static void
-nv04_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
-{
-       pte = 0x00008 + (pte * 4);
-       while (cnt--) {
-               nv_wo32(pgt, pte, 0x00000000);
-               pte += 4;
-       }
-}
-
-static void
-nv04_vm_flush(struct nouveau_vm *vm)
-{
-}
-
-/*******************************************************************************
- * VM object
- ******************************************************************************/
-
-int
-nv04_vm_create(struct nouveau_vmmgr *vmm, u64 offset, u64 length, u64 mmstart,
-              struct nouveau_vm **pvm)
-{
-       return -EINVAL;
-}
-
-/*******************************************************************************
- * VMMGR subdev
- ******************************************************************************/
-
-static int
-nv04_vmmgr_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
-               struct nouveau_oclass *oclass, void *data, u32 size,
-               struct nouveau_object **pobject)
-{
-       struct nv04_vmmgr_priv *priv;
-       struct nouveau_gpuobj *dma;
-       int ret;
-
-       ret = nouveau_vmmgr_create(parent, engine, oclass, "PCIGART",
-                                  "pcigart", &priv);
-       *pobject = nv_object(priv);
-       if (ret)
-               return ret;
-
-       priv->base.create = nv04_vm_create;
-       priv->base.limit = NV04_PDMA_SIZE;
-       priv->base.dma_bits = 32;
-       priv->base.pgt_bits = 32 - 12;
-       priv->base.spg_shift = 12;
-       priv->base.lpg_shift = 12;
-       priv->base.map_sg = nv04_vm_map_sg;
-       priv->base.unmap = nv04_vm_unmap;
-       priv->base.flush = nv04_vm_flush;
-
-       ret = nouveau_vm_create(&priv->base, 0, NV04_PDMA_SIZE, 0, 4096,
-                               &priv->vm);
-       if (ret)
-               return ret;
-
-       ret = nouveau_gpuobj_new(nv_object(priv), NULL,
-                                (NV04_PDMA_SIZE / NV04_PDMA_PAGE) * 4 +
-                                8, 16, NVOBJ_FLAG_ZERO_ALLOC,
-                                &priv->vm->pgt[0].obj[0]);
-       dma = priv->vm->pgt[0].obj[0];
-       priv->vm->pgt[0].refcount[0] = 1;
-       if (ret)
-               return ret;
-
-       nv_wo32(dma, 0x00000, 0x0002103d); /* PCI, RW, PT, !LN */
-       nv_wo32(dma, 0x00004, NV04_PDMA_SIZE - 1);
-       return 0;
-}
-
-void
-nv04_vmmgr_dtor(struct nouveau_object *object)
-{
-       struct nv04_vmmgr_priv *priv = (void *)object;
-       if (priv->vm) {
-               nouveau_gpuobj_ref(NULL, &priv->vm->pgt[0].obj[0]);
-               nouveau_vm_ref(NULL, &priv->vm, NULL);
-       }
-       if (priv->nullp) {
-               pci_free_consistent(nv_device(priv)->pdev, 16 * 1024,
-                                   priv->nullp, priv->null);
-       }
-       nouveau_vmmgr_destroy(&priv->base);
-}
-
-struct nouveau_oclass
-nv04_vmmgr_oclass = {
-       .handle = NV_SUBDEV(VM, 0x04),
-       .ofuncs = &(struct nouveau_ofuncs) {
-               .ctor = nv04_vmmgr_ctor,
-               .dtor = nv04_vmmgr_dtor,
-               .init = _nouveau_vmmgr_init,
-               .fini = _nouveau_vmmgr_fini,
-       },
-};
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv04.h b/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv04.h
deleted file mode 100644 (file)
index ec42d4b..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef __NV04_VMMGR_PRIV__
-#define __NV04_VMMGR_PRIV__
-
-#include <subdev/vm.h>
-
-struct nv04_vmmgr_priv {
-       struct nouveau_vmmgr base;
-       struct nouveau_vm *vm;
-       dma_addr_t null;
-       void *nullp;
-};
-
-static inline struct nv04_vmmgr_priv *
-nv04_vmmgr(void *obj)
-{
-       return (void *)nouveau_vmmgr(obj);
-}
-
-#endif
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv41.c b/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv41.c
deleted file mode 100644 (file)
index 064c762..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright 2012 Red Hat Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: Ben Skeggs
- */
-
-#include <core/gpuobj.h>
-#include <core/option.h>
-
-#include <subdev/timer.h>
-#include <subdev/vm.h>
-
-#include "nv04.h"
-
-#define NV41_GART_SIZE (512 * 1024 * 1024)
-#define NV41_GART_PAGE (  4 * 1024)
-
-/*******************************************************************************
- * VM map/unmap callbacks
- ******************************************************************************/
-
-static void
-nv41_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
-              struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
-{
-       pte = pte * 4;
-       while (cnt) {
-               u32 page = PAGE_SIZE / NV41_GART_PAGE;
-               u64 phys = (u64)*list++;
-               while (cnt && page--) {
-                       nv_wo32(pgt, pte, (phys >> 7) | 1);
-                       phys += NV41_GART_PAGE;
-                       pte += 4;
-                       cnt -= 1;
-               }
-       }
-}
-
-static void
-nv41_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
-{
-       pte = pte * 4;
-       while (cnt--) {
-               nv_wo32(pgt, pte, 0x00000000);
-               pte += 4;
-       }
-}
-
-static void
-nv41_vm_flush(struct nouveau_vm *vm)
-{
-       struct nv04_vmmgr_priv *priv = (void *)vm->vmm;
-
-       mutex_lock(&nv_subdev(priv)->mutex);
-       nv_wr32(priv, 0x100810, 0x00000022);
-       if (!nv_wait(priv, 0x100810, 0x00000020, 0x00000020)) {
-               nv_warn(priv, "flush timeout, 0x%08x\n",
-                       nv_rd32(priv, 0x100810));
-       }
-       nv_wr32(priv, 0x100810, 0x00000000);
-       mutex_unlock(&nv_subdev(priv)->mutex);
-}
-
-/*******************************************************************************
- * VMMGR subdev
- ******************************************************************************/
-
-static int
-nv41_vmmgr_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
-               struct nouveau_oclass *oclass, void *data, u32 size,
-               struct nouveau_object **pobject)
-{
-       struct nouveau_device *device = nv_device(parent);
-       struct nv04_vmmgr_priv *priv;
-       int ret;
-
-       if (pci_find_capability(device->pdev, PCI_CAP_ID_AGP) ||
-           !nouveau_boolopt(device->cfgopt, "NvPCIE", true)) {
-               return nouveau_object_ctor(parent, engine, &nv04_vmmgr_oclass,
-                                          data, size, pobject);
-       }
-
-       ret = nouveau_vmmgr_create(parent, engine, oclass, "PCIEGART",
-                                  "pciegart", &priv);
-       *pobject = nv_object(priv);
-       if (ret)
-               return ret;
-
-       priv->base.create = nv04_vm_create;
-       priv->base.limit = NV41_GART_SIZE;
-       priv->base.dma_bits = 39;
-       priv->base.pgt_bits = 32 - 12;
-       priv->base.spg_shift = 12;
-       priv->base.lpg_shift = 12;
-       priv->base.map_sg = nv41_vm_map_sg;
-       priv->base.unmap = nv41_vm_unmap;
-       priv->base.flush = nv41_vm_flush;
-
-       ret = nouveau_vm_create(&priv->base, 0, NV41_GART_SIZE, 0, 4096,
-                               &priv->vm);
-       if (ret)
-               return ret;
-
-       ret = nouveau_gpuobj_new(nv_object(priv), NULL,
-                               (NV41_GART_SIZE / NV41_GART_PAGE) * 4,
-                                16, NVOBJ_FLAG_ZERO_ALLOC,
-                                &priv->vm->pgt[0].obj[0]);
-       priv->vm->pgt[0].refcount[0] = 1;
-       if (ret)
-               return ret;
-
-       return 0;
-}
-
-static int
-nv41_vmmgr_init(struct nouveau_object *object)
-{
-       struct nv04_vmmgr_priv *priv = (void *)object;
-       struct nouveau_gpuobj *dma = priv->vm->pgt[0].obj[0];
-       int ret;
-
-       ret = nouveau_vmmgr_init(&priv->base);
-       if (ret)
-               return ret;
-
-       nv_wr32(priv, 0x100800, dma->addr | 0x00000002);
-       nv_mask(priv, 0x10008c, 0x00000100, 0x00000100);
-       nv_wr32(priv, 0x100820, 0x00000000);
-       return 0;
-}
-
-struct nouveau_oclass
-nv41_vmmgr_oclass = {
-       .handle = NV_SUBDEV(VM, 0x41),
-       .ofuncs = &(struct nouveau_ofuncs) {
-               .ctor = nv41_vmmgr_ctor,
-               .dtor = nv04_vmmgr_dtor,
-               .init = nv41_vmmgr_init,
-               .fini = _nouveau_vmmgr_fini,
-       },
-};
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv44.c b/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv44.c
deleted file mode 100644 (file)
index fae1f67..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright 2012 Red Hat Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: Ben Skeggs
- */
-
-#include <core/gpuobj.h>
-#include <core/option.h>
-
-#include <subdev/timer.h>
-#include <subdev/vm.h>
-
-#include "nv04.h"
-
-#define NV44_GART_SIZE (512 * 1024 * 1024)
-#define NV44_GART_PAGE (  4 * 1024)
-
-/*******************************************************************************
- * VM map/unmap callbacks
- ******************************************************************************/
-
-static void
-nv44_vm_fill(struct nouveau_gpuobj *pgt, dma_addr_t null,
-            dma_addr_t *list, u32 pte, u32 cnt)
-{
-       u32 base = (pte << 2) & ~0x0000000f;
-       u32 tmp[4];
-
-       tmp[0] = nv_ro32(pgt, base + 0x0);
-       tmp[1] = nv_ro32(pgt, base + 0x4);
-       tmp[2] = nv_ro32(pgt, base + 0x8);
-       tmp[3] = nv_ro32(pgt, base + 0xc);
-
-       while (cnt--) {
-               u32 addr = list ? (*list++ >> 12) : (null >> 12);
-               switch (pte++ & 0x3) {
-               case 0:
-                       tmp[0] &= ~0x07ffffff;
-                       tmp[0] |= addr;
-                       break;
-               case 1:
-                       tmp[0] &= ~0xf8000000;
-                       tmp[0] |= addr << 27;
-                       tmp[1] &= ~0x003fffff;
-                       tmp[1] |= addr >> 5;
-                       break;
-               case 2:
-                       tmp[1] &= ~0xffc00000;
-                       tmp[1] |= addr << 22;
-                       tmp[2] &= ~0x0001ffff;
-                       tmp[2] |= addr >> 10;
-                       break;
-               case 3:
-                       tmp[2] &= ~0xfffe0000;
-                       tmp[2] |= addr << 17;
-                       tmp[3] &= ~0x00000fff;
-                       tmp[3] |= addr >> 15;
-                       break;
-               }
-       }
-
-       nv_wo32(pgt, base + 0x0, tmp[0]);
-       nv_wo32(pgt, base + 0x4, tmp[1]);
-       nv_wo32(pgt, base + 0x8, tmp[2]);
-       nv_wo32(pgt, base + 0xc, tmp[3] | 0x40000000);
-}
-
-static void
-nv44_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
-              struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
-{
-       struct nv04_vmmgr_priv *priv = (void *)vma->vm->vmm;
-       u32 tmp[4];
-       int i;
-
-       if (pte & 3) {
-               u32  max = 4 - (pte & 3);
-               u32 part = (cnt > max) ? max : cnt;
-               nv44_vm_fill(pgt, priv->null, list, pte, part);
-               pte  += part;
-               list += part;
-               cnt  -= part;
-       }
-
-       while (cnt >= 4) {
-               for (i = 0; i < 4; i++)
-                       tmp[i] = *list++ >> 12;
-               nv_wo32(pgt, pte++ * 4, tmp[0] >>  0 | tmp[1] << 27);
-               nv_wo32(pgt, pte++ * 4, tmp[1] >>  5 | tmp[2] << 22);
-               nv_wo32(pgt, pte++ * 4, tmp[2] >> 10 | tmp[3] << 17);
-               nv_wo32(pgt, pte++ * 4, tmp[3] >> 15 | 0x40000000);
-               cnt -= 4;
-       }
-
-       if (cnt)
-               nv44_vm_fill(pgt, priv->null, list, pte, cnt);
-}
-
-static void
-nv44_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
-{
-       struct nv04_vmmgr_priv *priv = (void *)nouveau_vmmgr(pgt);
-
-       if (pte & 3) {
-               u32  max = 4 - (pte & 3);
-               u32 part = (cnt > max) ? max : cnt;
-               nv44_vm_fill(pgt, priv->null, NULL, pte, part);
-               pte  += part;
-               cnt  -= part;
-       }
-
-       while (cnt >= 4) {
-               nv_wo32(pgt, pte++ * 4, 0x00000000);
-               nv_wo32(pgt, pte++ * 4, 0x00000000);
-               nv_wo32(pgt, pte++ * 4, 0x00000000);
-               nv_wo32(pgt, pte++ * 4, 0x00000000);
-               cnt -= 4;
-       }
-
-       if (cnt)
-               nv44_vm_fill(pgt, priv->null, NULL, pte, cnt);
-}
-
-static void
-nv44_vm_flush(struct nouveau_vm *vm)
-{
-       struct nv04_vmmgr_priv *priv = (void *)vm->vmm;
-       nv_wr32(priv, 0x100814, priv->base.limit - NV44_GART_PAGE);
-       nv_wr32(priv, 0x100808, 0x00000020);
-       if (!nv_wait(priv, 0x100808, 0x00000001, 0x00000001))
-               nv_error(priv, "timeout: 0x%08x\n", nv_rd32(priv, 0x100808));
-       nv_wr32(priv, 0x100808, 0x00000000);
-}
-
-/*******************************************************************************
- * VMMGR subdev
- ******************************************************************************/
-
-static int
-nv44_vmmgr_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
-               struct nouveau_oclass *oclass, void *data, u32 size,
-               struct nouveau_object **pobject)
-{
-       struct nouveau_device *device = nv_device(parent);
-       struct nv04_vmmgr_priv *priv;
-       int ret;
-
-       if (pci_find_capability(device->pdev, PCI_CAP_ID_AGP) ||
-           !nouveau_boolopt(device->cfgopt, "NvPCIE", true)) {
-               return nouveau_object_ctor(parent, engine, &nv04_vmmgr_oclass,
-                                          data, size, pobject);
-       }
-
-       ret = nouveau_vmmgr_create(parent, engine, oclass, "PCIEGART",
-                                  "pciegart", &priv);
-       *pobject = nv_object(priv);
-       if (ret)
-               return ret;
-
-       priv->base.create = nv04_vm_create;
-       priv->base.limit = NV44_GART_SIZE;
-       priv->base.dma_bits = 39;
-       priv->base.pgt_bits = 32 - 12;
-       priv->base.spg_shift = 12;
-       priv->base.lpg_shift = 12;
-       priv->base.map_sg = nv44_vm_map_sg;
-       priv->base.unmap = nv44_vm_unmap;
-       priv->base.flush = nv44_vm_flush;
-
-       priv->nullp = pci_alloc_consistent(device->pdev, 16 * 1024, &priv->null);
-       if (!priv->nullp) {
-               nv_error(priv, "unable to allocate dummy pages\n");
-               return -ENOMEM;
-       }
-
-       ret = nouveau_vm_create(&priv->base, 0, NV44_GART_SIZE, 0, 4096,
-                               &priv->vm);
-       if (ret)
-               return ret;
-
-       ret = nouveau_gpuobj_new(nv_object(priv), NULL,
-                               (NV44_GART_SIZE / NV44_GART_PAGE) * 4,
-                                512 * 1024, NVOBJ_FLAG_ZERO_ALLOC,
-                                &priv->vm->pgt[0].obj[0]);
-       priv->vm->pgt[0].refcount[0] = 1;
-       if (ret)
-               return ret;
-
-       return 0;
-}
-
-static int
-nv44_vmmgr_init(struct nouveau_object *object)
-{
-       struct nv04_vmmgr_priv *priv = (void *)object;
-       struct nouveau_gpuobj *gart = priv->vm->pgt[0].obj[0];
-       u32 addr;
-       int ret;
-
-       ret = nouveau_vmmgr_init(&priv->base);
-       if (ret)
-               return ret;
-
-       /* calculate vram address of this PRAMIN block, object must be
-        * allocated on 512KiB alignment, and not exceed a total size
-        * of 512KiB for this to work correctly
-        */
-       addr  = nv_rd32(priv, 0x10020c);
-       addr -= ((gart->addr >> 19) + 1) << 19;
-
-       nv_wr32(priv, 0x100850, 0x80000000);
-       nv_wr32(priv, 0x100818, priv->null);
-       nv_wr32(priv, 0x100804, NV44_GART_SIZE);
-       nv_wr32(priv, 0x100850, 0x00008000);
-       nv_mask(priv, 0x10008c, 0x00000200, 0x00000200);
-       nv_wr32(priv, 0x100820, 0x00000000);
-       nv_wr32(priv, 0x10082c, 0x00000001);
-       nv_wr32(priv, 0x100800, addr | 0x00000010);
-       return 0;
-}
-
-struct nouveau_oclass
-nv44_vmmgr_oclass = {
-       .handle = NV_SUBDEV(VM, 0x44),
-       .ofuncs = &(struct nouveau_ofuncs) {
-               .ctor = nv44_vmmgr_ctor,
-               .dtor = nv04_vmmgr_dtor,
-               .init = nv44_vmmgr_init,
-               .fini = _nouveau_vmmgr_fini,
-       },
-};
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv50.c b/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nv50.c
deleted file mode 100644 (file)
index a4aa81a..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright 2010 Red Hat Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: Ben Skeggs
- */
-
-#include <core/device.h>
-#include <core/gpuobj.h>
-
-#include <subdev/timer.h>
-#include <subdev/fb.h>
-#include <subdev/bar.h>
-#include <subdev/vm.h>
-
-struct nv50_vmmgr_priv {
-       struct nouveau_vmmgr base;
-};
-
-static void
-nv50_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,
-               struct nouveau_gpuobj *pgt[2])
-{
-       u64 phys = 0xdeadcafe00000000ULL;
-       u32 coverage = 0;
-
-       if (pgt[0]) {
-               phys = 0x00000003 | pgt[0]->addr; /* present, 4KiB pages */
-               coverage = (pgt[0]->size >> 3) << 12;
-       } else
-       if (pgt[1]) {
-               phys = 0x00000001 | pgt[1]->addr; /* present */
-               coverage = (pgt[1]->size >> 3) << 16;
-       }
-
-       if (phys & 1) {
-               if (coverage <= 32 * 1024 * 1024)
-                       phys |= 0x60;
-               else if (coverage <= 64 * 1024 * 1024)
-                       phys |= 0x40;
-               else if (coverage <= 128 * 1024 * 1024)
-                       phys |= 0x20;
-       }
-
-       nv_wo32(pgd, (pde * 8) + 0, lower_32_bits(phys));
-       nv_wo32(pgd, (pde * 8) + 4, upper_32_bits(phys));
-}
-
-static inline u64
-vm_addr(struct nouveau_vma *vma, u64 phys, u32 memtype, u32 target)
-{
-       phys |= 1; /* present */
-       phys |= (u64)memtype << 40;
-       phys |= target << 4;
-       if (vma->access & NV_MEM_ACCESS_SYS)
-               phys |= (1 << 6);
-       if (!(vma->access & NV_MEM_ACCESS_WO))
-               phys |= (1 << 3);
-       return phys;
-}
-
-static void
-nv50_vm_map(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
-           struct nouveau_mem *mem, u32 pte, u32 cnt, u64 phys, u64 delta)
-{
-       u32 comp = (mem->memtype & 0x180) >> 7;
-       u32 block, target;
-       int i;
-
-       /* IGPs don't have real VRAM, re-target to stolen system memory */
-       target = 0;
-       if (nouveau_fb(vma->vm->vmm)->ram->stolen) {
-               phys += nouveau_fb(vma->vm->vmm)->ram->stolen;
-               target = 3;
-       }
-
-       phys  = vm_addr(vma, phys, mem->memtype, target);
-       pte <<= 3;
-       cnt <<= 3;
-
-       while (cnt) {
-               u32 offset_h = upper_32_bits(phys);
-               u32 offset_l = lower_32_bits(phys);
-
-               for (i = 7; i >= 0; i--) {
-                       block = 1 << (i + 3);
-                       if (cnt >= block && !(pte & (block - 1)))
-                               break;
-               }
-               offset_l |= (i << 7);
-
-               phys += block << (vma->node->type - 3);
-               cnt  -= block;
-               if (comp) {
-                       u32 tag = mem->tag->offset + ((delta >> 16) * comp);
-                       offset_h |= (tag << 17);
-                       delta    += block << (vma->node->type - 3);
-               }
-
-               while (block) {
-                       nv_wo32(pgt, pte + 0, offset_l);
-                       nv_wo32(pgt, pte + 4, offset_h);
-                       pte += 8;
-                       block -= 8;
-               }
-       }
-}
-
-static void
-nv50_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
-              struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
-{
-       u32 target = (vma->access & NV_MEM_ACCESS_NOSNOOP) ? 3 : 2;
-       pte <<= 3;
-       while (cnt--) {
-               u64 phys = vm_addr(vma, (u64)*list++, mem->memtype, target);
-               nv_wo32(pgt, pte + 0, lower_32_bits(phys));
-               nv_wo32(pgt, pte + 4, upper_32_bits(phys));
-               pte += 8;
-       }
-}
-
-static void
-nv50_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
-{
-       pte <<= 3;
-       while (cnt--) {
-               nv_wo32(pgt, pte + 0, 0x00000000);
-               nv_wo32(pgt, pte + 4, 0x00000000);
-               pte += 8;
-       }
-}
-
-static void
-nv50_vm_flush(struct nouveau_vm *vm)
-{
-       struct nv50_vmmgr_priv *priv = (void *)vm->vmm;
-       struct nouveau_bar *bar = nouveau_bar(priv);
-       struct nouveau_engine *engine;
-       int i, vme;
-
-       bar->flush(bar);
-
-       mutex_lock(&nv_subdev(priv)->mutex);
-       for (i = 0; i < NVDEV_SUBDEV_NR; i++) {
-               if (!atomic_read(&vm->engref[i]))
-                       continue;
-
-               /* unfortunate hw bug workaround... */
-               engine = nouveau_engine(priv, i);
-               if (engine && engine->tlb_flush) {
-                       engine->tlb_flush(engine);
-                       continue;
-               }
-
-               switch (i) {
-               case NVDEV_ENGINE_GR   : vme = 0x00; break;
-               case NVDEV_ENGINE_VP   : vme = 0x01; break;
-               case NVDEV_SUBDEV_BAR  : vme = 0x06; break;
-               case NVDEV_ENGINE_PPP  :
-               case NVDEV_ENGINE_MPEG : vme = 0x08; break;
-               case NVDEV_ENGINE_BSP  : vme = 0x09; break;
-               case NVDEV_ENGINE_CRYPT: vme = 0x0a; break;
-               case NVDEV_ENGINE_COPY0: vme = 0x0d; break;
-               default:
-                       continue;
-               }
-
-               nv_wr32(priv, 0x100c80, (vme << 16) | 1);
-               if (!nv_wait(priv, 0x100c80, 0x00000001, 0x00000000))
-                       nv_error(priv, "vm flush timeout: engine %d\n", vme);
-       }
-       mutex_unlock(&nv_subdev(priv)->mutex);
-}
-
-static int
-nv50_vm_create(struct nouveau_vmmgr *vmm, u64 offset, u64 length,
-              u64 mm_offset, struct nouveau_vm **pvm)
-{
-       u32 block = (1 << (vmm->pgt_bits + 12));
-       if (block > length)
-               block = length;
-
-       return nouveau_vm_create(vmm, offset, length, mm_offset, block, pvm);
-}
-
-static int
-nv50_vmmgr_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
-               struct nouveau_oclass *oclass, void *data, u32 size,
-               struct nouveau_object **pobject)
-{
-       struct nv50_vmmgr_priv *priv;
-       int ret;
-
-       ret = nouveau_vmmgr_create(parent, engine, oclass, "VM", "vm", &priv);
-       *pobject = nv_object(priv);
-       if (ret)
-               return ret;
-
-       priv->base.limit = 1ULL << 40;
-       priv->base.dma_bits = 40;
-       priv->base.pgt_bits  = 29 - 12;
-       priv->base.spg_shift = 12;
-       priv->base.lpg_shift = 16;
-       priv->base.create = nv50_vm_create;
-       priv->base.map_pgt = nv50_vm_map_pgt;
-       priv->base.map = nv50_vm_map;
-       priv->base.map_sg = nv50_vm_map_sg;
-       priv->base.unmap = nv50_vm_unmap;
-       priv->base.flush = nv50_vm_flush;
-       return 0;
-}
-
-struct nouveau_oclass
-nv50_vmmgr_oclass = {
-       .handle = NV_SUBDEV(VM, 0x50),
-       .ofuncs = &(struct nouveau_ofuncs) {
-               .ctor = nv50_vmmgr_ctor,
-               .dtor = _nouveau_vmmgr_dtor,
-               .init = _nouveau_vmmgr_init,
-               .fini = _nouveau_vmmgr_fini,
-       },
-};
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nvc0.c b/drivers/gpu/drm/nouveau/nvkm/subdev/vm/nvc0.c
deleted file mode 100644 (file)
index c0a3389..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright 2010 Red Hat Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: Ben Skeggs
- */
-
-#include <core/device.h>
-#include <core/gpuobj.h>
-
-#include <subdev/timer.h>
-#include <subdev/fb.h>
-#include <subdev/vm.h>
-#include <subdev/ltc.h>
-#include <subdev/bar.h>
-
-struct nvc0_vmmgr_priv {
-       struct nouveau_vmmgr base;
-};
-
-
-/* Map from compressed to corresponding uncompressed storage type.
- * The value 0xff represents an invalid storage type.
- */
-const u8 nvc0_pte_storage_type_map[256] =
-{
-       0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0xff, 0x01, /* 0x00 */
-       0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, /* 0x10 */
-       0x11, 0x11, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x26, 0x27, /* 0x20 */
-       0x28, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30 */
-       0xff, 0xff, 0x26, 0x27, 0x28, 0x29, 0x26, 0x27,
-       0x28, 0x29, 0xff, 0xff, 0xff, 0xff, 0x46, 0xff, /* 0x40 */
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0x46, 0x46, 0x46, 0x46, 0xff, 0xff, 0xff, /* 0x50 */
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60 */
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70 */
-       0xff, 0xff, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x7b, /* 0x80 */
-       0x7b, 0x7b, 0xff, 0x8b, 0x8c, 0x8d, 0x8e, 0xff,
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90 */
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0x8b, 0x8c, 0x8d, 0x8e, 0xa7, /* 0xa0 */
-       0xa8, 0xa9, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0 */
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7,
-       0xa8, 0xa9, 0xaa, 0xc3, 0xff, 0xff, 0xff, 0xff, /* 0xc0 */
-       0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xc3, 0xc3,
-       0xc3, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0 */
-       0xfe, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe,
-       0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, /* 0xe0 */
-       0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xff,
-       0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, /* 0xf0 */
-       0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfd, 0xfe, 0xff
-};
-
-
-static void
-nvc0_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 index,
-               struct nouveau_gpuobj *pgt[2])
-{
-       u32 pde[2] = { 0, 0 };
-
-       if (pgt[0])
-               pde[1] = 0x00000001 | (pgt[0]->addr >> 8);
-       if (pgt[1])
-               pde[0] = 0x00000001 | (pgt[1]->addr >> 8);
-
-       nv_wo32(pgd, (index * 8) + 0, pde[0]);
-       nv_wo32(pgd, (index * 8) + 4, pde[1]);
-}
-
-static inline u64
-nvc0_vm_addr(struct nouveau_vma *vma, u64 phys, u32 memtype, u32 target)
-{
-       phys >>= 8;
-
-       phys |= 0x00000001; /* present */
-       if (vma->access & NV_MEM_ACCESS_SYS)
-               phys |= 0x00000002;
-
-       phys |= ((u64)target  << 32);
-       phys |= ((u64)memtype << 36);
-
-       return phys;
-}
-
-static void
-nvc0_vm_map(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
-           struct nouveau_mem *mem, u32 pte, u32 cnt, u64 phys, u64 delta)
-{
-       u64 next = 1 << (vma->node->type - 8);
-
-       phys  = nvc0_vm_addr(vma, phys, mem->memtype, 0);
-       pte <<= 3;
-
-       if (mem->tag) {
-               struct nouveau_ltc *ltc = nouveau_ltc(vma->vm->vmm);
-               u32 tag = mem->tag->offset + (delta >> 17);
-               phys |= (u64)tag << (32 + 12);
-               next |= (u64)1   << (32 + 12);
-               ltc->tags_clear(ltc, tag, cnt);
-       }
-
-       while (cnt--) {
-               nv_wo32(pgt, pte + 0, lower_32_bits(phys));
-               nv_wo32(pgt, pte + 4, upper_32_bits(phys));
-               phys += next;
-               pte  += 8;
-       }
-}
-
-static void
-nvc0_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
-              struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
-{
-       u32 target = (vma->access & NV_MEM_ACCESS_NOSNOOP) ? 7 : 5;
-       /* compressed storage types are invalid for system memory */
-       u32 memtype = nvc0_pte_storage_type_map[mem->memtype & 0xff];
-
-       pte <<= 3;
-       while (cnt--) {
-               u64 phys = nvc0_vm_addr(vma, *list++, memtype, target);
-               nv_wo32(pgt, pte + 0, lower_32_bits(phys));
-               nv_wo32(pgt, pte + 4, upper_32_bits(phys));
-               pte += 8;
-       }
-}
-
-static void
-nvc0_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
-{
-       pte <<= 3;
-       while (cnt--) {
-               nv_wo32(pgt, pte + 0, 0x00000000);
-               nv_wo32(pgt, pte + 4, 0x00000000);
-               pte += 8;
-       }
-}
-
-static void
-nvc0_vm_flush(struct nouveau_vm *vm)
-{
-       struct nvc0_vmmgr_priv *priv = (void *)vm->vmm;
-       struct nouveau_bar *bar = nouveau_bar(priv);
-       struct nouveau_vm_pgd *vpgd;
-       u32 type;
-
-       bar->flush(bar);
-
-       type = 0x00000001; /* PAGE_ALL */
-       if (atomic_read(&vm->engref[NVDEV_SUBDEV_BAR]))
-               type |= 0x00000004; /* HUB_ONLY */
-
-       mutex_lock(&nv_subdev(priv)->mutex);
-       list_for_each_entry(vpgd, &vm->pgd_list, head) {
-               /* looks like maybe a "free flush slots" counter, the
-                * faster you write to 0x100cbc to more it decreases
-                */
-               if (!nv_wait_ne(priv, 0x100c80, 0x00ff0000, 0x00000000)) {
-                       nv_error(priv, "vm timeout 0: 0x%08x %d\n",
-                                nv_rd32(priv, 0x100c80), type);
-               }
-
-               nv_wr32(priv, 0x100cb8, vpgd->obj->addr >> 8);
-               nv_wr32(priv, 0x100cbc, 0x80000000 | type);
-
-               /* wait for flush to be queued? */
-               if (!nv_wait(priv, 0x100c80, 0x00008000, 0x00008000)) {
-                       nv_error(priv, "vm timeout 1: 0x%08x %d\n",
-                                nv_rd32(priv, 0x100c80), type);
-               }
-       }
-       mutex_unlock(&nv_subdev(priv)->mutex);
-}
-
-static int
-nvc0_vm_create(struct nouveau_vmmgr *vmm, u64 offset, u64 length,
-              u64 mm_offset, struct nouveau_vm **pvm)
-{
-       return nouveau_vm_create(vmm, offset, length, mm_offset, 4096, pvm);
-}
-
-static int
-nvc0_vmmgr_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
-               struct nouveau_oclass *oclass, void *data, u32 size,
-               struct nouveau_object **pobject)
-{
-       struct nvc0_vmmgr_priv *priv;
-       int ret;
-
-       ret = nouveau_vmmgr_create(parent, engine, oclass, "VM", "vm", &priv);
-       *pobject = nv_object(priv);
-       if (ret)
-               return ret;
-
-       priv->base.limit = 1ULL << 40;
-       priv->base.dma_bits = 40;
-       priv->base.pgt_bits  = 27 - 12;
-       priv->base.spg_shift = 12;
-       priv->base.lpg_shift = 17;
-       priv->base.create = nvc0_vm_create;
-       priv->base.map_pgt = nvc0_vm_map_pgt;
-       priv->base.map = nvc0_vm_map;
-       priv->base.map_sg = nvc0_vm_map_sg;
-       priv->base.unmap = nvc0_vm_unmap;
-       priv->base.flush = nvc0_vm_flush;
-       return 0;
-}
-
-struct nouveau_oclass
-nvc0_vmmgr_oclass = {
-       .handle = NV_SUBDEV(VM, 0xc0),
-       .ofuncs = &(struct nouveau_ofuncs) {
-               .ctor = nvc0_vmmgr_ctor,
-               .dtor = _nouveau_vmmgr_dtor,
-               .init = _nouveau_vmmgr_init,
-               .fini = _nouveau_vmmgr_fini,
-       },
-};