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_ */