Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (c) 2022 NVIDIA Corporation & Affiliates
3 : : */
4 : :
5 : : #ifndef MLX5DR_DEFINER_H_
6 : : #define MLX5DR_DEFINER_H_
7 : :
8 : : /* Max available selecotrs */
9 : : #define DW_SELECTORS 9
10 : : #define BYTE_SELECTORS 8
11 : :
12 : : /* Selectors based on match TAG */
13 : : #define DW_SELECTORS_MATCH 6
14 : : #define DW_SELECTORS_LIMITED 3
15 : :
16 : : /* Selectors based on range TAG */
17 : : #define DW_SELECTORS_RANGE 2
18 : : #define BYTE_SELECTORS_RANGE 8
19 : :
20 : : enum mlx5dr_definer_compare_ste_dw_offset {
21 : : /* In compare STE the matching DW's starts after the 3 actions */
22 : : MLX5DR_DEFINER_COMPARE_STE_ARGUMENT_1 = 3,
23 : : MLX5DR_DEFINER_COMPARE_STE_ARGUMENT_0,
24 : : MLX5DR_DEFINER_COMPARE_STE_BASE_1,
25 : : MLX5DR_DEFINER_COMPARE_STE_BASE_0,
26 : : MLX5DR_DEFINER_COMPARE_STE_TAG_DW_3,
27 : : MLX5DR_DEFINER_COMPARE_STE_TAG_DW_2,
28 : : MLX5DR_DEFINER_COMPARE_STE_TAG_DW_1,
29 : : MLX5DR_DEFINER_COMPARE_STE_TAG_DW_0,
30 : : };
31 : :
32 : : enum mlx5dr_definer_dw_selectors {
33 : : MLX5DR_DEFINER_SELECTOR_DW0,
34 : : MLX5DR_DEFINER_SELECTOR_DW1,
35 : : MLX5DR_DEFINER_SELECTOR_DW2,
36 : : MLX5DR_DEFINER_SELECTOR_DW3,
37 : : MLX5DR_DEFINER_SELECTOR_DW4,
38 : : MLX5DR_DEFINER_SELECTOR_DW5,
39 : : MLX5DR_DEFINER_SELECTOR_DW6,
40 : : MLX5DR_DEFINER_SELECTOR_DW7,
41 : : MLX5DR_DEFINER_SELECTOR_DW8,
42 : : };
43 : :
44 : : enum mlx5dr_definer_compare_dw_selectors {
45 : : MLX5DR_DEFINER_COMPARE_ARGUMENT_0 = MLX5DR_DEFINER_SELECTOR_DW4,
46 : : MLX5DR_DEFINER_COMPARE_ARGUMENT_1 = MLX5DR_DEFINER_SELECTOR_DW5,
47 : : MLX5DR_DEFINER_COMPARE_BASE_0 = MLX5DR_DEFINER_SELECTOR_DW2,
48 : : MLX5DR_DEFINER_COMPARE_BASE_1 = MLX5DR_DEFINER_SELECTOR_DW3,
49 : : };
50 : :
51 : : enum mlx5dr_definer_fname {
52 : : MLX5DR_DEFINER_FNAME_ETH_SMAC_48_16_O,
53 : : MLX5DR_DEFINER_FNAME_ETH_SMAC_48_16_I,
54 : : MLX5DR_DEFINER_FNAME_ETH_SMAC_15_0_O,
55 : : MLX5DR_DEFINER_FNAME_ETH_SMAC_15_0_I,
56 : : MLX5DR_DEFINER_FNAME_ETH_DMAC_48_16_O,
57 : : MLX5DR_DEFINER_FNAME_ETH_DMAC_48_16_I,
58 : : MLX5DR_DEFINER_FNAME_ETH_DMAC_15_0_O,
59 : : MLX5DR_DEFINER_FNAME_ETH_DMAC_15_0_I,
60 : : MLX5DR_DEFINER_FNAME_ETH_TYPE_O,
61 : : MLX5DR_DEFINER_FNAME_ETH_TYPE_I,
62 : : MLX5DR_DEFINER_FNAME_VLAN_TYPE_O,
63 : : MLX5DR_DEFINER_FNAME_VLAN_TYPE_I,
64 : : MLX5DR_DEFINER_FNAME_VLAN_TCI_O,
65 : : MLX5DR_DEFINER_FNAME_VLAN_TCI_I,
66 : : MLX5DR_DEFINER_FNAME_IPV4_IHL_O,
67 : : MLX5DR_DEFINER_FNAME_IPV4_IHL_I,
68 : : MLX5DR_DEFINER_FNAME_IP_TTL_O,
69 : : MLX5DR_DEFINER_FNAME_IP_TTL_I,
70 : : MLX5DR_DEFINER_FNAME_IPV4_DST_O,
71 : : MLX5DR_DEFINER_FNAME_IPV4_DST_I,
72 : : MLX5DR_DEFINER_FNAME_IPV4_SRC_O,
73 : : MLX5DR_DEFINER_FNAME_IPV4_SRC_I,
74 : : MLX5DR_DEFINER_FNAME_IP_VERSION_O,
75 : : MLX5DR_DEFINER_FNAME_IP_VERSION_I,
76 : : MLX5DR_DEFINER_FNAME_IP_FRAG_O,
77 : : MLX5DR_DEFINER_FNAME_IP_FRAG_I,
78 : : MLX5DR_DEFINER_FNAME_IP_ID_O,
79 : : MLX5DR_DEFINER_FNAME_IP_ID_I,
80 : : MLX5DR_DEFINER_FNAME_IP_LEN_O,
81 : : MLX5DR_DEFINER_FNAME_IP_LEN_I,
82 : : MLX5DR_DEFINER_FNAME_IP_TOS_O,
83 : : MLX5DR_DEFINER_FNAME_IP_TOS_I,
84 : : MLX5DR_DEFINER_FNAME_IPV6_FLOW_LABEL_O,
85 : : MLX5DR_DEFINER_FNAME_IPV6_FLOW_LABEL_I,
86 : : MLX5DR_DEFINER_FNAME_IPV6_DST_127_96_O,
87 : : MLX5DR_DEFINER_FNAME_IPV6_DST_95_64_O,
88 : : MLX5DR_DEFINER_FNAME_IPV6_DST_63_32_O,
89 : : MLX5DR_DEFINER_FNAME_IPV6_DST_31_0_O,
90 : : MLX5DR_DEFINER_FNAME_IPV6_DST_127_96_I,
91 : : MLX5DR_DEFINER_FNAME_IPV6_DST_95_64_I,
92 : : MLX5DR_DEFINER_FNAME_IPV6_DST_63_32_I,
93 : : MLX5DR_DEFINER_FNAME_IPV6_DST_31_0_I,
94 : : MLX5DR_DEFINER_FNAME_IPV6_SRC_127_96_O,
95 : : MLX5DR_DEFINER_FNAME_IPV6_SRC_95_64_O,
96 : : MLX5DR_DEFINER_FNAME_IPV6_SRC_63_32_O,
97 : : MLX5DR_DEFINER_FNAME_IPV6_SRC_31_0_O,
98 : : MLX5DR_DEFINER_FNAME_IPV6_SRC_127_96_I,
99 : : MLX5DR_DEFINER_FNAME_IPV6_SRC_95_64_I,
100 : : MLX5DR_DEFINER_FNAME_IPV6_SRC_63_32_I,
101 : : MLX5DR_DEFINER_FNAME_IPV6_SRC_31_0_I,
102 : : MLX5DR_DEFINER_FNAME_IP_PROTOCOL_O,
103 : : MLX5DR_DEFINER_FNAME_IP_PROTOCOL_I,
104 : : MLX5DR_DEFINER_FNAME_L4_SPORT_O,
105 : : MLX5DR_DEFINER_FNAME_L4_SPORT_I,
106 : : MLX5DR_DEFINER_FNAME_L4_DPORT_O,
107 : : MLX5DR_DEFINER_FNAME_L4_DPORT_I,
108 : : MLX5DR_DEFINER_FNAME_TCP_FLAGS_I,
109 : : MLX5DR_DEFINER_FNAME_TCP_FLAGS_O,
110 : : MLX5DR_DEFINER_FNAME_GTP_TEID,
111 : : MLX5DR_DEFINER_FNAME_GTP_MSG_TYPE,
112 : : MLX5DR_DEFINER_FNAME_GTP_EXT_FLAG,
113 : : MLX5DR_DEFINER_FNAME_GTP_FLAGS,
114 : : MLX5DR_DEFINER_FNAME_GTP_NEXT_EXT_HDR,
115 : : MLX5DR_DEFINER_FNAME_GTP_EXT_HDR_PDU,
116 : : MLX5DR_DEFINER_FNAME_GTP_EXT_HDR_QFI,
117 : : MLX5DR_DEFINER_FNAME_FLEX_PARSER_0,
118 : : MLX5DR_DEFINER_FNAME_FLEX_PARSER_1,
119 : : MLX5DR_DEFINER_FNAME_FLEX_PARSER_2,
120 : : MLX5DR_DEFINER_FNAME_FLEX_PARSER_3,
121 : : MLX5DR_DEFINER_FNAME_FLEX_PARSER_4,
122 : : MLX5DR_DEFINER_FNAME_FLEX_PARSER_5,
123 : : MLX5DR_DEFINER_FNAME_FLEX_PARSER_6,
124 : : MLX5DR_DEFINER_FNAME_FLEX_PARSER_7,
125 : : MLX5DR_DEFINER_FNAME_VPORT_REG_C_0,
126 : : MLX5DR_DEFINER_FNAME_VXLAN_DW0,
127 : : MLX5DR_DEFINER_FNAME_VXLAN_DW1,
128 : : MLX5DR_DEFINER_FNAME_VXLAN_GPE_FLAGS,
129 : : MLX5DR_DEFINER_FNAME_VXLAN_GPE_RSVD0,
130 : : MLX5DR_DEFINER_FNAME_VXLAN_GPE_PROTO,
131 : : MLX5DR_DEFINER_FNAME_VXLAN_GPE_VNI,
132 : : MLX5DR_DEFINER_FNAME_VXLAN_GPE_RSVD1,
133 : : MLX5DR_DEFINER_FNAME_GENEVE_CTRL,
134 : : MLX5DR_DEFINER_FNAME_GENEVE_PROTO,
135 : : MLX5DR_DEFINER_FNAME_GENEVE_VNI,
136 : : MLX5DR_DEFINER_FNAME_SOURCE_QP,
137 : : MLX5DR_DEFINER_FNAME_REG_0,
138 : : MLX5DR_DEFINER_FNAME_REG_1,
139 : : MLX5DR_DEFINER_FNAME_REG_2,
140 : : MLX5DR_DEFINER_FNAME_REG_3,
141 : : MLX5DR_DEFINER_FNAME_REG_4,
142 : : MLX5DR_DEFINER_FNAME_REG_5,
143 : : MLX5DR_DEFINER_FNAME_REG_6,
144 : : MLX5DR_DEFINER_FNAME_REG_7,
145 : : MLX5DR_DEFINER_FNAME_REG_8,
146 : : MLX5DR_DEFINER_FNAME_REG_9,
147 : : MLX5DR_DEFINER_FNAME_REG_10,
148 : : MLX5DR_DEFINER_FNAME_REG_11,
149 : : MLX5DR_DEFINER_FNAME_REG_A,
150 : : MLX5DR_DEFINER_FNAME_REG_B,
151 : : MLX5DR_DEFINER_FNAME_GRE_KEY_PRESENT,
152 : : MLX5DR_DEFINER_FNAME_GRE_C_VER,
153 : : MLX5DR_DEFINER_FNAME_GRE_PROTOCOL,
154 : : MLX5DR_DEFINER_FNAME_GRE_OPT_KEY,
155 : : MLX5DR_DEFINER_FNAME_GRE_OPT_SEQ,
156 : : MLX5DR_DEFINER_FNAME_GRE_OPT_CHECKSUM,
157 : : MLX5DR_DEFINER_FNAME_NVGRE_C_K_S,
158 : : MLX5DR_DEFINER_FNAME_NVGRE_PROTOCOL,
159 : : MLX5DR_DEFINER_FNAME_NVGRE_DW1,
160 : : MLX5DR_DEFINER_FNAME_INTEGRITY_O,
161 : : MLX5DR_DEFINER_FNAME_INTEGRITY_I,
162 : : MLX5DR_DEFINER_FNAME_ICMP_DW1,
163 : : MLX5DR_DEFINER_FNAME_ICMP_DW2,
164 : : MLX5DR_DEFINER_FNAME_ESP_SPI,
165 : : MLX5DR_DEFINER_FNAME_ESP_SEQUENCE_NUMBER,
166 : : MLX5DR_DEFINER_FNAME_MPLS0_O,
167 : : MLX5DR_DEFINER_FNAME_MPLS1_O,
168 : : MLX5DR_DEFINER_FNAME_MPLS2_O,
169 : : MLX5DR_DEFINER_FNAME_MPLS3_O,
170 : : MLX5DR_DEFINER_FNAME_MPLS4_O,
171 : : MLX5DR_DEFINER_FNAME_MPLS0_I,
172 : : MLX5DR_DEFINER_FNAME_MPLS1_I,
173 : : MLX5DR_DEFINER_FNAME_MPLS2_I,
174 : : MLX5DR_DEFINER_FNAME_MPLS3_I,
175 : : MLX5DR_DEFINER_FNAME_MPLS4_I,
176 : : MLX5DR_DEFINER_FNAME_OKS2_MPLS0_O,
177 : : MLX5DR_DEFINER_FNAME_OKS2_MPLS1_O,
178 : : MLX5DR_DEFINER_FNAME_OKS2_MPLS2_O,
179 : : MLX5DR_DEFINER_FNAME_OKS2_MPLS3_O,
180 : : MLX5DR_DEFINER_FNAME_OKS2_MPLS4_O,
181 : : MLX5DR_DEFINER_FNAME_OKS2_MPLS0_I,
182 : : MLX5DR_DEFINER_FNAME_OKS2_MPLS1_I,
183 : : MLX5DR_DEFINER_FNAME_OKS2_MPLS2_I,
184 : : MLX5DR_DEFINER_FNAME_OKS2_MPLS3_I,
185 : : MLX5DR_DEFINER_FNAME_OKS2_MPLS4_I,
186 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_0,
187 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_1,
188 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_2,
189 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_3,
190 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_4,
191 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_5,
192 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_6,
193 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_7,
194 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_0,
195 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_1,
196 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_2,
197 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_3,
198 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_4,
199 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_5,
200 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_6,
201 : : MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_7,
202 : : MLX5DR_DEFINER_FNAME_IB_L4_OPCODE,
203 : : MLX5DR_DEFINER_FNAME_IB_L4_QPN,
204 : : MLX5DR_DEFINER_FNAME_IB_L4_A,
205 : : MLX5DR_DEFINER_FNAME_PTYPE_L2_O,
206 : : MLX5DR_DEFINER_FNAME_PTYPE_L2_I,
207 : : MLX5DR_DEFINER_FNAME_PTYPE_L3_O,
208 : : MLX5DR_DEFINER_FNAME_PTYPE_L3_I,
209 : : MLX5DR_DEFINER_FNAME_PTYPE_L4_O,
210 : : MLX5DR_DEFINER_FNAME_PTYPE_L4_I,
211 : : MLX5DR_DEFINER_FNAME_PTYPE_L4_EXT_O,
212 : : MLX5DR_DEFINER_FNAME_PTYPE_L4_EXT_I,
213 : : MLX5DR_DEFINER_FNAME_PTYPE_TUNNEL,
214 : : MLX5DR_DEFINER_FNAME_PTYPE_FRAG_O,
215 : : MLX5DR_DEFINER_FNAME_PTYPE_FRAG_I,
216 : : MLX5DR_DEFINER_FNAME_RANDOM_NUM,
217 : : MLX5DR_DEFINER_FNAME_SOURCE_GVMI,
218 : : MLX5DR_DEFINER_FNAME_FUNCTIONAL_LB,
219 : : MLX5DR_DEFINER_FNAME_MAX,
220 : : };
221 : :
222 : : enum mlx5dr_definer_type {
223 : : MLX5DR_DEFINER_TYPE_MATCH,
224 : : MLX5DR_DEFINER_TYPE_JUMBO,
225 : : MLX5DR_DEFINER_TYPE_RANGE,
226 : : };
227 : :
228 : : struct mlx5dr_definer_fc {
229 : : uint8_t item_idx;
230 : : uint8_t is_range;
231 : : uint8_t compare_idx;
232 : : bool compare_set_base;
233 : : union {
234 : : uint32_t extra_data;
235 : : void *dr_ctx;
236 : : };
237 : : uint32_t byte_off;
238 : : int bit_off;
239 : : uint32_t bit_mask;
240 : : enum mlx5dr_definer_fname fname;
241 : : uint8_t not_overwrite;
242 : : void (*tag_set)(struct mlx5dr_definer_fc *fc,
243 : : const void *item_spec,
244 : : uint8_t *tag);
245 : : void (*tag_mask_set)(struct mlx5dr_definer_fc *fc,
246 : : const void *item_spec,
247 : : uint8_t *tag);
248 : : };
249 : :
250 : : struct mlx5_ifc_definer_hl_eth_l2_bits {
251 : : u8 dmac_47_16[0x20];
252 : : u8 dmac_15_0[0x10];
253 : : u8 l3_ethertype[0x10];
254 : : u8 reserved_at_40[0x1];
255 : : u8 sx_sniffer[0x1];
256 : : u8 functional_lb[0x1];
257 : : u8 ip_fragmented[0x1];
258 : : u8 qp_type[0x2];
259 : : u8 encap_type[0x2];
260 : : u8 port_number[0x2];
261 : : u8 l3_type[0x2];
262 : : u8 l4_type_bwc[0x2];
263 : : u8 first_vlan_qualifier[0x2];
264 : : u8 tci[0x10]; /* contains first_priority[0x3] + first_cfi[0x1] + first_vlan_id[0xc] */
265 : : u8 l4_type[0x4];
266 : : u8 reserved_at_64[0x2];
267 : : u8 ipsec_layer[0x2];
268 : : u8 l2_type[0x2];
269 : : u8 force_lb[0x1];
270 : : u8 l2_ok[0x1];
271 : : u8 l3_ok[0x1];
272 : : u8 l4_ok[0x1];
273 : : u8 second_vlan_qualifier[0x2];
274 : : u8 second_priority[0x3];
275 : : u8 second_cfi[0x1];
276 : : u8 second_vlan_id[0xc];
277 : : };
278 : :
279 : : struct mlx5_ifc_definer_hl_eth_l2_src_bits {
280 : : u8 smac_47_16[0x20];
281 : : u8 smac_15_0[0x10];
282 : : u8 loopback_syndrome[0x8];
283 : : u8 l3_type[0x2];
284 : : u8 l4_type_bwc[0x2];
285 : : u8 first_vlan_qualifier[0x2];
286 : : u8 ip_fragmented[0x1];
287 : : u8 functional_lb[0x1];
288 : : };
289 : :
290 : : struct mlx5_ifc_definer_hl_ib_l2_bits {
291 : : u8 sx_sniffer[0x1];
292 : : u8 force_lb[0x1];
293 : : u8 functional_lb[0x1];
294 : : u8 reserved_at_3[0x3];
295 : : u8 port_number[0x2];
296 : : u8 sl[0x4];
297 : : u8 qp_type[0x2];
298 : : u8 lnh[0x2];
299 : : u8 dlid[0x10];
300 : : u8 vl[0x4];
301 : : u8 lrh_packet_length[0xc];
302 : : u8 slid[0x10];
303 : : };
304 : :
305 : : struct mlx5_ifc_definer_hl_eth_l3_bits {
306 : : u8 ip_version[0x4];
307 : : u8 ihl[0x4];
308 : : union {
309 : : u8 tos[0x8];
310 : : struct {
311 : : u8 dscp[0x6];
312 : : u8 ecn[0x2];
313 : : };
314 : : };
315 : : u8 time_to_live_hop_limit[0x8];
316 : : u8 protocol_next_header[0x8];
317 : : u8 identification[0x10];
318 : : union {
319 : : u8 ipv4_frag[0x10];
320 : : struct {
321 : : u8 flags[0x3];
322 : : u8 fragment_offset[0xd];
323 : : };
324 : : };
325 : : u8 ipv4_total_length[0x10];
326 : : u8 checksum[0x10];
327 : : u8 reserved_at_60[0xc];
328 : : u8 flow_label[0x14];
329 : : u8 packet_length[0x10];
330 : : u8 ipv6_payload_length[0x10];
331 : : };
332 : :
333 : : struct mlx5_ifc_definer_hl_eth_l4_bits {
334 : : u8 source_port[0x10];
335 : : u8 destination_port[0x10];
336 : : u8 data_offset[0x4];
337 : : u8 l4_ok[0x1];
338 : : u8 l3_ok[0x1];
339 : : u8 ip_fragmented[0x1];
340 : : u8 tcp_ns[0x1];
341 : : union {
342 : : u8 tcp_flags[0x8];
343 : : struct {
344 : : u8 tcp_cwr[0x1];
345 : : u8 tcp_ece[0x1];
346 : : u8 tcp_urg[0x1];
347 : : u8 tcp_ack[0x1];
348 : : u8 tcp_psh[0x1];
349 : : u8 tcp_rst[0x1];
350 : : u8 tcp_syn[0x1];
351 : : u8 tcp_fin[0x1];
352 : : };
353 : : };
354 : : u8 first_fragment[0x1];
355 : : u8 reserved_at_31[0xf];
356 : : };
357 : :
358 : : struct mlx5_ifc_definer_hl_src_qp_gvmi_bits {
359 : : u8 loopback_syndrome[0x8];
360 : : u8 l3_type[0x2];
361 : : u8 l4_type_bwc[0x2];
362 : : u8 first_vlan_qualifier[0x2];
363 : : u8 reserved_at_e[0x1];
364 : : u8 functional_lb[0x1];
365 : : u8 source_gvmi[0x10];
366 : : u8 force_lb[0x1];
367 : : u8 ip_fragmented[0x1];
368 : : u8 source_is_requestor[0x1];
369 : : u8 reserved_at_23[0x5];
370 : : u8 source_qp[0x18];
371 : : };
372 : :
373 : : struct mlx5_ifc_definer_hl_ib_l4_bits {
374 : : u8 opcode[0x8];
375 : : u8 qp[0x18];
376 : : u8 se[0x1];
377 : : u8 migreq[0x1];
378 : : u8 ackreq[0x1];
379 : : u8 fecn[0x1];
380 : : u8 becn[0x1];
381 : : u8 bth[0x1];
382 : : u8 deth[0x1];
383 : : u8 dcceth[0x1];
384 : : u8 reserved_at_28[0x2];
385 : : u8 pad_count[0x2];
386 : : u8 tver[0x4];
387 : : u8 p_key[0x10];
388 : : u8 reserved_at_40[0x8];
389 : : u8 deth_source_qp[0x18];
390 : : };
391 : :
392 : : enum mlx5dr_integrity_ok1_bits {
393 : : MLX5DR_DEFINER_OKS1_FIRST_L4_OK = 24,
394 : : MLX5DR_DEFINER_OKS1_FIRST_L3_OK = 25,
395 : : MLX5DR_DEFINER_OKS1_SECOND_L4_OK = 26,
396 : : MLX5DR_DEFINER_OKS1_SECOND_L3_OK = 27,
397 : : MLX5DR_DEFINER_OKS1_FIRST_L4_CSUM_OK = 28,
398 : : MLX5DR_DEFINER_OKS1_FIRST_IPV4_CSUM_OK = 29,
399 : : MLX5DR_DEFINER_OKS1_SECOND_L4_CSUM_OK = 30,
400 : : MLX5DR_DEFINER_OKS1_SECOND_IPV4_CSUM_OK = 31,
401 : : };
402 : :
403 : : struct mlx5_ifc_definer_hl_oks1_bits {
404 : : union {
405 : : u8 oks1_bits[0x20];
406 : : struct {
407 : : u8 second_ipv4_checksum_ok[0x1];
408 : : u8 second_l4_checksum_ok[0x1];
409 : : u8 first_ipv4_checksum_ok[0x1];
410 : : u8 first_l4_checksum_ok[0x1];
411 : : u8 second_l3_ok[0x1];
412 : : u8 second_l4_ok[0x1];
413 : : u8 first_l3_ok[0x1];
414 : : u8 first_l4_ok[0x1];
415 : : u8 flex_parser7_steering_ok[0x1];
416 : : u8 flex_parser6_steering_ok[0x1];
417 : : u8 flex_parser5_steering_ok[0x1];
418 : : u8 flex_parser4_steering_ok[0x1];
419 : : u8 flex_parser3_steering_ok[0x1];
420 : : u8 flex_parser2_steering_ok[0x1];
421 : : u8 flex_parser1_steering_ok[0x1];
422 : : u8 flex_parser0_steering_ok[0x1];
423 : : u8 second_ipv6_extension_header_vld[0x1];
424 : : u8 first_ipv6_extension_header_vld[0x1];
425 : : u8 l3_tunneling_ok[0x1];
426 : : u8 l2_tunneling_ok[0x1];
427 : : u8 second_tcp_ok[0x1];
428 : : u8 second_udp_ok[0x1];
429 : : u8 second_ipv4_ok[0x1];
430 : : u8 second_ipv6_ok[0x1];
431 : : u8 second_l2_ok[0x1];
432 : : u8 vxlan_ok[0x1];
433 : : u8 gre_ok[0x1];
434 : : u8 first_tcp_ok[0x1];
435 : : u8 first_udp_ok[0x1];
436 : : u8 first_ipv4_ok[0x1];
437 : : u8 first_ipv6_ok[0x1];
438 : : u8 first_l2_ok[0x1];
439 : : };
440 : : };
441 : : };
442 : :
443 : : struct mlx5_ifc_definer_hl_oks2_bits {
444 : : u8 reserved_at_0[0xa];
445 : : u8 second_mpls_ok[0x1];
446 : : u8 second_mpls4_s_bit[0x1];
447 : : u8 second_mpls4_qualifier[0x1];
448 : : u8 second_mpls3_s_bit[0x1];
449 : : u8 second_mpls3_qualifier[0x1];
450 : : u8 second_mpls2_s_bit[0x1];
451 : : u8 second_mpls2_qualifier[0x1];
452 : : u8 second_mpls1_s_bit[0x1];
453 : : u8 second_mpls1_qualifier[0x1];
454 : : u8 second_mpls0_s_bit[0x1];
455 : : u8 second_mpls0_qualifier[0x1];
456 : : u8 first_mpls_ok[0x1];
457 : : u8 first_mpls4_s_bit[0x1];
458 : : u8 first_mpls4_qualifier[0x1];
459 : : u8 first_mpls3_s_bit[0x1];
460 : : u8 first_mpls3_qualifier[0x1];
461 : : u8 first_mpls2_s_bit[0x1];
462 : : u8 first_mpls2_qualifier[0x1];
463 : : u8 first_mpls1_s_bit[0x1];
464 : : u8 first_mpls1_qualifier[0x1];
465 : : u8 first_mpls0_s_bit[0x1];
466 : : u8 first_mpls0_qualifier[0x1];
467 : : };
468 : :
469 : : struct mlx5_ifc_definer_hl_voq_bits {
470 : : u8 reserved_at_0[0x18];
471 : : u8 ecn_ok[0x1];
472 : : u8 congestion[0x1];
473 : : u8 profile[0x2];
474 : : u8 internal_prio[0x4];
475 : : };
476 : :
477 : : struct mlx5_ifc_definer_hl_ipv4_src_dst_bits {
478 : : u8 source_address[0x20];
479 : : u8 destination_address[0x20];
480 : : };
481 : :
482 : : struct mlx5_ifc_definer_hl_random_number_bits {
483 : : u8 random_number[0x10];
484 : : u8 reserved[0x10];
485 : : };
486 : :
487 : : struct mlx5_ifc_definer_hl_ipv6_addr_bits {
488 : : u8 ipv6_address_127_96[0x20];
489 : : u8 ipv6_address_95_64[0x20];
490 : : u8 ipv6_address_63_32[0x20];
491 : : u8 ipv6_address_31_0[0x20];
492 : : };
493 : :
494 : : struct mlx5_ifc_definer_tcp_icmp_header_bits {
495 : : union {
496 : : struct {
497 : : u8 icmp_dw1[0x20];
498 : : u8 icmp_dw2[0x20];
499 : : u8 icmp_dw3[0x20];
500 : : };
501 : : struct {
502 : : u8 tcp_seq[0x20];
503 : : u8 tcp_ack[0x20];
504 : : u8 tcp_win_urg[0x20];
505 : : };
506 : : };
507 : : };
508 : :
509 : : struct mlx5_ifc_definer_hl_tunnel_header_bits {
510 : : u8 tunnel_header_0[0x20];
511 : : u8 tunnel_header_1[0x20];
512 : : u8 tunnel_header_2[0x20];
513 : : u8 tunnel_header_3[0x20];
514 : : };
515 : :
516 : : struct mlx5_ifc_definer_hl_ipsec_bits {
517 : : u8 spi[0x20];
518 : : u8 sequence_number[0x20];
519 : : u8 reserved[0x10];
520 : : u8 ipsec_syndrome[0x8];
521 : : u8 next_header[0x8];
522 : : };
523 : :
524 : : struct mlx5_ifc_definer_hl_metadata_bits {
525 : : u8 metadata_to_cqe[0x20];
526 : : u8 general_purpose[0x20];
527 : : u8 acomulated_hash[0x20];
528 : : };
529 : :
530 : : struct mlx5_ifc_definer_hl_flex_parser_bits {
531 : : u8 flex_parser_7[0x20];
532 : : u8 flex_parser_6[0x20];
533 : : u8 flex_parser_5[0x20];
534 : : u8 flex_parser_4[0x20];
535 : : u8 flex_parser_3[0x20];
536 : : u8 flex_parser_2[0x20];
537 : : u8 flex_parser_1[0x20];
538 : : u8 flex_parser_0[0x20];
539 : : };
540 : :
541 : : struct mlx5_ifc_definer_hl_registers_bits {
542 : : u8 register_c_10[0x20];
543 : : u8 register_c_11[0x20];
544 : : u8 register_c_8[0x20];
545 : : u8 register_c_9[0x20];
546 : : u8 register_c_6[0x20];
547 : : u8 register_c_7[0x20];
548 : : u8 register_c_4[0x20];
549 : : u8 register_c_5[0x20];
550 : : u8 register_c_2[0x20];
551 : : u8 register_c_3[0x20];
552 : : u8 register_c_0[0x20];
553 : : u8 register_c_1[0x20];
554 : : };
555 : :
556 : : struct mlx5_ifc_definer_hl_mpls_bits {
557 : : u8 mpls0_label[0x20];
558 : : u8 mpls1_label[0x20];
559 : : u8 mpls2_label[0x20];
560 : : u8 mpls3_label[0x20];
561 : : u8 mpls4_label[0x20];
562 : : };
563 : :
564 : : struct mlx5_ifc_definer_hl_bits {
565 : : struct mlx5_ifc_definer_hl_eth_l2_bits eth_l2_outer;
566 : : struct mlx5_ifc_definer_hl_eth_l2_bits eth_l2_inner;
567 : : struct mlx5_ifc_definer_hl_eth_l2_src_bits eth_l2_src_outer;
568 : : struct mlx5_ifc_definer_hl_eth_l2_src_bits eth_l2_src_inner;
569 : : struct mlx5_ifc_definer_hl_ib_l2_bits ib_l2;
570 : : struct mlx5_ifc_definer_hl_eth_l3_bits eth_l3_outer;
571 : : struct mlx5_ifc_definer_hl_eth_l3_bits eth_l3_inner;
572 : : struct mlx5_ifc_definer_hl_eth_l4_bits eth_l4_outer;
573 : : struct mlx5_ifc_definer_hl_eth_l4_bits eth_l4_inner;
574 : : struct mlx5_ifc_definer_hl_src_qp_gvmi_bits source_qp_gvmi;
575 : : struct mlx5_ifc_definer_hl_ib_l4_bits ib_l4;
576 : : struct mlx5_ifc_definer_hl_oks1_bits oks1;
577 : : struct mlx5_ifc_definer_hl_oks2_bits oks2;
578 : : struct mlx5_ifc_definer_hl_voq_bits voq;
579 : : u8 reserved_at_480[0x380];
580 : : struct mlx5_ifc_definer_hl_ipv4_src_dst_bits ipv4_src_dest_outer;
581 : : struct mlx5_ifc_definer_hl_ipv4_src_dst_bits ipv4_src_dest_inner;
582 : : struct mlx5_ifc_definer_hl_ipv6_addr_bits ipv6_dst_outer;
583 : : struct mlx5_ifc_definer_hl_ipv6_addr_bits ipv6_dst_inner;
584 : : struct mlx5_ifc_definer_hl_ipv6_addr_bits ipv6_src_outer;
585 : : struct mlx5_ifc_definer_hl_ipv6_addr_bits ipv6_src_inner;
586 : : u8 unsupported_dest_ib_l3[0x80];
587 : : u8 unsupported_source_ib_l3[0x80];
588 : : u8 unsupported_udp_misc_outer[0x20];
589 : : u8 unsupported_udp_misc_inner[0x20];
590 : : struct mlx5_ifc_definer_tcp_icmp_header_bits tcp_icmp;
591 : : struct mlx5_ifc_definer_hl_tunnel_header_bits tunnel_header;
592 : : struct mlx5_ifc_definer_hl_mpls_bits mpls_outer;
593 : : struct mlx5_ifc_definer_hl_mpls_bits mpls_inner;
594 : : u8 unsupported_config_headers_outer[0x80];
595 : : u8 unsupported_config_headers_inner[0x80];
596 : : struct mlx5_ifc_definer_hl_random_number_bits random_number;
597 : : struct mlx5_ifc_definer_hl_ipsec_bits ipsec;
598 : : struct mlx5_ifc_definer_hl_metadata_bits metadata;
599 : : u8 unsupported_utc_timestamp[0x40];
600 : : u8 unsupported_free_running_timestamp[0x40];
601 : : struct mlx5_ifc_definer_hl_flex_parser_bits flex_parser;
602 : : struct mlx5_ifc_definer_hl_registers_bits registers;
603 : : /* Reserved in case header layout on future HW */
604 : : u8 unsupported_reserved[0xd40];
605 : : };
606 : :
607 : : enum mlx5dr_definer_gtp {
608 : : MLX5DR_DEFINER_GTP_EXT_HDR_BIT = 0x04,
609 : : };
610 : :
611 : : struct mlx5_ifc_header_gtp_bits {
612 : : union {
613 : : u8 v_pt_rsv_flags[0x8];
614 : : struct {
615 : : u8 version[0x3];
616 : : u8 proto_type[0x1];
617 : : u8 reserved1[0x1];
618 : : u8 ext_hdr_flag[0x1];
619 : : u8 seq_num_flag[0x1];
620 : : u8 pdu_flag[0x1];
621 : : };
622 : : };
623 : : u8 msg_type[0x8];
624 : : u8 msg_len[0x8];
625 : : u8 teid[0x20];
626 : : };
627 : :
628 : : struct mlx5_ifc_header_opt_gtp_bits {
629 : : u8 seq_num[0x10];
630 : : u8 pdu_num[0x8];
631 : : u8 next_ext_hdr_type[0x8];
632 : : };
633 : :
634 : : struct mlx5_ifc_header_gtp_psc_bits {
635 : : u8 len[0x8];
636 : : u8 pdu_type[0x4];
637 : : u8 flags[0x4];
638 : : u8 qfi[0x8];
639 : : u8 reserved2[0x8];
640 : : };
641 : :
642 : : struct mlx5_ifc_header_ipv6_vtc_bits {
643 : : u8 version[0x4];
644 : : union {
645 : : u8 tos[0x8];
646 : : struct {
647 : : u8 dscp[0x6];
648 : : u8 ecn[0x2];
649 : : };
650 : : };
651 : : u8 flow_label[0x14];
652 : : };
653 : :
654 : : struct mlx5_ifc_header_ipv6_routing_ext_bits {
655 : : u8 next_hdr[0x8];
656 : : u8 hdr_len[0x8];
657 : : u8 type[0x8];
658 : : u8 segments_left[0x8];
659 : : union {
660 : : u8 flags[0x20];
661 : : struct {
662 : : u8 last_entry[0x8];
663 : : u8 flag[0x8];
664 : : u8 tag[0x10];
665 : : };
666 : : };
667 : : };
668 : :
669 : : struct mlx5_ifc_header_vxlan_bits {
670 : : u8 flags[0x8];
671 : : u8 reserved1[0x18];
672 : : u8 vni[0x18];
673 : : u8 reserved2[0x8];
674 : : };
675 : :
676 : : struct mlx5_ifc_header_vxlan_gpe_bits {
677 : : u8 flags[0x8];
678 : : u8 rsvd0[0x10];
679 : : u8 protocol[0x8];
680 : : u8 vni[0x18];
681 : : u8 rsvd1[0x8];
682 : : };
683 : :
684 : : struct mlx5_ifc_header_gre_bits {
685 : : union {
686 : : u8 c_rsvd0_ver[0x10];
687 : : struct {
688 : : u8 gre_c_present[0x1];
689 : : u8 reserved_at_1[0x1];
690 : : u8 gre_k_present[0x1];
691 : : u8 gre_s_present[0x1];
692 : : u8 reserved_at_4[0x9];
693 : : u8 version[0x3];
694 : : };
695 : : };
696 : : u8 gre_protocol[0x10];
697 : : u8 checksum[0x10];
698 : : u8 reserved_at_30[0x10];
699 : : };
700 : :
701 : : struct mlx5_ifc_header_geneve_bits {
702 : : union {
703 : : u8 ver_opt_len_o_c_rsvd[0x10];
704 : : struct {
705 : : u8 version[0x2];
706 : : u8 opt_len[0x6];
707 : : u8 o_flag[0x1];
708 : : u8 c_flag[0x1];
709 : : u8 reserved_at_a[0x6];
710 : : };
711 : : };
712 : : u8 protocol_type[0x10];
713 : : u8 vni[0x18];
714 : : u8 reserved_at_38[0x8];
715 : : };
716 : :
717 : : struct mlx5_ifc_header_geneve_opt_bits {
718 : : u8 class[0x10];
719 : : u8 type[0x8];
720 : : u8 reserved[0x3];
721 : : u8 len[0x5];
722 : : };
723 : :
724 : : struct mlx5_ifc_header_icmp_bits {
725 : : union {
726 : : u8 icmp_dw1[0x20];
727 : : struct {
728 : : u8 type[0x8];
729 : : u8 code[0x8];
730 : : u8 cksum[0x10];
731 : : };
732 : : };
733 : : union {
734 : : u8 icmp_dw2[0x20];
735 : : struct {
736 : : u8 ident[0x10];
737 : : u8 seq_nb[0x10];
738 : : };
739 : : };
740 : : };
741 : :
742 : : struct mlx5dr_definer {
743 : : enum mlx5dr_definer_type type;
744 : : uint8_t dw_selector[DW_SELECTORS];
745 : : uint8_t byte_selector[BYTE_SELECTORS];
746 : : struct mlx5dr_rule_match_tag mask;
747 : : struct mlx5dr_devx_obj *obj;
748 : : };
749 : :
750 : : struct mlx5dr_definer_cache {
751 : : LIST_HEAD(definer_head, mlx5dr_definer_cache_item) head;
752 : : };
753 : :
754 : : struct mlx5dr_definer_cache_item {
755 : : struct mlx5dr_definer definer;
756 : : uint32_t refcount;
757 : : LIST_ENTRY(mlx5dr_definer_cache_item) next;
758 : : };
759 : :
760 : : static inline bool
761 : : mlx5dr_definer_is_jumbo(struct mlx5dr_definer *definer)
762 : : {
763 [ # # # # : 0 : return (definer->type == MLX5DR_DEFINER_TYPE_JUMBO);
# # # # #
# ]
764 : : }
765 : :
766 : : void mlx5dr_definer_create_tag(const struct rte_flow_item *items,
767 : : struct mlx5dr_definer_fc *fc,
768 : : uint32_t fc_sz,
769 : : uint8_t *tag);
770 : :
771 : : void mlx5dr_definer_create_tag_range(const struct rte_flow_item *items,
772 : : struct mlx5dr_definer_fc *fc,
773 : : uint32_t fc_sz,
774 : : uint8_t *tag);
775 : :
776 : : int mlx5dr_definer_get_id(struct mlx5dr_definer *definer);
777 : :
778 : : int mlx5dr_definer_matcher_init(struct mlx5dr_context *ctx,
779 : : struct mlx5dr_matcher *matcher);
780 : :
781 : : void mlx5dr_definer_matcher_uninit(struct mlx5dr_matcher *matcher);
782 : :
783 : : int mlx5dr_definer_init_cache(struct mlx5dr_definer_cache **cache);
784 : :
785 : : void mlx5dr_definer_uninit_cache(struct mlx5dr_definer_cache *cache);
786 : :
787 : : int mlx5dr_definer_compare(struct mlx5dr_definer *definer_a,
788 : : struct mlx5dr_definer *definer_b);
789 : :
790 : : #endif
|