xref: /linux/drivers/gpu/drm/nouveau/include/nvif/mmu.h (revision f5650478ab07c0921127a6a0735253b64073e978)
1eea5cf0fSBen Skeggs #ifndef __NVIF_MMU_H__
2eea5cf0fSBen Skeggs #define __NVIF_MMU_H__
3eea5cf0fSBen Skeggs #include <nvif/object.h>
4eea5cf0fSBen Skeggs 
5eea5cf0fSBen Skeggs struct nvif_mmu {
6eea5cf0fSBen Skeggs 	struct nvif_object object;
7eea5cf0fSBen Skeggs 	u8  dmabits;
8eea5cf0fSBen Skeggs 	u8  heap_nr;
9eea5cf0fSBen Skeggs 	u8  type_nr;
10eea5cf0fSBen Skeggs 	u16 kind_nr;
11*f5650478SBen Skeggs 	s32 mem;
12eea5cf0fSBen Skeggs 
13eea5cf0fSBen Skeggs 	struct {
14eea5cf0fSBen Skeggs 		u64 size;
15eea5cf0fSBen Skeggs 	} *heap;
16eea5cf0fSBen Skeggs 
17eea5cf0fSBen Skeggs 	struct {
18eea5cf0fSBen Skeggs #define NVIF_MEM_VRAM                                                      0x01
19eea5cf0fSBen Skeggs #define NVIF_MEM_HOST                                                      0x02
20eea5cf0fSBen Skeggs #define NVIF_MEM_COMP                                                      0x04
21eea5cf0fSBen Skeggs #define NVIF_MEM_DISP                                                      0x08
22eea5cf0fSBen Skeggs #define NVIF_MEM_KIND                                                      0x10
23eea5cf0fSBen Skeggs #define NVIF_MEM_MAPPABLE                                                  0x20
24eea5cf0fSBen Skeggs #define NVIF_MEM_COHERENT                                                  0x40
25eea5cf0fSBen Skeggs #define NVIF_MEM_UNCACHED                                                  0x80
26eea5cf0fSBen Skeggs 		u8 type;
27eea5cf0fSBen Skeggs 		u8 heap;
28eea5cf0fSBen Skeggs 	} *type;
29eea5cf0fSBen Skeggs 
30eea5cf0fSBen Skeggs 	u8 *kind;
31eea5cf0fSBen Skeggs };
32eea5cf0fSBen Skeggs 
33eea5cf0fSBen Skeggs int nvif_mmu_init(struct nvif_object *, s32 oclass, struct nvif_mmu *);
34eea5cf0fSBen Skeggs void nvif_mmu_fini(struct nvif_mmu *);
35eea5cf0fSBen Skeggs 
36eea5cf0fSBen Skeggs static inline bool
37eea5cf0fSBen Skeggs nvif_mmu_kind_valid(struct nvif_mmu *mmu, u8 kind)
38eea5cf0fSBen Skeggs {
39eea5cf0fSBen Skeggs 	const u8 invalid = mmu->kind_nr - 1;
40eea5cf0fSBen Skeggs 	if (kind) {
41eea5cf0fSBen Skeggs 		if (kind >= mmu->kind_nr || mmu->kind[kind] == invalid)
42eea5cf0fSBen Skeggs 			return false;
43eea5cf0fSBen Skeggs 	}
44eea5cf0fSBen Skeggs 	return true;
45eea5cf0fSBen Skeggs }
46eea5cf0fSBen Skeggs 
47eea5cf0fSBen Skeggs static inline int
48eea5cf0fSBen Skeggs nvif_mmu_type(struct nvif_mmu *mmu, u8 mask)
49eea5cf0fSBen Skeggs {
50eea5cf0fSBen Skeggs 	int i;
51eea5cf0fSBen Skeggs 	for (i = 0; i < mmu->type_nr; i++) {
52eea5cf0fSBen Skeggs 		if ((mmu->type[i].type & mask) == mask)
53eea5cf0fSBen Skeggs 			return i;
54eea5cf0fSBen Skeggs 	}
55eea5cf0fSBen Skeggs 	return -EINVAL;
56eea5cf0fSBen Skeggs }
57eea5cf0fSBen Skeggs #endif
58