Line data Source code
1 0 : /*
2 : * Copyright (c) 2023 Carlo Caione, <ccaione@baylibre.com>
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_MEM_ATTR_HEAP_H_
8 : #define ZEPHYR_INCLUDE_MEM_ATTR_HEAP_H_
9 :
10 : /**
11 : * @brief Memory heaps based on memory attributes
12 : * @defgroup memory_attr_heap Memory heaps based on memory attributes
13 : * @ingroup mem_mgmt
14 : * @{
15 : */
16 :
17 : #include <zephyr/mem_mgmt/mem_attr.h>
18 :
19 : #ifdef __cplusplus
20 : extern "C" {
21 : #endif
22 :
23 : /**
24 : * @brief Init the memory pool
25 : *
26 : * This must be the first function to be called to initialize the memory pools
27 : * from all the memory regions with the a software attribute.
28 : *
29 : * @retval 0 on success.
30 : * @retval -EALREADY if the pool was already initialized.
31 : * @retval -ENOMEM too many regions already allocated.
32 : */
33 1 : int mem_attr_heap_pool_init(void);
34 :
35 : /**
36 : * @brief Allocate memory with a specified attribute and size.
37 : *
38 : * Allocates a block of memory of the specified size in bytes and with a
39 : * specified capability / attribute. The attribute is used to select the
40 : * correct memory heap to allocate memory from.
41 : *
42 : * @param attr capability / attribute requested for the memory block.
43 : * @param bytes requested size of the allocation in bytes.
44 : *
45 : * @retval ptr a valid pointer to the allocated memory.
46 : * @retval NULL if no memory is available with that attribute and size.
47 : */
48 1 : void *mem_attr_heap_alloc(uint32_t attr, size_t bytes);
49 :
50 : /**
51 : * @brief Allocate aligned memory with a specified attribute, size and alignment.
52 : *
53 : * Allocates a block of memory of the specified size in bytes and with a
54 : * specified capability / attribute. Takes an additional parameter specifying a
55 : * power of two alignment in bytes.
56 : *
57 : * @param attr capability / attribute requested for the memory block.
58 : * @param align power of two alignment for the returned pointer in bytes.
59 : * @param bytes requested size of the allocation in bytes.
60 : *
61 : * @retval ptr a valid pointer to the allocated memory.
62 : * @retval NULL if no memory is available with that attribute and size.
63 : */
64 1 : void *mem_attr_heap_aligned_alloc(uint32_t attr, size_t align, size_t bytes);
65 :
66 : /**
67 : * @brief Free the allocated memory
68 : *
69 : * Used to free the passed block of memory that must be the return value of a
70 : * previously call to @ref mem_attr_heap_alloc or @ref
71 : * mem_attr_heap_aligned_alloc.
72 : *
73 : * @param block block to free, must be a pointer to a block allocated by
74 : * @ref mem_attr_heap_alloc or @ref mem_attr_heap_aligned_alloc.
75 : */
76 1 : void mem_attr_heap_free(void *block);
77 :
78 : /**
79 : * @brief Get a specific memory region descriptor for a provided address
80 : *
81 : * Finds the memory region descriptor struct controlling the provided pointer.
82 : *
83 : * @param addr address to be found, must be a pointer to a block allocated by
84 : * @ref mem_attr_heap_alloc or @ref mem_attr_heap_aligned_alloc.
85 : *
86 : * @retval str pointer to a memory region structure the address belongs to.
87 : */
88 1 : const struct mem_attr_region_t *mem_attr_heap_get_region(void *addr);
89 :
90 : #ifdef __cplusplus
91 : }
92 : #endif
93 :
94 : /**
95 : * @}
96 : */
97 :
98 : #endif /* ZEPHYR_INCLUDE_MEM_ATTR_HEAP_H_ */
|