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