Commit 540a1dde authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/mmu/gf100: implement vmm on top of new base



Adds support for:
- Selection of a 64KiB big page size (NvFbBigPage=16).
- System-memory PDs.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 9f6219fd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#define NVIF_CLASS_VMM                               /* if000c.h */  0x8000000c
#define NVIF_CLASS_VMM_NV04                          /* if000d.h */  0x8000000d
#define NVIF_CLASS_VMM_NV50                          /* if500d.h */  0x8000500d
#define NVIF_CLASS_VMM_GF100                         /* if900d.h */  0x8000900d

/* the below match nvidia-assigned (either in hw, or sw) class numbers */
#define NV_NULL_CLASS                                                0x00000030
+8 −0
Original line number Diff line number Diff line
#ifndef __NVIF_IF900D_H__
#define __NVIF_IF900D_H__
#include "if000c.h"

struct gf100_vmm_vn {
	/* nvif_vmm_vX ... */
};
#endif
+1 −0
Original line number Diff line number Diff line
@@ -17,3 +17,4 @@ nvkm-y += nvkm/subdev/mmu/vmmnv04.o
nvkm-y += nvkm/subdev/mmu/vmmnv41.o
nvkm-y += nvkm/subdev/mmu/vmmnv44.o
nvkm-y += nvkm/subdev/mmu/vmmnv50.o
nvkm-y += nvkm/subdev/mmu/vmmgf100.o
+4 −2
Original line number Diff line number Diff line
@@ -21,12 +21,13 @@
 *
 * Authors: Ben Skeggs
 */
#include "priv.h"
#include "vmm.h"

#include <core/gpuobj.h>
#include <subdev/fb.h>
#include <subdev/timer.h>

#include <core/gpuobj.h>
#include <nvif/class.h>

/* Map from compressed to corresponding uncompressed storage type.
 * The value 0xff represents an invalid storage type.
@@ -209,6 +210,7 @@ gf100_mmu = {
	.map_sg = gf100_vm_map_sg,
	.unmap = gf100_vm_unmap,
	.flush = gf100_vm_flush,
	.vmm = {{ -1, -1, NVIF_CLASS_VMM_GF100}, gf100_vmm_new },
};

int
+12 −0
Original line number Diff line number Diff line
@@ -52,6 +52,9 @@ struct nvkm_vmm_pt {
struct nvkm_vmm_desc_func {
};

extern const struct nvkm_vmm_desc_func gf100_vmm_pgd;
extern const struct nvkm_vmm_desc_func gf100_vmm_pgt;

struct nvkm_vmm_desc {
	enum {
		PGD,
@@ -111,6 +114,13 @@ int nv04_vmm_new_(const struct nvkm_vmm_func *, struct nvkm_mmu *, u32,
		  u64, u64, void *, u32, struct lock_class_key *,
		  const char *, struct nvkm_vmm **);

int gf100_vmm_new_(const struct nvkm_vmm_func *, const struct nvkm_vmm_func *,
		   struct nvkm_mmu *, u64, u64, void *, u32,
		   struct lock_class_key *, const char *, struct nvkm_vmm **);
int gf100_vmm_join_(struct nvkm_vmm *, struct nvkm_memory *, u64 base);
int gf100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);
void gf100_vmm_part(struct nvkm_vmm *, struct nvkm_memory *);

int nv04_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
		 struct lock_class_key *, const char *, struct nvkm_vmm **);
int nv41_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
@@ -121,4 +131,6 @@ int nv50_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
		 struct lock_class_key *, const char *, struct nvkm_vmm **);
int g84_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
		struct lock_class_key *, const char *, struct nvkm_vmm **);
int gf100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
		  struct lock_class_key *, const char *, struct nvkm_vmm **);
#endif
Loading