LCOV - code coverage report
Current view: top level - zephyr/multi_heap - shared_multi_heap.h Coverage Total Hit
Test: new.info Lines: 100.0 % 12 12
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            1 : /*
       2              :  * Copyright (c) 2021 Carlo Caione, <ccaione@baylibre.com>
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : 
       7              : /**
       8              :  * @file
       9              :  * @brief Public API for Shared Multi-Heap framework
      10              :  */
      11              : 
      12              : #ifndef ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_
      13              : #define ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_
      14              : 
      15              : #ifdef __cplusplus
      16              : extern "C" {
      17              : #endif
      18              : 
      19              : /**
      20              :  * @brief Heap Management
      21              :  * @defgroup heaps Heap Management
      22              :  * @ingroup os_services
      23              :  * @{
      24              :  * @}
      25              :  */
      26              : 
      27              : /**
      28              :  * @brief Shared Multi-Heap (SMH) interface
      29              :  * @defgroup shared_multi_heap Shared multi-heap interface
      30              :  * @ingroup heaps
      31              :  * @{
      32              :  *
      33              :  * The shared multi-heap manager uses the multi-heap allocator to manage a set
      34              :  * of memory regions with different capabilities / attributes (cacheable,
      35              :  * non-cacheable, etc...).
      36              :  *
      37              :  * All the different regions can be added at run-time to the shared multi-heap
      38              :  * pool providing an opaque "attribute" value (an integer or enum value) that
      39              :  * can be used by drivers or applications to request memory with certain
      40              :  * capabilities.
      41              :  *
      42              :  * This framework is commonly used as follow:
      43              :  *
      44              :  *  - At boot time some platform code initialize the shared multi-heap
      45              :  *    framework using @ref shared_multi_heap_pool_init and add the memory
      46              :  *    regions to the pool with @ref shared_multi_heap_add, possibly gathering
      47              :  *    the needed information for the regions from the DT.
      48              :  *
      49              :  *  - Each memory region encoded in a @ref shared_multi_heap_region structure.
      50              :  *    This structure is also carrying an opaque and user-defined integer value
      51              :  *    that is used to define the region capabilities (for example:
      52              :  *    cacheability, cpu affinity, etc...)
      53              :  *
      54              :  *  - When a driver or application needs some dynamic memory with a certain
      55              :  *    capability, it can use @ref shared_multi_heap_alloc (or the aligned
      56              :  *    version) to request the memory by using the opaque parameter to select
      57              :  *    the correct set of attributes for the needed memory. The framework will
      58              :  *    take care of selecting the correct heap (thus memory region) to carve
      59              :  *    memory from, based on the opaque parameter and the runtime state of the
      60              :  *    heaps (available memory, heap state, etc...)
      61              :  */
      62              : 
      63              : /**
      64              :  * @brief SMH region attributes enumeration type.
      65              :  *
      66              :  * Enumeration type for some common memory region attributes.
      67              :  *
      68              :  */
      69            1 : enum shared_multi_heap_attr {
      70              :         /** cacheable */
      71              :         SMH_REG_ATTR_CACHEABLE,
      72              : 
      73              :         /** non-cacheable */
      74              :         SMH_REG_ATTR_NON_CACHEABLE,
      75              : 
      76              :         /** external Memory */
      77              :         SMH_REG_ATTR_EXTERNAL,
      78              : 
      79              :         /** must be the last item */
      80              :         SMH_REG_ATTR_NUM,
      81              : };
      82              : 
      83              : /** Maximum number of standard attributes. */
      84            1 : #define MAX_SHARED_MULTI_HEAP_ATTR SMH_REG_ATTR_NUM
      85              : 
      86              : /**
      87              :  * @brief SMH region struct
      88              :  *
      89              :  * This struct is carrying information about the memory region to be added in
      90              :  * the multi-heap pool.
      91              :  */
      92            1 : struct shared_multi_heap_region {
      93              :         /** Memory heap attribute */
      94            1 :         uint32_t attr;
      95              : 
      96              :         /** Memory heap starting virtual address */
      97            1 :         uintptr_t addr;
      98              : 
      99              :         /** Memory heap size in bytes */
     100            1 :         size_t size;
     101              : };
     102              : 
     103              : /**
     104              :  * @brief Init the pool
     105              :  *
     106              :  * This must be the first function to be called to initialize the shared
     107              :  * multi-heap pool. All the individual heaps must be added later with @ref
     108              :  * shared_multi_heap_add.
     109              :  *
     110              :  * @note As for the generic multi-heap allocator the expectation is that this
     111              :  * function will be called at soc- or board-level.
     112              :  *
     113              :  * @retval 0            on success.
     114              :  * @retval -EALREADY    when the pool was already inited.
     115              :  * @retval other        errno codes
     116              :  */
     117            1 : int shared_multi_heap_pool_init(void);
     118              : 
     119              : /**
     120              :  * @brief Allocate memory from the memory shared multi-heap pool
     121              :  *
     122              :  * Allocates a block of memory of the specified size in bytes and with a
     123              :  * specified capability / attribute. The opaque attribute parameter is used
     124              :  * by the backend to select the correct heap to allocate memory from.
     125              :  *
     126              :  * @param attr          capability / attribute requested for the memory block.
     127              :  * @param bytes         requested size of the allocation in bytes.
     128              :  *
     129              :  * @retval ptr          a valid pointer to heap memory.
     130              :  * @retval err          NULL if no memory is available.
     131              :  */
     132            1 : void *shared_multi_heap_alloc(enum shared_multi_heap_attr attr, size_t bytes);
     133              : 
     134              : /**
     135              :  * @brief Allocate aligned memory from the memory shared multi-heap pool
     136              :  *
     137              :  * Allocates a block of memory of the specified size in bytes and with a
     138              :  * specified capability / attribute. Takes an additional parameter specifying a
     139              :  * power of two alignment in bytes.
     140              :  *
     141              :  * @param attr          capability / attribute requested for the memory block.
     142              :  * @param align         power of two alignment for the returned pointer, in bytes.
     143              :  * @param bytes         requested size of the allocation in bytes.
     144              :  *
     145              :  * @retval ptr          a valid pointer to heap memory.
     146              :  * @retval err          NULL if no memory is available.
     147              :  */
     148            1 : void *shared_multi_heap_aligned_alloc(enum shared_multi_heap_attr attr,
     149              :                                       size_t align, size_t bytes);
     150              : 
     151              : /**
     152              :  * @brief Free memory from the shared multi-heap pool
     153              :  *
     154              :  * Used to free the passed block of memory that must be the return value of a
     155              :  * previously call to @ref shared_multi_heap_alloc or @ref
     156              :  * shared_multi_heap_aligned_alloc.
     157              :  *
     158              :  * @param block         block to free, must be a pointer to a block allocated
     159              :  *                      by shared_multi_heap_alloc or
     160              :  *                      shared_multi_heap_aligned_alloc.
     161              :  */
     162            1 : void shared_multi_heap_free(void *block);
     163              : 
     164              : /**
     165              :  * @brief Add an heap region to the shared multi-heap pool
     166              :  *
     167              :  * This adds a shared multi-heap region to the multi-heap pool.
     168              :  *
     169              :  * @param user_data     pointer to any data for the heap.
     170              :  * @param region        pointer to the memory region to be added.
     171              :  *
     172              :  * @retval 0            on success.
     173              :  * @retval -EINVAL      when the region attribute is out-of-bound.
     174              :  * @retval -ENOMEM      when there are no more heaps available.
     175              :  * @retval other        errno codes
     176              :  */
     177            1 : int shared_multi_heap_add(struct shared_multi_heap_region *region, void *user_data);
     178              : 
     179              : /**
     180              :  * @}
     181              :  */
     182              : 
     183              : #ifdef __cplusplus
     184              : }
     185              : #endif
     186              : 
     187              : #endif /* ZEPHYR_INCLUDE_MULTI_HEAP_MANAGER_SMH_H_ */
        

Generated by: LCOV version 2.0-1