blob: 864ed6bf4da09419207c31f1aab668aad7ff6ffc [file] [log] [blame]
/*
* Copyright (c) 2021 Carlo Caione, <ccaione@baylibre.com>
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief Public API for Shared Multi-Heap framework
*/
#ifndef ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_
#define ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Heap Management
* @defgroup heaps Heap Management
* @{
* @}
*/
/**
* @brief Shared Multi-Heap (SMH) interface
* @defgroup shared_multi_heap Shared multi-heap interface
* @ingroup heaps
* @{
*
* The shared multi-heap manager uses the multi-heap allocator to manage a set
* of memory regions with different capabilities / attributes (cacheable,
* non-cacheable, etc...).
*
* All the different regions can be added at run-time to the shared multi-heap
* pool providing an opaque "attribute" value (an integer or enum value) that
* can be used by drivers or applications to request memory with certain
* capabilities.
*
* This framework is commonly used as follow:
*
* - At boot time some platform code initialize the shared multi-heap
* framework using @ref shared_multi_heap_pool_init and add the memory
* regions to the pool with @ref shared_multi_heap_add, possibly gathering
* the needed information for the regions from the DT.
*
* - Each memory region encoded in a @ref shared_multi_heap_region structure.
* This structure is also carrying an opaque and user-defined integer value
* that is used to define the region capabilities (for example:
* cacheability, cpu affinity, etc...)
*
* - When a driver or application needs some dynamic memory with a certain
* capability, it can use @ref shared_multi_heap_alloc (or the aligned
* version) to request the memory by using the opaque parameter to select
* the correct set of attributes for the needed memory. The framework will
* take care of selecting the correct heap (thus memory region) to carve
* memory from, based on the opaque parameter and the runtime state of the
* heaps (available memory, heap state, etc...)
*/
/**
* @brief SMH region attributes enumeration type.
*
* Enumeration type for some common memory region attributes.
*
*/
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,
};
/** Maximum number of standard attributes. */
#define MAX_SHARED_MULTI_HEAP_ATTR 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.
*/
struct shared_multi_heap_region {
/** Memory heap attribute */
unsigned int attr;
/** Memory heap starting virtual address */
uintptr_t addr;
/** Memory heap size in bytes */
size_t size;
};
/**
* @brief Init the pool
*
* This must be the first function to be called to initialize the shared
* multi-heap pool. All the individual heaps must be added later with @ref
* shared_multi_heap_add.
*
* @note As for the generic multi-heap allocator the expectation is that this
* function will be called at soc- or board-level.
*
* @retval 0 on success.
* @retval -EALREADY when the pool was already inited.
* @retval other errno codes
*/
int shared_multi_heap_pool_init(void);
/**
* @brief Allocate memory from the memory shared multi-heap pool
*
* Allocates a block of memory of the specified size in bytes and with a
* specified capability / attribute. The opaque attribute parameter is used
* by the backend to select the correct heap to allocate memory from.
*
* @param attr capability / attribute requested for the memory block.
* @param bytes requested size of the allocation in bytes.
*
* @retval ptr a valid pointer to heap memory.
* @retval err NULL if no memory is available.
*/
void *shared_multi_heap_alloc(unsigned int attr, size_t bytes);
/**
* @brief Allocate aligned memory from the memory shared multi-heap pool
*
* Allocates a block of memory of the specified size in bytes and with a
* specified capability / attribute. Takes an additional parameter specifying a
* power of two alignment in bytes.
*
* @param attr capability / attribute requested for the memory block.
* @param align power of two alignment for the returned pointer, in bytes.
* @param bytes requested size of the allocation in bytes.
*
* @retval ptr a valid pointer to heap memory.
* @retval err NULL if no memory is available.
*/
void *shared_multi_heap_aligned_alloc(unsigned int attr, size_t align, size_t bytes);
/**
* @brief Free memory from the shared multi-heap pool
*
* Used to free the passed block of memory that must be the return value of a
* previously call to @ref shared_multi_heap_alloc or @ref
* shared_multi_heap_aligned_alloc.
*
* @param block block to free, must be a pointer to a block allocated
* by shared_multi_heap_alloc or
* shared_multi_heap_aligned_alloc.
*/
void shared_multi_heap_free(void *block);
/**
* @brief Add an heap region to the shared multi-heap pool
*
* This adds a shared multi-heap region to the multi-heap pool.
*
* @param user_data pointer to any data for the heap.
* @param region pointer to the memory region to be added.
*
* @retval 0 on success.
* @retval -EINVAL when the region attribute is out-of-bound.
* @retval -ENOMEM when there are no more heaps available.
* @retval other errno codes
*/
int shared_multi_heap_add(struct shared_multi_heap_region *region, void *user_data);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_ */