123 lines
3.3 KiB
C
123 lines
3.3 KiB
C
/*
|
|
* 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_ */
|