/* * Copyright (c) 2021 Carlo Caione, * * 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_ */