LCOV - code coverage report
Current view: top level - zephyr/multi_heap - shared_multi_heap.h Hit Total Coverage
Test: new.info Lines: 12 12 100.0 %
Date: 2024-12-22 00:14:23

          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 1.14