1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 #ifndef _LINUX_LMB_H 3 #define _LINUX_LMB_H 4 #ifdef __KERNEL__ 5 6 #include <asm/types.h> 7 /* 8 * Logical memory blocks. 9 * 10 * Copyright (C) 2001 Peter Bergner, IBM Corp. 11 */ 12 13 #define MAX_LMB_REGIONS 8 14 15 struct lmb_property { 16 phys_addr_t base; 17 phys_size_t size; 18 }; 19 20 struct lmb_region { 21 unsigned long cnt; 22 phys_size_t size; 23 struct lmb_property region[MAX_LMB_REGIONS+1]; 24 }; 25 26 struct lmb { 27 struct lmb_region memory; 28 struct lmb_region reserved; 29 }; 30 31 extern struct lmb lmb; 32 33 extern void lmb_init(struct lmb *lmb); 34 extern void lmb_init_and_reserve(struct lmb *lmb, phys_addr_t base, 35 phys_size_t size, void *fdt_blob); 36 extern long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size); 37 extern long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size); 38 extern phys_addr_t lmb_alloc(struct lmb *lmb, phys_size_t size, ulong align); 39 extern phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, 40 phys_addr_t max_addr); 41 extern phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, 42 phys_addr_t max_addr); 43 extern phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base, 44 phys_size_t size); 45 extern phys_size_t lmb_get_unreserved_size(struct lmb *lmb, phys_addr_t addr); 46 extern int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr); 47 extern long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size); 48 49 extern void lmb_dump_all(struct lmb *lmb); 50 51 static inline phys_size_t 52 lmb_size_bytes(struct lmb_region *type, unsigned long region_nr) 53 { 54 return type->region[region_nr].size; 55 } 56 57 void board_lmb_reserve(struct lmb *lmb); 58 void arch_lmb_reserve(struct lmb *lmb); 59 60 #endif /* __KERNEL__ */ 61 62 #endif /* _LINUX_LMB_H */ 63