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 *
mlx5dr_pool_chunk_get_base_devx_obj(struct mlx5dr_pool * pool,struct mlx5dr_pool_chunk * chunk)140 mlx5dr_pool_chunk_get_base_devx_obj(struct mlx5dr_pool *pool,
141 struct mlx5dr_pool_chunk *chunk)
142 {
143 return pool->resource[chunk->resource_idx]->devx_obj;
144 }
145
146 static inline struct mlx5dr_devx_obj *
mlx5dr_pool_chunk_get_base_devx_obj_mirror(struct mlx5dr_pool * pool,struct mlx5dr_pool_chunk * chunk)147 mlx5dr_pool_chunk_get_base_devx_obj_mirror(struct mlx5dr_pool *pool,
148 struct mlx5dr_pool_chunk *chunk)
149 {
150 return pool->mirror_resource[chunk->resource_idx]->devx_obj;
151 }
152 #endif /* MLX5DR_POOL_H_ */
153