xref: /dpdk/drivers/net/mlx5/hws/mlx5dr_pool.h (revision c6723ca486555167b7e5bc78737ebfa6e52cb799)
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