]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
4ed6552f KG |
2 | #ifndef _LINUX_LMB_H |
3 | #define _LINUX_LMB_H | |
4 | #ifdef __KERNEL__ | |
5 | ||
6 | #include <asm/types.h> | |
9cc2323f SG |
7 | #include <asm/u-boot.h> |
8 | ||
4ed6552f KG |
9 | /* |
10 | * Logical memory blocks. | |
11 | * | |
12 | * Copyright (C) 2001 Peter Bergner, IBM Corp. | |
4ed6552f KG |
13 | */ |
14 | ||
59c0ea5d PD |
15 | /** |
16 | * enum lmb_flags - definition of memory region attributes | |
17 | * @LMB_NONE: no special request | |
18 | * @LMB_NOMAP: don't add to mmu configuration | |
19 | */ | |
20 | enum lmb_flags { | |
21 | LMB_NONE = 0x0, | |
22 | LMB_NOMAP = 0x4, | |
23 | }; | |
24 | ||
6d66502b PD |
25 | /** |
26 | * struct lmb_property - Description of one region. | |
27 | * | |
4ad4c2da HS |
28 | * @base: Base address of the region. |
29 | * @size: Size of the region | |
30 | * @flags: memory region attributes | |
6d66502b | 31 | */ |
4ed6552f | 32 | struct lmb_property { |
391fd93a BB |
33 | phys_addr_t base; |
34 | phys_size_t size; | |
59c0ea5d | 35 | enum lmb_flags flags; |
4ed6552f KG |
36 | }; |
37 | ||
6d66502b PD |
38 | /** |
39 | * struct lmb_region - Description of a set of region. | |
40 | * | |
41 | * @cnt: Number of regions. | |
42 | * @max: Size of the region array, max value of cnt. | |
43 | * @region: Array of the region properties | |
44 | */ | |
4ed6552f KG |
45 | struct lmb_region { |
46 | unsigned long cnt; | |
00fd8dad | 47 | unsigned long max; |
6d66502b | 48 | #if IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS) |
cb1e6198 | 49 | struct lmb_property region[CONFIG_LMB_MAX_REGIONS]; |
6d66502b PD |
50 | #else |
51 | struct lmb_property *region; | |
52 | #endif | |
4ed6552f KG |
53 | }; |
54 | ||
6d66502b PD |
55 | /** |
56 | * struct lmb - Logical memory block handle. | |
57 | * | |
58 | * Clients provide storage for Logical memory block (lmb) handles. | |
59 | * The content of the structure is managed by the lmb library. | |
60 | * A lmb struct is initialized by lmb_init() functions. | |
61 | * The lmb struct is passed to all other lmb APIs. | |
62 | * | |
63 | * @memory: Description of memory regions. | |
64 | * @reserved: Description of reserved regions. | |
65 | * @memory_regions: Array of the memory regions (statically allocated) | |
66 | * @reserved_regions: Array of the reserved regions (statically allocated) | |
67 | */ | |
4ed6552f KG |
68 | struct lmb { |
69 | struct lmb_region memory; | |
70 | struct lmb_region reserved; | |
5e2548c1 | 71 | #ifdef CONFIG_LMB_MEMORY_REGIONS |
6d66502b PD |
72 | struct lmb_property memory_regions[CONFIG_LMB_MEMORY_REGIONS]; |
73 | struct lmb_property reserved_regions[CONFIG_LMB_RESERVED_REGIONS]; | |
74 | #endif | |
4ed6552f KG |
75 | }; |
76 | ||
951a8c48 HS |
77 | void lmb_init(struct lmb *lmb); |
78 | void lmb_init_and_reserve(struct lmb *lmb, struct bd_info *bd, void *fdt_blob); | |
79 | void lmb_init_and_reserve_range(struct lmb *lmb, phys_addr_t base, | |
80 | phys_size_t size, void *fdt_blob); | |
81 | long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size); | |
82 | long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size); | |
59c0ea5d PD |
83 | /** |
84 | * lmb_reserve_flags - Reserve one region with a specific flags bitfield. | |
85 | * | |
4ad4c2da HS |
86 | * @lmb: the logical memory block struct |
87 | * @base: base address of the memory region | |
88 | * @size: size of the memory region | |
89 | * @flags: flags for the memory region | |
90 | * Return: 0 if OK, > 0 for coalesced region or a negative error code. | |
59c0ea5d PD |
91 | */ |
92 | long lmb_reserve_flags(struct lmb *lmb, phys_addr_t base, | |
93 | phys_size_t size, enum lmb_flags flags); | |
951a8c48 HS |
94 | phys_addr_t lmb_alloc(struct lmb *lmb, phys_size_t size, ulong align); |
95 | phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, | |
96 | phys_addr_t max_addr); | |
97 | phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, | |
98 | phys_addr_t max_addr); | |
99 | phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base, phys_size_t size); | |
100 | phys_size_t lmb_get_free_size(struct lmb *lmb, phys_addr_t addr); | |
101 | int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr); | |
e359a4a5 PD |
102 | /** |
103 | * lmb_is_reserved_flags - test if tha address is in reserved region with a bitfield flag | |
104 | * | |
4ad4c2da HS |
105 | * @lmb: the logical memory block struct |
106 | * @addr: address to be tested | |
107 | * @flags: flags bitfied to be tested | |
108 | * Return: if not reserved or reserved without the requested flag else 1 | |
e359a4a5 PD |
109 | */ |
110 | int lmb_is_reserved_flags(struct lmb *lmb, phys_addr_t addr, int flags); | |
951a8c48 | 111 | long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size); |
4ed6552f | 112 | |
951a8c48 HS |
113 | void lmb_dump_all(struct lmb *lmb); |
114 | void lmb_dump_all_force(struct lmb *lmb); | |
4ed6552f | 115 | |
a16028da MF |
116 | void board_lmb_reserve(struct lmb *lmb); |
117 | void arch_lmb_reserve(struct lmb *lmb); | |
1274698d | 118 | void arch_lmb_reserve_generic(struct lmb *lmb, ulong sp, ulong end, ulong align); |
a16028da | 119 | |
4ed6552f KG |
120 | #endif /* __KERNEL__ */ |
121 | ||
122 | #endif /* _LINUX_LMB_H */ |