Line data Source code
1 1 : /*
2 : * Copyright (c) 2021 Carlo Caione, <ccaione@baylibre.com>
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief Public API for Shared Multi-Heap framework
10 : */
11 :
12 : #ifndef ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_
13 : #define ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_
14 :
15 : #ifdef __cplusplus
16 : extern "C" {
17 : #endif
18 :
19 : /**
20 : * @brief Heap Management
21 : * @defgroup heaps Heap Management
22 : * @ingroup os_services
23 : * @{
24 : * @}
25 : */
26 :
27 : /**
28 : * @brief Shared Multi-Heap (SMH) interface
29 : * @defgroup shared_multi_heap Shared multi-heap interface
30 : * @ingroup heaps
31 : * @{
32 : *
33 : * The shared multi-heap manager uses the multi-heap allocator to manage a set
34 : * of memory regions with different capabilities / attributes (cacheable,
35 : * non-cacheable, etc...).
36 : *
37 : * All the different regions can be added at run-time to the shared multi-heap
38 : * pool providing an opaque "attribute" value (an integer or enum value) that
39 : * can be used by drivers or applications to request memory with certain
40 : * capabilities.
41 : *
42 : * This framework is commonly used as follow:
43 : *
44 : * - At boot time some platform code initialize the shared multi-heap
45 : * framework using @ref shared_multi_heap_pool_init and add the memory
46 : * regions to the pool with @ref shared_multi_heap_add, possibly gathering
47 : * the needed information for the regions from the DT.
48 : *
49 : * - Each memory region encoded in a @ref shared_multi_heap_region structure.
50 : * This structure is also carrying an opaque and user-defined integer value
51 : * that is used to define the region capabilities (for example:
52 : * cacheability, cpu affinity, etc...)
53 : *
54 : * - When a driver or application needs some dynamic memory with a certain
55 : * capability, it can use @ref shared_multi_heap_alloc (or the aligned
56 : * version) to request the memory by using the opaque parameter to select
57 : * the correct set of attributes for the needed memory. The framework will
58 : * take care of selecting the correct heap (thus memory region) to carve
59 : * memory from, based on the opaque parameter and the runtime state of the
60 : * heaps (available memory, heap state, etc...)
61 : */
62 :
63 : /**
64 : * @brief SMH region attributes enumeration type.
65 : *
66 : * Enumeration type for some common memory region attributes.
67 : *
68 : */
69 1 : enum shared_multi_heap_attr {
70 : /** cacheable */
71 : SMH_REG_ATTR_CACHEABLE,
72 :
73 : /** non-cacheable */
74 : SMH_REG_ATTR_NON_CACHEABLE,
75 :
76 : /** external Memory */
77 : SMH_REG_ATTR_EXTERNAL,
78 :
79 : /** must be the last item */
80 : SMH_REG_ATTR_NUM,
81 : };
82 :
83 : /** Maximum number of standard attributes. */
84 1 : #define MAX_SHARED_MULTI_HEAP_ATTR SMH_REG_ATTR_NUM
85 :
86 : /**
87 : * @brief SMH region struct
88 : *
89 : * This struct is carrying information about the memory region to be added in
90 : * the multi-heap pool.
91 : */
92 1 : struct shared_multi_heap_region {
93 : /** Memory heap attribute */
94 1 : uint32_t attr;
95 :
96 : /** Memory heap starting virtual address */
97 1 : uintptr_t addr;
98 :
99 : /** Memory heap size in bytes */
100 1 : size_t size;
101 : };
102 :
103 : /**
104 : * @brief Init the pool
105 : *
106 : * This must be the first function to be called to initialize the shared
107 : * multi-heap pool. All the individual heaps must be added later with @ref
108 : * shared_multi_heap_add.
109 : *
110 : * @note As for the generic multi-heap allocator the expectation is that this
111 : * function will be called at soc- or board-level.
112 : *
113 : * @retval 0 on success.
114 : * @retval -EALREADY when the pool was already inited.
115 : * @retval other errno codes
116 : */
117 1 : int shared_multi_heap_pool_init(void);
118 :
119 : /**
120 : * @brief Allocate memory from the memory shared multi-heap pool
121 : *
122 : * Allocates a block of memory of the specified size in bytes and with a
123 : * specified capability / attribute. The opaque attribute parameter is used
124 : * by the backend to select the correct heap to allocate memory from.
125 : *
126 : * @param attr capability / attribute requested for the memory block.
127 : * @param bytes requested size of the allocation in bytes.
128 : *
129 : * @retval ptr a valid pointer to heap memory.
130 : * @retval err NULL if no memory is available.
131 : */
132 1 : void *shared_multi_heap_alloc(enum shared_multi_heap_attr attr, size_t bytes);
133 :
134 : /**
135 : * @brief Allocate aligned memory from the memory shared multi-heap pool
136 : *
137 : * Allocates a block of memory of the specified size in bytes and with a
138 : * specified capability / attribute. Takes an additional parameter specifying a
139 : * power of two alignment in bytes.
140 : *
141 : * @param attr capability / attribute requested for the memory block.
142 : * @param align power of two alignment for the returned pointer, in bytes.
143 : * @param bytes requested size of the allocation in bytes.
144 : *
145 : * @retval ptr a valid pointer to heap memory.
146 : * @retval err NULL if no memory is available.
147 : */
148 1 : void *shared_multi_heap_aligned_alloc(enum shared_multi_heap_attr attr,
149 : size_t align, size_t bytes);
150 :
151 : /**
152 : * @brief Free memory from the shared multi-heap pool
153 : *
154 : * Used to free the passed block of memory that must be the return value of a
155 : * previously call to @ref shared_multi_heap_alloc or @ref
156 : * shared_multi_heap_aligned_alloc.
157 : *
158 : * @param block block to free, must be a pointer to a block allocated
159 : * by shared_multi_heap_alloc or
160 : * shared_multi_heap_aligned_alloc.
161 : */
162 1 : void shared_multi_heap_free(void *block);
163 :
164 : /**
165 : * @brief Add an heap region to the shared multi-heap pool
166 : *
167 : * This adds a shared multi-heap region to the multi-heap pool.
168 : *
169 : * @param user_data pointer to any data for the heap.
170 : * @param region pointer to the memory region to be added.
171 : *
172 : * @retval 0 on success.
173 : * @retval -EINVAL when the region attribute is out-of-bound.
174 : * @retval -ENOMEM when there are no more heaps available.
175 : * @retval other errno codes
176 : */
177 1 : int shared_multi_heap_add(struct shared_multi_heap_region *region, void *user_data);
178 :
179 : /**
180 : * @}
181 : */
182 :
183 : #ifdef __cplusplus
184 : }
185 : #endif
186 :
187 : #endif /* ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_ */
|