1 /* $NetBSD: mm.h,v 1.3 2021/12/18 23:45:33 riastradh Exp $ */ 2 3 /* SPDX-License-Identifier: MIT */ 4 #ifndef __NVKM_MM_H__ 5 #define __NVKM_MM_H__ 6 #include <core/os.h> 7 8 struct nvkm_mm_node { 9 struct list_head nl_entry; 10 struct list_head fl_entry; 11 struct nvkm_mm_node *next; 12 13 #define NVKM_MM_HEAP_ANY 0x00 14 u8 heap; 15 #define NVKM_MM_TYPE_NONE 0x00 16 #define NVKM_MM_TYPE_HOLE 0xff 17 u8 type; 18 u32 offset; 19 u32 length; 20 }; 21 22 struct nvkm_mm { 23 struct list_head nodes; 24 struct list_head free; 25 26 u32 block_size; 27 int heap_nodes; 28 }; 29 30 static inline bool 31 nvkm_mm_initialised(struct nvkm_mm *mm) 32 { 33 return mm->heap_nodes; 34 } 35 36 int nvkm_mm_init(struct nvkm_mm *, u8 heap, u32 offset, u32 length, u32 block); 37 int nvkm_mm_fini(struct nvkm_mm *); 38 int nvkm_mm_head(struct nvkm_mm *, u8 heap, u8 type, u32 size_max, 39 u32 size_min, u32 align, struct nvkm_mm_node **); 40 int nvkm_mm_tail(struct nvkm_mm *, u8 heap, u8 type, u32 size_max, 41 u32 size_min, u32 align, struct nvkm_mm_node **); 42 void nvkm_mm_free(struct nvkm_mm *, struct nvkm_mm_node **); 43 void nvkm_mm_dump(struct nvkm_mm *, const char *); 44 45 static inline u32 46 nvkm_mm_heap_size(struct nvkm_mm *mm, u8 heap) 47 { 48 struct nvkm_mm_node *node; 49 u32 size = 0; 50 list_for_each_entry(node, &mm->nodes, nl_entry) { 51 if (node->heap == heap) 52 size += node->length; 53 } 54 return size; 55 } 56 57 static inline bool 58 nvkm_mm_contiguous(struct nvkm_mm_node *node) 59 { 60 return !node->next; 61 } 62 63 static inline u32 64 nvkm_mm_addr(struct nvkm_mm_node *node) 65 { 66 if (WARN_ON(!nvkm_mm_contiguous(node))) 67 return 0; 68 return node->offset; 69 } 70 71 static inline u32 72 nvkm_mm_size(struct nvkm_mm_node *node) 73 { 74 u32 size = 0; 75 do { 76 size += node->length; 77 } while ((node = node->next)); 78 return size; 79 } 80 #endif 81