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