LCOV - code coverage report
Current view: top level - drivers/net/mlx5/hws - mlx5dr_pool.h (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 2 0.0 %
Date: 2025-02-01 18:54:23 Functions: 0 0 -
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 8 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright (c) 2022 NVIDIA Corporation & Affiliates
       3                 :            :  */
       4                 :            : 
       5                 :            : #ifndef MLX5DR_POOL_H_
       6                 :            : #define MLX5DR_POOL_H_
       7                 :            : 
       8                 :            : enum mlx5dr_pool_type {
       9                 :            :         MLX5DR_POOL_TYPE_STE,
      10                 :            :         MLX5DR_POOL_TYPE_STC,
      11                 :            : };
      12                 :            : 
      13                 :            : #define MLX5DR_POOL_STC_LOG_SZ 15
      14                 :            : 
      15                 :            : #define MLX5DR_POOL_RESOURCE_ARR_SZ 100
      16                 :            : 
      17                 :            : struct mlx5dr_pool_chunk {
      18                 :            :         uint32_t resource_idx;
      19                 :            :         /* Internal offset, relative to base index */
      20                 :            :         int      offset;
      21                 :            :         int      order;
      22                 :            : };
      23                 :            : 
      24                 :            : struct mlx5dr_pool_resource {
      25                 :            :         struct mlx5dr_pool *pool;
      26                 :            :         struct mlx5dr_devx_obj *devx_obj;
      27                 :            :         uint32_t base_id;
      28                 :            :         uint32_t range;
      29                 :            : };
      30                 :            : 
      31                 :            : enum mlx5dr_pool_flags {
      32                 :            :         /* Only a one resource in that pool */
      33                 :            :         MLX5DR_POOL_FLAGS_ONE_RESOURCE = 1 << 0,
      34                 :            :         MLX5DR_POOL_FLAGS_RELEASE_FREE_RESOURCE = 1 << 1,
      35                 :            :         /* No sharing resources between chunks */
      36                 :            :         MLX5DR_POOL_FLAGS_RESOURCE_PER_CHUNK = 1 << 2,
      37                 :            :         /* All objects are in the same size */
      38                 :            :         MLX5DR_POOL_FLAGS_FIXED_SIZE_OBJECTS = 1 << 3,
      39                 :            :         /* Manged by buddy allocator */
      40                 :            :         MLX5DR_POOL_FLAGS_BUDDY_MANAGED = 1 << 4,
      41                 :            :         /* Allocate pool_type memory on pool creation */
      42                 :            :         MLX5DR_POOL_FLAGS_ALLOC_MEM_ON_CREATE = 1 << 5,
      43                 :            : 
      44                 :            :         /* These values should be used by the caller */
      45                 :            :         MLX5DR_POOL_FLAGS_FOR_STC_POOL =
      46                 :            :                 MLX5DR_POOL_FLAGS_ONE_RESOURCE |
      47                 :            :                 MLX5DR_POOL_FLAGS_FIXED_SIZE_OBJECTS,
      48                 :            :         MLX5DR_POOL_FLAGS_FOR_MATCHER_STE_POOL =
      49                 :            :                 MLX5DR_POOL_FLAGS_RELEASE_FREE_RESOURCE |
      50                 :            :                 MLX5DR_POOL_FLAGS_RESOURCE_PER_CHUNK,
      51                 :            :         MLX5DR_POOL_FLAGS_FOR_STE_ACTION_POOL =
      52                 :            :                 MLX5DR_POOL_FLAGS_ONE_RESOURCE |
      53                 :            :                 MLX5DR_POOL_FLAGS_BUDDY_MANAGED |
      54                 :            :                 MLX5DR_POOL_FLAGS_ALLOC_MEM_ON_CREATE,
      55                 :            : };
      56                 :            : 
      57                 :            : enum mlx5dr_pool_optimize {
      58                 :            :         MLX5DR_POOL_OPTIMIZE_NONE = 0x0,
      59                 :            :         MLX5DR_POOL_OPTIMIZE_ORIG = 0x1,
      60                 :            :         MLX5DR_POOL_OPTIMIZE_MIRROR = 0x2,
      61                 :            : };
      62                 :            : 
      63                 :            : struct mlx5dr_pool_attr {
      64                 :            :         enum mlx5dr_pool_type pool_type;
      65                 :            :         enum mlx5dr_table_type table_type;
      66                 :            :         enum mlx5dr_pool_flags flags;
      67                 :            :         enum mlx5dr_pool_optimize opt_type;
      68                 :            :         /* Allocation size once memory is depleted */
      69                 :            :         size_t alloc_log_sz;
      70                 :            : };
      71                 :            : 
      72                 :            : enum mlx5dr_db_type {
      73                 :            :         /* Uses for allocating chunk of big memory, each element has its own resource in the FW*/
      74                 :            :         MLX5DR_POOL_DB_TYPE_GENERAL_SIZE,
      75                 :            :         /* One resource only, all the elements are with same one size */
      76                 :            :         MLX5DR_POOL_DB_TYPE_ONE_SIZE_RESOURCE,
      77                 :            :         /* Many resources, the memory allocated with buddy mechanism */
      78                 :            :         MLX5DR_POOL_DB_TYPE_BUDDY,
      79                 :            : };
      80                 :            : 
      81                 :            : struct mlx5dr_buddy_manager {
      82                 :            :         struct mlx5dr_buddy_mem *buddies[MLX5DR_POOL_RESOURCE_ARR_SZ];
      83                 :            : };
      84                 :            : 
      85                 :            : struct mlx5dr_pool_elements {
      86                 :            :         uint32_t num_of_elements;
      87                 :            :         struct rte_bitmap *bitmap;
      88                 :            :         bool is_full;
      89                 :            : };
      90                 :            : 
      91                 :            : struct mlx5dr_element_manager {
      92                 :            :         struct mlx5dr_pool_elements *elements[MLX5DR_POOL_RESOURCE_ARR_SZ];
      93                 :            : };
      94                 :            : 
      95                 :            : struct mlx5dr_pool_db {
      96                 :            :         enum mlx5dr_db_type type;
      97                 :            :         union {
      98                 :            :                 struct mlx5dr_element_manager *element_manager;
      99                 :            :                 struct mlx5dr_buddy_manager *buddy_manager;
     100                 :            :         };
     101                 :            : };
     102                 :            : 
     103                 :            : typedef int (*mlx5dr_pool_db_get_chunk)(struct mlx5dr_pool *pool,
     104                 :            :                                         struct mlx5dr_pool_chunk *chunk);
     105                 :            : typedef void (*mlx5dr_pool_db_put_chunk)(struct mlx5dr_pool *pool,
     106                 :            :                                          struct mlx5dr_pool_chunk *chunk);
     107                 :            : typedef void (*mlx5dr_pool_unint_db)(struct mlx5dr_pool *pool);
     108                 :            : 
     109                 :            : struct mlx5dr_pool {
     110                 :            :         struct mlx5dr_context *ctx;
     111                 :            :         enum mlx5dr_pool_type type;
     112                 :            :         enum mlx5dr_pool_flags flags;
     113                 :            :         pthread_spinlock_t lock;
     114                 :            :         size_t alloc_log_sz;
     115                 :            :         enum mlx5dr_table_type tbl_type;
     116                 :            :         enum mlx5dr_pool_optimize opt_type;
     117                 :            :         struct mlx5dr_pool_resource *resource[MLX5DR_POOL_RESOURCE_ARR_SZ];
     118                 :            :         struct mlx5dr_pool_resource *mirror_resource[MLX5DR_POOL_RESOURCE_ARR_SZ];
     119                 :            :         /* DB */
     120                 :            :         struct mlx5dr_pool_db db;
     121                 :            :         /* Functions */
     122                 :            :         mlx5dr_pool_unint_db p_db_uninit;
     123                 :            :         mlx5dr_pool_db_get_chunk p_get_chunk;
     124                 :            :         mlx5dr_pool_db_put_chunk p_put_chunk;
     125                 :            : };
     126                 :            : 
     127                 :            : struct mlx5dr_pool *
     128                 :            : mlx5dr_pool_create(struct mlx5dr_context *ctx,
     129                 :            :                    struct mlx5dr_pool_attr *pool_attr);
     130                 :            : 
     131                 :            : int mlx5dr_pool_destroy(struct mlx5dr_pool *pool);
     132                 :            : 
     133                 :            : int mlx5dr_pool_chunk_alloc(struct mlx5dr_pool *pool,
     134                 :            :                             struct mlx5dr_pool_chunk *chunk);
     135                 :            : 
     136                 :            : void mlx5dr_pool_chunk_free(struct mlx5dr_pool *pool,
     137                 :            :                             struct mlx5dr_pool_chunk *chunk);
     138                 :            : 
     139                 :            : static inline struct mlx5dr_devx_obj *
     140                 :            : mlx5dr_pool_chunk_get_base_devx_obj(struct mlx5dr_pool *pool,
     141                 :            :                                     struct mlx5dr_pool_chunk *chunk)
     142                 :            : {
     143   [ #  #  #  #  :          0 :         return pool->resource[chunk->resource_idx]->devx_obj;
                   #  # ]
     144                 :            : }
     145                 :            : 
     146                 :            : static inline struct mlx5dr_devx_obj *
     147                 :            : mlx5dr_pool_chunk_get_base_devx_obj_mirror(struct mlx5dr_pool *pool,
     148                 :            :                                            struct mlx5dr_pool_chunk *chunk)
     149                 :            : {
     150         [ #  # ]:          0 :         return pool->mirror_resource[chunk->resource_idx]->devx_obj;
     151                 :            : }
     152                 :            : #endif /* MLX5DR_POOL_H_ */

Generated by: LCOV version 1.14