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 8struct 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 22struct nvkm_mm { 23 struct list_head nodes; 24 struct list_head free; 25 26 u32 block_size; 27 int heap_nodes; 28}; 29 30static inline bool 31nvkm_mm_initialised(struct nvkm_mm *mm) 32{ 33 return mm->heap_nodes; 34} 35 36int nvkm_mm_init(struct nvkm_mm *, u8 heap, u32 offset, u32 length, u32 block); 37int nvkm_mm_fini(struct nvkm_mm *); 38int nvkm_mm_head(struct nvkm_mm *, u8 heap, u8 type, u32 size_max, 39 u32 size_min, u32 align, struct nvkm_mm_node **); 40int nvkm_mm_tail(struct nvkm_mm *, u8 heap, u8 type, u32 size_max, 41 u32 size_min, u32 align, struct nvkm_mm_node **); 42void nvkm_mm_free(struct nvkm_mm *, struct nvkm_mm_node **); 43void nvkm_mm_dump(struct nvkm_mm *, const char *); 44 45static inline u32 46nvkm_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 57static inline bool 58nvkm_mm_contiguous(struct nvkm_mm_node *node) 59{ 60 return !node->next; 61} 62 63static inline u32 64nvkm_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 71static inline u32 72nvkm_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