You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.3 KiB
122 lines
3.3 KiB
/* |
|
* Copyright (c) 2021 Carlo Caione, <ccaione@baylibre.com> |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#ifndef ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_ |
|
#define ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_ |
|
|
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
/** |
|
* @brief Shared multi-heap interface |
|
* @defgroup shared_multi_heap Shared multi-heap interface |
|
* @ingroup multi_heap |
|
* @{ |
|
* |
|
* The shared multi-heap manager uses the multi-heap allocator to manage a set |
|
* of reserved memory regions with different capabilities / attributes |
|
* (cacheable, non-cacheable, etc...) defined in the DT. |
|
* |
|
* The user can request allocation from the shared pool specifying the |
|
* capability / attribute of interest for the memory (cacheable / non-cacheable |
|
* memory, etc...) |
|
* |
|
*/ |
|
|
|
/** |
|
* @brief Memory region attributes / capabilities |
|
* |
|
* ** This list needs to be kept in sync with shared-multi-heap.yaml ** |
|
*/ |
|
enum smh_reg_attr { |
|
/** cacheable */ |
|
SMH_REG_ATTR_CACHEABLE, |
|
|
|
/** non-cacheable */ |
|
SMH_REG_ATTR_NON_CACHEABLE, |
|
|
|
/** must be the last item */ |
|
SMH_REG_ATTR_NUM, |
|
}; |
|
|
|
/** |
|
* @brief SMH region struct |
|
* |
|
* This struct is carrying information about the memory region to be added in |
|
* the multi-heap pool. This is filled by the manager with the information |
|
* coming from the reserved memory children nodes in the DT. |
|
*/ |
|
struct shared_multi_heap_region { |
|
enum smh_reg_attr attr; |
|
uintptr_t addr; |
|
size_t size; |
|
}; |
|
|
|
/** |
|
* @brief Region init function |
|
* |
|
* This is a user-provided function whose responsibility is to setup or |
|
* initialize the memory region passed in input before this is added to the |
|
* heap pool by the shared multi-heap manager. This function can be used by |
|
* architectures using MMU / MPU that must correctly map the region before this |
|
* is considered valid and accessible. |
|
* |
|
* @param reg Pointer to the SMH region structure. |
|
* @param v_addr Virtual address obtained after mapping. For non-MMU |
|
* architectures this value is the physical address of the |
|
* region. |
|
* @param size Size of the region after mapping. |
|
* |
|
* @return True if the region is ready to be added to the heap pool. |
|
* False if the region must be skipped. |
|
*/ |
|
typedef bool (*smh_init_reg_fn_t)(struct shared_multi_heap_region *reg, |
|
uint8_t **v_addr, size_t *size); |
|
|
|
|
|
/** |
|
* @brief Init the pool |
|
* |
|
* Initialize the shared multi-heap pool and hook-up the region init function. |
|
* |
|
* @param smh_init_reg_fn The function pointer to the region init function. Can |
|
* be NULL for non-MPU / non-MMU architectures. |
|
*/ |
|
int shared_multi_heap_pool_init(smh_init_reg_fn_t smh_init_reg_fn); |
|
|
|
/** |
|
* @brief Allocate memory from the memory shared multi-heap pool |
|
* |
|
* Allocate a block of memory of the specified size in bytes and with a |
|
* specified capability / attribute. |
|
* |
|
* @param attr Capability / attribute requested for the memory block. |
|
* @param bytes Requested size of the allocation in bytes. |
|
* |
|
* @return A valid pointer to heap memory or NULL if no memory is available. |
|
*/ |
|
void *shared_multi_heap_alloc(enum smh_reg_attr attr, size_t bytes); |
|
|
|
/** |
|
* @brief Free memory from the shared multi-heap pool |
|
* |
|
* Free the passed block of memory. |
|
* |
|
* @param block Block to free. |
|
*/ |
|
void shared_multi_heap_free(void *block); |
|
|
|
/** |
|
* @} |
|
*/ |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif /* ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_ */
|
|
|