Merge branch 'linus-4.14-rc4-acp-prereq' of git://people.freedesktop.org/~agd5f/linux...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / nouveau / nvkm / subdev / mmu / priv.h
index 27cedc60b507ba6c5191bae81983831129fb7193..d024d8055fcb175af5e55451e289f6c556f545d7 100644 (file)
@@ -9,31 +9,57 @@ int nvkm_mmu_new_(const struct nvkm_mmu_func *, struct nvkm_device *,
                  int index, struct nvkm_mmu **);
 
 struct nvkm_mmu_func {
-       void *(*dtor)(struct nvkm_mmu *);
-       int (*oneinit)(struct nvkm_mmu *);
        void (*init)(struct nvkm_mmu *);
 
-       u64 limit;
        u8  dma_bits;
-       u32 pgt_bits;
-       u8  spg_shift;
-       u8  lpg_shift;
-
-       int  (*create)(struct nvkm_mmu *, u64 offset, u64 length, u64 mm_offset,
-                      struct lock_class_key *, struct nvkm_vm **);
-
-       void (*map_pgt)(struct nvkm_gpuobj *pgd, u32 pde,
-                       struct nvkm_memory *pgt[2]);
-       void (*map)(struct nvkm_vma *, struct nvkm_memory *,
-                   struct nvkm_mem *, u32 pte, u32 cnt,
-                   u64 phys, u64 delta);
-       void (*map_sg)(struct nvkm_vma *, struct nvkm_memory *,
-                      struct nvkm_mem *, u32 pte, u32 cnt, dma_addr_t *);
-       void (*unmap)(struct nvkm_vma *, struct nvkm_memory *pgt,
-                     u32 pte, u32 cnt);
-       void (*flush)(struct nvkm_vm *);
+
+       struct {
+               struct nvkm_sclass user;
+       } mmu;
+
+       struct {
+               struct nvkm_sclass user;
+               int (*vram)(struct nvkm_mmu *, int type, u8 page, u64 size,
+                           void *argv, u32 argc, struct nvkm_memory **);
+               int (*umap)(struct nvkm_mmu *, struct nvkm_memory *, void *argv,
+                           u32 argc, u64 *addr, u64 *size, struct nvkm_vma **);
+       } mem;
+
+       struct {
+               struct nvkm_sclass user;
+               int (*ctor)(struct nvkm_mmu *, u64 addr, u64 size,
+                           void *argv, u32 argc, struct lock_class_key *,
+                           const char *name, struct nvkm_vmm **);
+               bool global;
+               u32 pd_offset;
+       } vmm;
+
+       const u8 *(*kind)(struct nvkm_mmu *, int *count);
+       bool kind_sys;
+};
+
+extern const struct nvkm_mmu_func nv04_mmu;
+
+const u8 *nv50_mmu_kind(struct nvkm_mmu *, int *count);
+
+const u8 *gf100_mmu_kind(struct nvkm_mmu *, int *count);
+
+const u8 *gm200_mmu_kind(struct nvkm_mmu *, int *);
+
+struct nvkm_mmu_pt {
+       union {
+               struct nvkm_mmu_ptc *ptc;
+               struct nvkm_mmu_ptp *ptp;
+       };
+       struct nvkm_memory *memory;
+       bool sub;
+       u16 base;
+       u64 addr;
+       struct list_head head;
 };
 
-int nvkm_vm_create(struct nvkm_mmu *, u64, u64, u64, u32,
-                  struct lock_class_key *, struct nvkm_vm **);
+void nvkm_mmu_ptc_dump(struct nvkm_mmu *);
+struct nvkm_mmu_pt *
+nvkm_mmu_ptc_get(struct nvkm_mmu *, u32 size, u32 align, bool zero);
+void nvkm_mmu_ptc_put(struct nvkm_mmu *, bool force, struct nvkm_mmu_pt **);
 #endif