blob: ea5367fa61a37abb9280f32e7e46032438f59baa [file] [log] [blame]
/*
* 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_ */