blob: 60cf183dd49bae76a56b9f5e18e4810b8aa6ffa7 [file] [log] [blame]
/*
* Copyright (c) 2023 Carlo Caione, <ccaione@baylibre.com>
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_MEM_ATTR_HEAP_H_
#define ZEPHYR_INCLUDE_MEM_ATTR_HEAP_H_
/**
* @brief Memory heaps based on memory attributes
* @defgroup memory_attr_heap Memory heaps based on memory attributes
* @ingroup mem_mgmt
* @{
*/
#include <zephyr/mem_mgmt/mem_attr.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Init the memory pool
*
* This must be the first function to be called to initialize the memory pools
* from all the memory regions with the a software attribute.
*
* @retval 0 on success.
* @retval -EALREADY if the pool was already initialized.
* @retval -ENOMEM too many regions already allocated.
*/
int mem_attr_heap_pool_init(void);
/**
* @brief Allocate memory with a specified attribute and size.
*
* Allocates a block of memory of the specified size in bytes and with a
* specified capability / attribute. The attribute is used to select the
* correct memory 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 the allocated memory.
* @retval NULL if no memory is available with that attribute and size.
*/
void *mem_attr_heap_alloc(uint32_t attr, size_t bytes);
/**
* @brief Allocate aligned memory with a specified attribute, size and alignment.
*
* 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 the allocated memory.
* @retval NULL if no memory is available with that attribute and size.
*/
void *mem_attr_heap_aligned_alloc(uint32_t attr, size_t align, size_t bytes);
/**
* @brief Free the allocated memory
*
* Used to free the passed block of memory that must be the return value of a
* previously call to @ref mem_attr_heap_alloc or @ref
* mem_attr_heap_aligned_alloc.
*
* @param block block to free, must be a pointer to a block allocated by
* @ref mem_attr_heap_alloc or @ref mem_attr_heap_aligned_alloc.
*/
void mem_attr_heap_free(void *block);
/**
* @brief Get a specific memory region descriptor for a provided address
*
* Finds the memory region descriptor struct controlling the provided pointer.
*
* @param addr address to be found, must be a pointer to a block allocated by
* @ref mem_attr_heap_alloc or @ref mem_attr_heap_aligned_alloc.
*
* @retval str pointer to a memory region structure the address belongs to.
*/
const struct mem_attr_region_t *mem_attr_heap_get_region(void *addr);
#ifdef __cplusplus
}
#endif
/**
* @}
*/
#endif /* ZEPHYR_INCLUDE_MEM_ATTR_HEAP_H_ */