/*
 * 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 Shared Multi-Heap (SMH) 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 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_ */
