Home | History | Annotate | Download | only in include
      1 /*******************************************************************************
      2 * Copyright (C) 2018 Cadence Design Systems, Inc.
      3 *
      4 * Permission is hereby granted, free of charge, to any person obtaining
      5 * a copy of this software and associated documentation files (the
      6 * "Software"), to use this Software with Cadence processor cores only and
      7 * not with any other processors and platforms, subject to
      8 * the following conditions:
      9 *
     10 * The above copyright notice and this permission notice shall be included
     11 * in all copies or substantial portions of the Software.
     12 *
     13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     14 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     15 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     16 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     17 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     18 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     19 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     20 
     21 ******************************************************************************/
     22 
     23 /*******************************************************************************
     24  * xf-mm.h
     25  *
     26  * Generic dynamic memory manager (based on rb-tree index)
     27  *
     28  *******************************************************************************/
     29 
     30 #ifndef __XF_H
     31 #error "xf-mem.h mustn't be included directly"
     32 #endif
     33 
     34 /*******************************************************************************
     35  * Includes
     36  ******************************************************************************/
     37 
     38 /* ...red-black trees library */
     39 #include "lib/rbtree.h"
     40 
     41 /*******************************************************************************
     42  * Cache-line aligned types
     43  ******************************************************************************/
     44 
     45 /* ...proper cache-line alignment */
     46 #define XF_ALIGNED(size)                            \
     47     (((size) + XF_PROXY_ALIGNMENT - 1) & ~(XF_PROXY_ALIGNMENT - 1))
     48 
     49 /* ...cache-line aligned type identifier */
     50 #define XF_ALIGNED_TYPE(type)                       \
     51     __xf_aligned_##type
     52 
     53 /* ...definition of cache-line aligned type */
     54 #define XF_ALIGNED_TYPEDEF(type, name)              \
     55 typedef union                                       \
     56 {                                                   \
     57     /* ...item of original type */                  \
     58     type        __obj;                              \
     59                                                     \
     60     /* ...padding to cache-line */                  \
     61     u8          __pad[XF_ALIGNED(sizeof(type))];    \
     62                                                     \
     63 }   XF_ALIGNED_TYPE(type), name __xf_shmem__
     64 
     65 /* ...accessor to original type */
     66 #define XF_ALIGNED_OBJ(p)                           \
     67     (&(p)->__obj)
     68 
     69 #define XF_IS_ALIGNED(p)                            \
     70     (((u32)(p) & (XF_PROXY_ALIGNMENT - 1)) == 0)
     71 
     72 /*******************************************************************************
     73  * Memory pool description
     74  ******************************************************************************/
     75 
     76 /* ...memory allocator data */
     77 typedef struct xf_mm_pool
     78 {
     79     /* ...free blocks map sorted by block length */
     80     rb_tree_t       l_map;
     81 
     82     /* ...free blocks map sorted by address of the block */
     83     rb_tree_t       a_map;
     84 
     85     /* ...address of memory pool (32-bytes aligned at least); need that? - tbd */
     86     void           *addr;
     87 
     88     /* ...length of the pool (multiple of descriptor size); need that? - tbd */
     89     u32             size;
     90 
     91 }   xf_mm_pool_t;
     92 
     93 /* ...descriptor of free memory block */
     94 typedef struct xf_mm_block
     95 {
     96     /* ...rb-tree node in a block-length map */
     97     rb_node_t       l_node;
     98 
     99     /* ...rb-tree node in a block-address map */
    100     rb_node_t       a_node;
    101 
    102 }   xf_mm_block_t;
    103 
    104 /* ...properly aligned allocation unit */
    105 typedef u8 xf_mm_item[xf_next_power_of_two(sizeof(xf_mm_block_t))];
    106 
    107 /* ...macro to assure proper alignment of dynamically allocated data */
    108 #define XF_MM(size)         (((size) + sizeof(xf_mm_item) - 1) & ~(sizeof(xf_mm_item) - 1))
    109 
    110 /* ...check if memory is properly aligned */
    111 #define XF_MM_ALIGNED(size) (!((size) & (sizeof(xf_mm_item) - 1)))
    112 
    113 /* ...alignement definition */
    114 #define __xf_mm__  __attribute__((__aligned__(sizeof(xf_mm_item))))
    115 
    116 /*******************************************************************************
    117  * Dynamically allocated buffer
    118  ******************************************************************************/
    119 
    120 /* ...memory allocation metadata */
    121 typedef struct xf_mm_buffer
    122 {
    123     /* ...allocation address */
    124     void           *addr;
    125 
    126     /* ...length */
    127     u32             size;
    128 
    129 }   __xf_mm__ xf_mm_buffer_t;
    130 
    131 /*******************************************************************************
    132  * API functions
    133  ******************************************************************************/
    134 
    135 /* ...pool initialization */
    136 extern int      xf_mm_init(xf_mm_pool_t *pool, void *addr, u32 size);
    137 
    138 /* ...block allocation */
    139 extern void *   xf_mm_alloc(xf_mm_pool_t *pool, u32 size);
    140 
    141 /* ...block deallocation */
    142 extern void     xf_mm_free(xf_mm_pool_t *pool, void *addr, u32 size);
    143