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 void lmb_init(struct lmb *lmb); 32 extern void lmb_init_and_reserve(struct lmb *lmb, phys_addr_t base, 33 phys_size_t size, void *fdt_blob); 34 extern long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size); 35 extern long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size); 36 extern phys_addr_t lmb_alloc(struct lmb *lmb, phys_size_t size, ulong align); 37 extern phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, 38 phys_addr_t max_addr); 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_addr(struct lmb *lmb, phys_addr_t base, 42 phys_size_t size); 43 extern phys_size_t lmb_get_unreserved_size(struct lmb *lmb, phys_addr_t addr); 44 extern int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr); 45 extern long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size); 46 47 extern void lmb_dump_all(struct lmb *lmb); 48 49 static inline phys_size_t 50 lmb_size_bytes(struct lmb_region *type, unsigned long region_nr) 51 { 52 return type->region[region_nr].size; 53 } 54 55 void board_lmb_reserve(struct lmb *lmb); 56 void arch_lmb_reserve(struct lmb *lmb); 57 58 #endif /* __KERNEL__ */ 59 60 #endif /* _LINUX_LMB_H */ 61