xref: /openbmc/linux/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/priv.h (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
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*6dd123baSBen Skeggs void nvkm_mmu_ctor(const struct nvkm_mmu_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
8*6dd123baSBen Skeggs 		   struct nvkm_mmu *);
9*6dd123baSBen Skeggs int nvkm_mmu_new_(const struct nvkm_mmu_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
10*6dd123baSBen Skeggs 		  struct nvkm_mmu **);
11c9582455SBen Skeggs 
12c9582455SBen Skeggs struct nvkm_mmu_func {
13c9582455SBen Skeggs 	void (*init)(struct nvkm_mmu *);
14c9582455SBen Skeggs 
15c9582455SBen Skeggs 	u8  dma_bits;
16c9582455SBen Skeggs 
17806a7335SBen Skeggs 	struct {
185b17f362SBen Skeggs 		struct nvkm_sclass user;
19eea5cf0fSBen Skeggs 	} mmu;
20c9582455SBen Skeggs 
21eea5cf0fSBen Skeggs 	struct {
22eea5cf0fSBen Skeggs 		struct nvkm_sclass user;
23eaf1a691SBen Skeggs 		int (*vram)(struct nvkm_mmu *, int type, u8 page, u64 size,
24eaf1a691SBen Skeggs 			    void *argv, u32 argc, struct nvkm_memory **);
25eaf1a691SBen Skeggs 		int (*umap)(struct nvkm_mmu *, struct nvkm_memory *, void *argv,
26eaf1a691SBen Skeggs 			    u32 argc, u64 *addr, u64 *size, struct nvkm_vma **);
27eaf1a691SBen Skeggs 	} mem;
28eaf1a691SBen Skeggs 
29eaf1a691SBen Skeggs 	struct {
30eaf1a691SBen Skeggs 		struct nvkm_sclass user;
312606f291SBen Skeggs 		int (*ctor)(struct nvkm_mmu *, bool managed, u64 addr, u64 size,
32806a7335SBen Skeggs 			    void *argv, u32 argc, struct lock_class_key *,
33806a7335SBen Skeggs 			    const char *name, struct nvkm_vmm **);
34806a7335SBen Skeggs 		bool global;
359f6219fdSBen Skeggs 		u32 pd_offset;
36806a7335SBen Skeggs 	} vmm;
37fd542a3eSBen Skeggs 
38176ada03SJames Jones 	const u8 *(*kind)(struct nvkm_mmu *, int *count, u8 *invalid);
3951645eb7SBen Skeggs 	bool kind_sys;
40c9582455SBen Skeggs };
41c9582455SBen Skeggs 
425b17f362SBen Skeggs extern const struct nvkm_mmu_func nv04_mmu;
435b17f362SBen Skeggs 
44176ada03SJames Jones const u8 *nv50_mmu_kind(struct nvkm_mmu *, int *count, u8 *invalid);
45db018585SBen Skeggs 
46176ada03SJames Jones const u8 *gf100_mmu_kind(struct nvkm_mmu *, int *count, u8 *invalid);
479a45ddaaSBen Skeggs 
48176ada03SJames Jones const u8 *gm200_mmu_kind(struct nvkm_mmu *, int *, u8 *);
49e12cf6adSBen Skeggs 
509a45ddaaSBen Skeggs struct nvkm_mmu_pt {
519a45ddaaSBen Skeggs 	union {
529a45ddaaSBen Skeggs 		struct nvkm_mmu_ptc *ptc;
53f1280394SBen Skeggs 		struct nvkm_mmu_ptp *ptp;
549a45ddaaSBen Skeggs 	};
559a45ddaaSBen Skeggs 	struct nvkm_memory *memory;
56f1280394SBen Skeggs 	bool sub;
579a45ddaaSBen Skeggs 	u16 base;
589a45ddaaSBen Skeggs 	u64 addr;
599a45ddaaSBen Skeggs 	struct list_head head;
609a45ddaaSBen Skeggs };
619a45ddaaSBen Skeggs 
629a45ddaaSBen Skeggs void nvkm_mmu_ptc_dump(struct nvkm_mmu *);
639a45ddaaSBen Skeggs struct nvkm_mmu_pt *
649a45ddaaSBen Skeggs nvkm_mmu_ptc_get(struct nvkm_mmu *, u32 size, u32 align, bool zero);
659a45ddaaSBen Skeggs void nvkm_mmu_ptc_put(struct nvkm_mmu *, bool force, struct nvkm_mmu_pt **);
66c9582455SBen Skeggs #endif
67