xref: /dpdk/drivers/net/mlx5/hws/mlx5dr_cmd.h (revision ed69527423b3ef985d8fc6acd0829f78b1fced1c)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2022 NVIDIA Corporation & Affiliates
3  */
4 
5 #ifndef MLX5DR_CMD_H_
6 #define MLX5DR_CMD_H_
7 
8 struct mlx5dr_cmd_ft_create_attr {
9 	uint8_t type;
10 	uint8_t level;
11 	bool rtc_valid;
12 };
13 
14 struct mlx5dr_cmd_ft_modify_attr {
15 	uint8_t type;
16 	uint32_t rtc_id_0;
17 	uint32_t rtc_id_1;
18 	uint32_t table_miss_id;
19 	uint8_t table_miss_action;
20 	uint64_t modify_fs;
21 };
22 
23 struct mlx5dr_cmd_fg_attr {
24 	uint32_t	table_id;
25 	uint32_t	table_type;
26 };
27 
28 struct mlx5dr_cmd_forward_tbl {
29 	struct mlx5dr_devx_obj	*ft;
30 	struct mlx5dr_devx_obj	*fg;
31 	struct mlx5dr_devx_obj	*fte;
32 	uint32_t refcount;
33 };
34 
35 struct mlx5dr_cmd_rtc_create_attr {
36 	uint32_t pd;
37 	uint32_t stc_base;
38 	uint32_t ste_base;
39 	uint32_t ste_offset;
40 	uint32_t miss_ft_id;
41 	uint8_t update_index_mode;
42 	uint8_t log_depth;
43 	uint8_t log_size;
44 	uint8_t table_type;
45 	uint8_t definer_id;
46 	bool is_jumbo;
47 };
48 
49 struct mlx5dr_cmd_alias_obj_create_attr {
50 	uint32_t obj_id;
51 	uint16_t vhca_id;
52 	uint16_t obj_type;
53 	uint8_t access_key[32];
54 };
55 
56 struct mlx5dr_cmd_stc_create_attr {
57 	uint8_t log_obj_range;
58 	uint8_t table_type;
59 };
60 
61 struct mlx5dr_cmd_stc_modify_attr {
62 	uint32_t stc_offset;
63 	uint8_t action_offset;
64 	enum mlx5_ifc_stc_action_type action_type;
65 	union {
66 		uint32_t id; /* TIRN, TAG, FT ID, STE ID */
67 		struct {
68 			uint8_t decap;
69 			uint16_t start_anchor;
70 			uint16_t end_anchor;
71 		} remove_header;
72 		struct {
73 			uint32_t arg_id;
74 			uint32_t pattern_id;
75 		} modify_header;
76 		struct {
77 			__be64 data;
78 		} modify_action;
79 		struct {
80 			uint32_t arg_id;
81 			uint32_t header_size;
82 			uint8_t is_inline;
83 			uint8_t encap;
84 			uint16_t insert_anchor;
85 			uint16_t insert_offset;
86 		} insert_header;
87 		struct {
88 			uint8_t aso_type;
89 			uint32_t devx_obj_id;
90 			uint8_t return_reg_id;
91 		} aso;
92 		struct {
93 			uint16_t vport_num;
94 			uint16_t esw_owner_vhca_id;
95 		} vport;
96 		struct {
97 			struct mlx5dr_pool_chunk ste;
98 			struct mlx5dr_pool *ste_pool;
99 			uint32_t ste_obj_id; /* Internal */
100 			uint32_t match_definer_id;
101 			uint8_t log_hash_size;
102 		} ste_table;
103 		struct {
104 			uint16_t start_anchor;
105 			uint16_t num_of_words;
106 		} remove_words;
107 
108 		uint32_t dest_table_id;
109 		uint32_t dest_tir_num;
110 	};
111 };
112 
113 struct mlx5dr_cmd_ste_create_attr {
114 	uint8_t log_obj_range;
115 	uint8_t table_type;
116 };
117 
118 struct mlx5dr_cmd_definer_create_attr {
119 	uint8_t *dw_selector;
120 	uint8_t *byte_selector;
121 	uint8_t *match_mask;
122 };
123 
124 struct mlx5dr_cmd_sq_create_attr {
125 	uint32_t cqn;
126 	uint32_t pdn;
127 	uint32_t page_id;
128 	uint32_t dbr_id;
129 	uint32_t wq_id;
130 	uint32_t log_wq_sz;
131 	uint32_t ts_format;
132 };
133 
134 struct mlx5dr_cmd_allow_other_vhca_access_attr {
135 	uint16_t obj_type;
136 	uint32_t obj_id;
137 	uint8_t access_key[32];
138 };
139 
140 struct mlx5dr_cmd_query_ft_caps {
141 	uint8_t max_level;
142 	uint8_t reparse;
143 };
144 
145 struct mlx5dr_cmd_query_vport_caps {
146 	uint16_t vport_num;
147 	uint16_t esw_owner_vhca_id;
148 	uint32_t metadata_c;
149 	uint32_t metadata_c_mask;
150 };
151 
152 struct mlx5dr_cmd_query_caps {
153 	uint32_t wire_regc;
154 	uint32_t wire_regc_mask;
155 	uint32_t flex_protocols;
156 	uint8_t wqe_based_update;
157 	uint8_t rtc_reparse_mode;
158 	uint16_t ste_format;
159 	uint8_t rtc_index_mode;
160 	uint8_t ste_alloc_log_max;
161 	uint8_t ste_alloc_log_gran;
162 	uint8_t stc_alloc_log_max;
163 	uint8_t stc_alloc_log_gran;
164 	uint8_t rtc_log_depth_max;
165 	uint8_t format_select_gtpu_dw_0;
166 	uint8_t format_select_gtpu_dw_1;
167 	uint8_t format_select_gtpu_dw_2;
168 	uint8_t format_select_gtpu_ext_dw_0;
169 	bool full_dw_jumbo_support;
170 	struct mlx5dr_cmd_query_ft_caps nic_ft;
171 	struct mlx5dr_cmd_query_ft_caps fdb_ft;
172 	bool eswitch_manager;
173 	uint32_t eswitch_manager_vport_number;
174 	uint8_t log_header_modify_argument_granularity;
175 	uint8_t log_header_modify_argument_max_alloc;
176 	uint8_t sq_ts_format;
177 	uint64_t definer_format_sup;
178 	uint32_t trivial_match_definer;
179 	bool cross_vhca_resources;
180 	char fw_ver[64];
181 };
182 
183 int mlx5dr_cmd_destroy_obj(struct mlx5dr_devx_obj *devx_obj);
184 
185 struct mlx5dr_devx_obj *
186 mlx5dr_cmd_flow_table_create(struct ibv_context *ctx,
187 			     struct mlx5dr_cmd_ft_create_attr *ft_attr);
188 
189 int
190 mlx5dr_cmd_flow_table_modify(struct mlx5dr_devx_obj *devx_obj,
191 			     struct mlx5dr_cmd_ft_modify_attr *ft_attr);
192 
193 struct mlx5dr_devx_obj *
194 mlx5dr_cmd_rtc_create(struct ibv_context *ctx,
195 		      struct mlx5dr_cmd_rtc_create_attr *rtc_attr);
196 
197 struct mlx5dr_devx_obj *
198 mlx5dr_cmd_stc_create(struct ibv_context *ctx,
199 		      struct mlx5dr_cmd_stc_create_attr *stc_attr);
200 
201 int
202 mlx5dr_cmd_stc_modify(struct mlx5dr_devx_obj *devx_obj,
203 		      struct mlx5dr_cmd_stc_modify_attr *stc_attr);
204 
205 struct mlx5dr_devx_obj *
206 mlx5dr_cmd_ste_create(struct ibv_context *ctx,
207 		      struct mlx5dr_cmd_ste_create_attr *ste_attr);
208 
209 struct mlx5dr_devx_obj *
210 mlx5dr_cmd_definer_create(struct ibv_context *ctx,
211 			  struct mlx5dr_cmd_definer_create_attr *def_attr);
212 
213 struct mlx5dr_devx_obj *
214 mlx5dr_cmd_sq_create(struct ibv_context *ctx,
215 		     struct mlx5dr_cmd_sq_create_attr *attr);
216 
217 struct mlx5dr_devx_obj *
218 mlx5dr_cmd_arg_create(struct ibv_context *ctx,
219 		      uint16_t log_obj_range,
220 		      uint32_t pd);
221 
222 struct mlx5dr_devx_obj *
223 mlx5dr_cmd_header_modify_pattern_create(struct ibv_context *ctx,
224 					uint32_t pattern_length,
225 					uint8_t *actions);
226 
227 struct mlx5dr_devx_obj *
228 mlx5dr_cmd_alias_obj_create(struct ibv_context *ctx,
229 			    struct mlx5dr_cmd_alias_obj_create_attr *alias_attr);
230 
231 int mlx5dr_cmd_sq_modify_rdy(struct mlx5dr_devx_obj *devx_obj);
232 
233 int mlx5dr_cmd_query_ib_port(struct ibv_context *ctx,
234 			     struct mlx5dr_cmd_query_vport_caps *vport_caps,
235 			     uint32_t port_num);
236 int mlx5dr_cmd_query_caps(struct ibv_context *ctx,
237 			  struct mlx5dr_cmd_query_caps *caps);
238 
239 void mlx5dr_cmd_miss_ft_destroy(struct mlx5dr_cmd_forward_tbl *tbl);
240 
241 struct mlx5dr_cmd_forward_tbl *
242 mlx5dr_cmd_miss_ft_create(struct ibv_context *ctx,
243 			  struct mlx5dr_cmd_ft_create_attr *ft_attr,
244 			  uint32_t vport);
245 
246 void mlx5dr_cmd_set_attr_connect_miss_tbl(struct mlx5dr_context *ctx,
247 					  uint32_t fw_ft_type,
248 					  enum mlx5dr_table_type type,
249 					  struct mlx5dr_cmd_ft_modify_attr *ft_attr);
250 
251 int mlx5dr_cmd_allow_other_vhca_access(struct ibv_context *ctx,
252 				       struct mlx5dr_cmd_allow_other_vhca_access_attr *attr);
253 #endif /* MLX5DR_CMD_H_ */
254