xref: /linux/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/priv.h (revision 0ea5c948cb64bab5bc7a5516774eb8536f05aa0d)
1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */
2c9582455SBen Skeggs #ifndef __NVKM_MMU_PRIV_H__
3c9582455SBen Skeggs #define __NVKM_MMU_PRIV_H__
4c9582455SBen Skeggs #define nvkm_mmu(p) container_of((p), struct nvkm_mmu, subdev)
5c9582455SBen Skeggs #include <subdev/mmu.h>
6c9582455SBen Skeggs 
7*5bf02571SBen Skeggs int r535_mmu_new(const struct nvkm_mmu_func *hw, struct nvkm_device *, enum nvkm_subdev_type, int,
8*5bf02571SBen Skeggs 		 struct nvkm_mmu **);
9*5bf02571SBen Skeggs 
106dd123baSBen Skeggs void nvkm_mmu_ctor(const struct nvkm_mmu_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
116dd123baSBen Skeggs 		   struct nvkm_mmu *);
126dd123baSBen Skeggs int nvkm_mmu_new_(const struct nvkm_mmu_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
136dd123baSBen Skeggs 		  struct nvkm_mmu **);
14c9582455SBen Skeggs 
15c9582455SBen Skeggs struct nvkm_mmu_func {
16*5bf02571SBen Skeggs 	void (*dtor)(struct nvkm_mmu *);
17c9582455SBen Skeggs 	void (*init)(struct nvkm_mmu *);
18c9582455SBen Skeggs 
19c9582455SBen Skeggs 	u8  dma_bits;
20c9582455SBen Skeggs 
21806a7335SBen Skeggs 	struct {
225b17f362SBen Skeggs 		struct nvkm_sclass user;
23eea5cf0fSBen Skeggs 	} mmu;
24c9582455SBen Skeggs 
25eea5cf0fSBen Skeggs 	struct {
26eea5cf0fSBen Skeggs 		struct nvkm_sclass user;
27eaf1a691SBen Skeggs 		int (*vram)(struct nvkm_mmu *, int type, u8 page, u64 size,
28eaf1a691SBen Skeggs 			    void *argv, u32 argc, struct nvkm_memory **);
29eaf1a691SBen Skeggs 		int (*umap)(struct nvkm_mmu *, struct nvkm_memory *, void *argv,
30eaf1a691SBen Skeggs 			    u32 argc, u64 *addr, u64 *size, struct nvkm_vma **);
31eaf1a691SBen Skeggs 	} mem;
32eaf1a691SBen Skeggs 
33eaf1a691SBen Skeggs 	struct {
34eaf1a691SBen Skeggs 		struct nvkm_sclass user;
352606f291SBen Skeggs 		int (*ctor)(struct nvkm_mmu *, bool managed, u64 addr, u64 size,
36806a7335SBen Skeggs 			    void *argv, u32 argc, struct lock_class_key *,
37806a7335SBen Skeggs 			    const char *name, struct nvkm_vmm **);
38806a7335SBen Skeggs 		bool global;
399f6219fdSBen Skeggs 		u32 pd_offset;
40806a7335SBen Skeggs 	} vmm;
41fd542a3eSBen Skeggs 
42176ada03SJames Jones 	const u8 *(*kind)(struct nvkm_mmu *, int *count, u8 *invalid);
4351645eb7SBen Skeggs 	bool kind_sys;
44*5bf02571SBen Skeggs 
45*5bf02571SBen Skeggs 	int (*promote_vmm)(struct nvkm_vmm *);
46c9582455SBen Skeggs };
47c9582455SBen Skeggs 
485b17f362SBen Skeggs extern const struct nvkm_mmu_func nv04_mmu;
495b17f362SBen Skeggs 
50176ada03SJames Jones const u8 *nv50_mmu_kind(struct nvkm_mmu *, int *count, u8 *invalid);
51db018585SBen Skeggs 
52176ada03SJames Jones const u8 *gf100_mmu_kind(struct nvkm_mmu *, int *count, u8 *invalid);
539a45ddaaSBen Skeggs 
54176ada03SJames Jones const u8 *gm200_mmu_kind(struct nvkm_mmu *, int *, u8 *);
55e12cf6adSBen Skeggs 
569a45ddaaSBen Skeggs struct nvkm_mmu_pt {
579a45ddaaSBen Skeggs 	union {
589a45ddaaSBen Skeggs 		struct nvkm_mmu_ptc *ptc;
59f1280394SBen Skeggs 		struct nvkm_mmu_ptp *ptp;
609a45ddaaSBen Skeggs 	};
619a45ddaaSBen Skeggs 	struct nvkm_memory *memory;
62f1280394SBen Skeggs 	bool sub;
639a45ddaaSBen Skeggs 	u16 base;
649a45ddaaSBen Skeggs 	u64 addr;
659a45ddaaSBen Skeggs 	struct list_head head;
669a45ddaaSBen Skeggs };
679a45ddaaSBen Skeggs 
689a45ddaaSBen Skeggs void nvkm_mmu_ptc_dump(struct nvkm_mmu *);
699a45ddaaSBen Skeggs struct nvkm_mmu_pt *
709a45ddaaSBen Skeggs nvkm_mmu_ptc_get(struct nvkm_mmu *, u32 size, u32 align, bool zero);
719a45ddaaSBen Skeggs void nvkm_mmu_ptc_put(struct nvkm_mmu *, bool force, struct nvkm_mmu_pt **);
72c9582455SBen Skeggs #endif
73