xref: /dpdk/drivers/net/mlx5/hws/mlx5dr_context.h (revision 87026d2e66019e23479e916584bc4cfc7b2c0f34)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2022 NVIDIA Corporation & Affiliates
3  */
4 
5 #ifndef MLX5DR_CONTEXT_H_
6 #define MLX5DR_CONTEXT_H_
7 
8 enum mlx5dr_context_flags {
9 	MLX5DR_CONTEXT_FLAG_HWS_SUPPORT = 1 << 0,
10 	MLX5DR_CONTEXT_FLAG_PRIVATE_PD = 1 << 1,
11 	MLX5DR_CONTEXT_FLAG_BWC_SUPPORT = 1 << 2,
12 };
13 
14 enum mlx5dr_context_shared_stc_type {
15 	MLX5DR_CONTEXT_SHARED_STC_DECAP_L3 = 0,
16 	MLX5DR_CONTEXT_SHARED_STC_DOUBLE_POP = 1,
17 	MLX5DR_CONTEXT_SHARED_STC_MAX = 2,
18 };
19 
20 struct mlx5dr_context_common_res {
21 	struct mlx5dr_action_default_stc *default_stc;
22 	struct mlx5dr_action_shared_stc *shared_stc[MLX5DR_CONTEXT_SHARED_STC_MAX];
23 	struct mlx5dr_cmd_forward_tbl *default_miss;
24 };
25 
26 struct mlx5dr_context_shared_gvmi_res {
27 	struct mlx5dr_devx_obj *end_ft;
28 	struct mlx5dr_devx_obj *aliased_end_ft;
29 	uint32_t refcount;
30 };
31 
32 struct mlx5dr_context {
33 	struct ibv_context *ibv_ctx;
34 	/* When local_ibv_ctx is not NULL means we are using shared_ibv for resources */
35 	struct ibv_context *local_ibv_ctx;
36 	struct mlx5dr_cmd_query_caps *caps;
37 	struct ibv_pd *pd;
38 	uint32_t pd_num;
39 	struct mlx5dr_pool *stc_pool[MLX5DR_TABLE_TYPE_MAX];
40 	struct mlx5dr_context_common_res common_res[MLX5DR_TABLE_TYPE_MAX];
41 	struct mlx5dr_context_shared_gvmi_res gvmi_res[MLX5DR_TABLE_TYPE_MAX];
42 	struct mlx5dr_pattern_cache *pattern_cache;
43 	struct mlx5dr_definer_cache *definer_cache;
44 	pthread_spinlock_t ctrl_lock;
45 	enum mlx5dr_context_flags flags;
46 	struct mlx5dr_send_engine *send_queue;
47 	size_t queues;
48 	rte_spinlock_t *bwc_send_queue_locks;
49 	LIST_HEAD(table_head, mlx5dr_table) head;
50 };
51 
mlx5dr_context_shared_gvmi_used(struct mlx5dr_context * ctx)52 static inline bool mlx5dr_context_shared_gvmi_used(struct mlx5dr_context *ctx)
53 {
54 	return ctx->local_ibv_ctx ? true : false;
55 }
56 
mlx5dr_context_bwc_supported(struct mlx5dr_context * ctx)57 static inline bool mlx5dr_context_bwc_supported(struct mlx5dr_context *ctx)
58 {
59 	return ctx->flags & MLX5DR_CONTEXT_FLAG_BWC_SUPPORT;
60 }
61 
62 static inline struct ibv_context *
mlx5dr_context_get_local_ibv(struct mlx5dr_context * ctx)63 mlx5dr_context_get_local_ibv(struct mlx5dr_context *ctx)
64 {
65 	if (mlx5dr_context_shared_gvmi_used(ctx))
66 		return ctx->local_ibv_ctx;
67 
68 	return ctx->ibv_ctx;
69 }
70 
71 bool mlx5dr_context_cap_dynamic_reparse(struct mlx5dr_context *ctx);
72 
73 uint8_t mlx5dr_context_get_reparse_mode(struct mlx5dr_context *ctx);
74 
75 #endif /* MLX5DR_CONTEXT_H_ */
76