Loading...
Note: File does not exist in v3.5.6.
1/* SPDX-License-Identifier: GPL-2.0 */
2/* Copyright (C) 2024 Intel Corporation */
3
4#ifndef _ICE_PARSER_H_
5#define _ICE_PARSER_H_
6
7#define ICE_SEC_DATA_OFFSET 4
8#define ICE_SID_RXPARSER_IMEM_ENTRY_SIZE 48
9#define ICE_SID_RXPARSER_METADATA_INIT_ENTRY_SIZE 24
10#define ICE_SID_RXPARSER_CAM_ENTRY_SIZE 16
11#define ICE_SID_RXPARSER_PG_SPILL_ENTRY_SIZE 17
12#define ICE_SID_RXPARSER_NOMATCH_CAM_ENTRY_SIZE 12
13#define ICE_SID_RXPARSER_NOMATCH_SPILL_ENTRY_SIZE 13
14#define ICE_SID_RXPARSER_BOOST_TCAM_ENTRY_SIZE 88
15#define ICE_SID_RXPARSER_MARKER_TYPE_ENTRY_SIZE 24
16#define ICE_SID_RXPARSER_MARKER_GRP_ENTRY_SIZE 8
17#define ICE_SID_RXPARSER_PROTO_GRP_ENTRY_SIZE 24
18#define ICE_SID_RXPARSER_FLAG_REDIR_ENTRY_SIZE 1
19
20#define ICE_SEC_LBL_DATA_OFFSET 2
21#define ICE_SID_LBL_ENTRY_SIZE 66
22
23/*** ICE_SID_RXPARSER_IMEM section ***/
24#define ICE_IMEM_TABLE_SIZE 192
25
26/* TCAM boost Master; if bit is set, and TCAM hit, TCAM output overrides iMEM
27 * output.
28 */
29struct ice_bst_main {
30 bool alu0;
31 bool alu1;
32 bool alu2;
33 bool pg;
34};
35
36struct ice_bst_keybuilder {
37 u8 prio; /* 0-3: PG precedence within ALUs (3 highest) */
38 bool tsr_ctrl; /* TCAM Search Register control */
39};
40
41/* Next protocol Key builder */
42struct ice_np_keybuilder {
43 u8 opc;
44 u8 start_reg0;
45 u8 len_reg1;
46};
47
48enum ice_np_keybuilder_opcode {
49 ICE_NPKB_OPC_EXTRACT = 0,
50 ICE_NPKB_OPC_BUILD = 1,
51 ICE_NPKB_OPC_BYPASS = 2,
52};
53
54/* Parse Graph Key builder */
55struct ice_pg_keybuilder {
56 bool flag0_ena;
57 bool flag1_ena;
58 bool flag2_ena;
59 bool flag3_ena;
60 u8 flag0_idx;
61 u8 flag1_idx;
62 u8 flag2_idx;
63 u8 flag3_idx;
64 u8 alu_reg_idx;
65};
66
67enum ice_alu_idx {
68 ICE_ALU0_IDX = 0,
69 ICE_ALU1_IDX = 1,
70 ICE_ALU2_IDX = 2,
71};
72
73enum ice_alu_opcode {
74 ICE_ALU_PARK = 0,
75 ICE_ALU_MOV_ADD = 1,
76 ICE_ALU_ADD = 2,
77 ICE_ALU_MOV_AND = 4,
78 ICE_ALU_AND = 5,
79 ICE_ALU_AND_IMM = 6,
80 ICE_ALU_MOV_OR = 7,
81 ICE_ALU_OR = 8,
82 ICE_ALU_MOV_XOR = 9,
83 ICE_ALU_XOR = 10,
84 ICE_ALU_NOP = 11,
85 ICE_ALU_BR = 12,
86 ICE_ALU_BREQ = 13,
87 ICE_ALU_BRNEQ = 14,
88 ICE_ALU_BRGT = 15,
89 ICE_ALU_BRLT = 16,
90 ICE_ALU_BRGEQ = 17,
91 ICE_ALU_BRLEG = 18,
92 ICE_ALU_SETEQ = 19,
93 ICE_ALU_ANDEQ = 20,
94 ICE_ALU_OREQ = 21,
95 ICE_ALU_SETNEQ = 22,
96 ICE_ALU_ANDNEQ = 23,
97 ICE_ALU_ORNEQ = 24,
98 ICE_ALU_SETGT = 25,
99 ICE_ALU_ANDGT = 26,
100 ICE_ALU_ORGT = 27,
101 ICE_ALU_SETLT = 28,
102 ICE_ALU_ANDLT = 29,
103 ICE_ALU_ORLT = 30,
104 ICE_ALU_MOV_SUB = 31,
105 ICE_ALU_SUB = 32,
106 ICE_ALU_INVALID = 64,
107};
108
109enum ice_proto_off_opcode {
110 ICE_PO_OFF_REMAIN = 0,
111 ICE_PO_OFF_HDR_ADD = 1,
112 ICE_PO_OFF_HDR_SUB = 2,
113};
114
115struct ice_alu {
116 enum ice_alu_opcode opc;
117 u8 src_start;
118 u8 src_len;
119 bool shift_xlate_sel;
120 u8 shift_xlate_key;
121 u8 src_reg_id;
122 u8 dst_reg_id;
123 bool inc0;
124 bool inc1;
125 u8 proto_offset_opc;
126 u8 proto_offset;
127 u8 branch_addr;
128 u16 imm;
129 bool dedicate_flags_ena;
130 u8 dst_start;
131 u8 dst_len;
132 bool flags_extr_imm;
133 u8 flags_start_imm;
134};
135
136/* Parser program code (iMEM) */
137struct ice_imem_item {
138 u16 idx;
139 struct ice_bst_main b_m;
140 struct ice_bst_keybuilder b_kb;
141 u8 pg_prio;
142 struct ice_np_keybuilder np_kb;
143 struct ice_pg_keybuilder pg_kb;
144 struct ice_alu alu0;
145 struct ice_alu alu1;
146 struct ice_alu alu2;
147};
148
149/*** ICE_SID_RXPARSER_METADATA_INIT section ***/
150#define ICE_METAINIT_TABLE_SIZE 16
151
152/* Metadata Initialization item */
153struct ice_metainit_item {
154 u16 idx;
155
156 u8 tsr; /* TCAM Search key Register */
157 u16 ho; /* Header Offset register */
158 u16 pc; /* Program Counter register */
159 u16 pg_rn; /* Parse Graph Root Node */
160 u8 cd; /* Control Domain ID */
161
162 /* General Purpose Registers */
163 bool gpr_a_ctrl;
164 u8 gpr_a_data_mdid;
165 u8 gpr_a_data_start;
166 u8 gpr_a_data_len;
167 u8 gpr_a_id;
168
169 bool gpr_b_ctrl;
170 u8 gpr_b_data_mdid;
171 u8 gpr_b_data_start;
172 u8 gpr_b_data_len;
173 u8 gpr_b_id;
174
175 bool gpr_c_ctrl;
176 u8 gpr_c_data_mdid;
177 u8 gpr_c_data_start;
178 u8 gpr_c_data_len;
179 u8 gpr_c_id;
180
181 bool gpr_d_ctrl;
182 u8 gpr_d_data_mdid;
183 u8 gpr_d_data_start;
184 u8 gpr_d_data_len;
185 u8 gpr_d_id;
186
187 u64 flags; /* Initial value for all flags */
188};
189
190/*** ICE_SID_RXPARSER_CAM, ICE_SID_RXPARSER_PG_SPILL,
191 * ICE_SID_RXPARSER_NOMATCH_CAM and ICE_SID_RXPARSER_NOMATCH_CAM
192 * sections ***/
193#define ICE_PG_CAM_TABLE_SIZE 2048
194#define ICE_PG_SP_CAM_TABLE_SIZE 128
195#define ICE_PG_NM_CAM_TABLE_SIZE 1024
196#define ICE_PG_NM_SP_CAM_TABLE_SIZE 64
197
198struct ice_pg_cam_key {
199 bool valid;
200 struct_group_attr(val, __packed,
201 u16 node_id; /* Node ID of protocol in parse graph */
202 bool flag0;
203 bool flag1;
204 bool flag2;
205 bool flag3;
206 u8 boost_idx; /* Boost TCAM match index */
207 u16 alu_reg;
208 u32 next_proto; /* next Protocol value (must be last) */
209 );
210};
211
212struct ice_pg_nm_cam_key {
213 bool valid;
214 struct_group_attr(val, __packed,
215 u16 node_id;
216 bool flag0;
217 bool flag1;
218 bool flag2;
219 bool flag3;
220 u8 boost_idx;
221 u16 alu_reg;
222 );
223};
224
225struct ice_pg_cam_action {
226 u16 next_node; /* Parser Node ID for the next round */
227 u8 next_pc; /* next Program Counter */
228 bool is_pg; /* is protocol group */
229 u8 proto_id; /* protocol ID or proto group ID */
230 bool is_mg; /* is marker group */
231 u8 marker_id; /* marker ID or marker group ID */
232 bool is_last_round;
233 bool ho_polarity; /* header offset polarity */
234 u16 ho_inc;
235};
236
237/* Parse Graph item */
238struct ice_pg_cam_item {
239 u16 idx;
240 struct ice_pg_cam_key key;
241 struct ice_pg_cam_action action;
242};
243
244/* Parse Graph No Match item */
245struct ice_pg_nm_cam_item {
246 u16 idx;
247 struct ice_pg_nm_cam_key key;
248 struct ice_pg_cam_action action;
249};
250
251struct ice_pg_cam_item *ice_pg_cam_match(struct ice_pg_cam_item *table,
252 int size, struct ice_pg_cam_key *key);
253struct ice_pg_nm_cam_item *
254ice_pg_nm_cam_match(struct ice_pg_nm_cam_item *table, int size,
255 struct ice_pg_cam_key *key);
256
257/*** ICE_SID_RXPARSER_BOOST_TCAM and ICE_SID_LBL_RXPARSER_TMEM sections ***/
258#define ICE_BST_TCAM_TABLE_SIZE 256
259#define ICE_BST_TCAM_KEY_SIZE 20
260
261/* Boost TCAM item */
262struct ice_bst_tcam_item {
263 u16 addr;
264 u8 key[ICE_BST_TCAM_KEY_SIZE];
265 u8 key_inv[ICE_BST_TCAM_KEY_SIZE];
266 u8 hit_idx_grp;
267 u8 pg_prio;
268 struct ice_np_keybuilder np_kb;
269 struct ice_pg_keybuilder pg_kb;
270 struct ice_alu alu0;
271 struct ice_alu alu1;
272 struct ice_alu alu2;
273};
274
275#define ICE_LBL_LEN 64
276#define ICE_LBL_BST_DVM "BOOST_MAC_VLAN_DVM"
277#define ICE_LBL_BST_SVM "BOOST_MAC_VLAN_SVM"
278#define ICE_LBL_TNL_VXLAN "TNL_VXLAN"
279#define ICE_LBL_TNL_GENEVE "TNL_GENEVE"
280#define ICE_LBL_TNL_UDP_ECPRI "TNL_UDP_ECPRI"
281
282enum ice_lbl_type {
283 ICE_LBL_BST_TYPE_UNKNOWN,
284 ICE_LBL_BST_TYPE_DVM,
285 ICE_LBL_BST_TYPE_SVM,
286 ICE_LBL_BST_TYPE_VXLAN,
287 ICE_LBL_BST_TYPE_GENEVE,
288 ICE_LBL_BST_TYPE_UDP_ECPRI,
289};
290
291struct ice_lbl_item {
292 u16 idx;
293 char label[ICE_LBL_LEN];
294
295 /* must be at the end, not part of the DDP section */
296 enum ice_lbl_type type;
297};
298
299struct ice_bst_tcam_item *
300ice_bst_tcam_match(struct ice_bst_tcam_item *tcam_table, u8 *pat);
301struct ice_bst_tcam_item *
302ice_bst_tcam_search(struct ice_bst_tcam_item *tcam_table,
303 struct ice_lbl_item *lbl_table,
304 enum ice_lbl_type type, u16 *start);
305
306/*** ICE_SID_RXPARSER_MARKER_PTYPE section ***/
307#define ICE_PTYPE_MK_TCAM_TABLE_SIZE 1024
308#define ICE_PTYPE_MK_TCAM_KEY_SIZE 10
309
310struct ice_ptype_mk_tcam_item {
311 u16 address;
312 u16 ptype;
313 u8 key[ICE_PTYPE_MK_TCAM_KEY_SIZE];
314 u8 key_inv[ICE_PTYPE_MK_TCAM_KEY_SIZE];
315} __packed;
316
317struct ice_ptype_mk_tcam_item *
318ice_ptype_mk_tcam_match(struct ice_ptype_mk_tcam_item *table,
319 u8 *pat, int len);
320/*** ICE_SID_RXPARSER_MARKER_GRP section ***/
321#define ICE_MK_GRP_TABLE_SIZE 128
322#define ICE_MK_COUNT_PER_GRP 8
323
324/* Marker Group item */
325struct ice_mk_grp_item {
326 int idx;
327 u8 markers[ICE_MK_COUNT_PER_GRP];
328};
329
330/*** ICE_SID_RXPARSER_PROTO_GRP section ***/
331#define ICE_PROTO_COUNT_PER_GRP 8
332#define ICE_PROTO_GRP_TABLE_SIZE 192
333#define ICE_PROTO_GRP_ITEM_SIZE 22
334struct ice_proto_off {
335 bool polarity; /* true: positive, false: negative */
336 u8 proto_id;
337 u16 offset; /* 10 bit protocol offset */
338};
339
340/* Protocol Group item */
341struct ice_proto_grp_item {
342 u16 idx;
343 struct ice_proto_off po[ICE_PROTO_COUNT_PER_GRP];
344};
345
346/*** ICE_SID_RXPARSER_FLAG_REDIR section ***/
347#define ICE_FLG_RD_TABLE_SIZE 64
348#define ICE_FLG_RDT_SIZE 64
349
350/* Flags Redirection item */
351struct ice_flg_rd_item {
352 u16 idx;
353 bool expose;
354 u8 intr_flg_id; /* Internal Flag ID */
355};
356
357u64 ice_flg_redirect(struct ice_flg_rd_item *table, u64 psr_flg);
358
359/*** ICE_SID_XLT_KEY_BUILDER_SW, ICE_SID_XLT_KEY_BUILDER_ACL,
360 * ICE_SID_XLT_KEY_BUILDER_FD and ICE_SID_XLT_KEY_BUILDER_RSS
361 * sections ***/
362#define ICE_XLT_KB_FLAG0_14_CNT 15
363#define ICE_XLT_KB_TBL_CNT 8
364#define ICE_XLT_KB_TBL_ENTRY_SIZE 24
365
366struct ice_xlt_kb_entry {
367 u8 xlt1_ad_sel;
368 u8 xlt2_ad_sel;
369 u16 flg0_14_sel[ICE_XLT_KB_FLAG0_14_CNT];
370 u8 xlt1_md_sel;
371 u8 xlt2_md_sel;
372};
373
374/* XLT Key Builder */
375struct ice_xlt_kb {
376 u8 xlt1_pm; /* XLT1 Partition Mode */
377 u8 xlt2_pm; /* XLT2 Partition Mode */
378 u8 prof_id_pm; /* Profile ID Partition Mode */
379 u64 flag15;
380
381 struct ice_xlt_kb_entry entries[ICE_XLT_KB_TBL_CNT];
382};
383
384u16 ice_xlt_kb_flag_get(struct ice_xlt_kb *kb, u64 pkt_flag);
385
386/*** Parser API ***/
387#define ICE_GPR_HV_IDX 64
388#define ICE_GPR_HV_SIZE 32
389#define ICE_GPR_ERR_IDX 84
390#define ICE_GPR_FLG_IDX 104
391#define ICE_GPR_FLG_SIZE 16
392
393#define ICE_GPR_TSR_IDX 108 /* TSR: TCAM Search Register */
394#define ICE_GPR_NN_IDX 109 /* NN: Next Parsing Cycle Node ID */
395#define ICE_GPR_HO_IDX 110 /* HO: Next Parsing Cycle hdr Offset */
396#define ICE_GPR_NP_IDX 111 /* NP: Next Parsing Cycle */
397
398#define ICE_PARSER_MAX_PKT_LEN 504
399#define ICE_PARSER_PKT_REV 32
400#define ICE_PARSER_GPR_NUM 128
401#define ICE_PARSER_FLG_NUM 64
402#define ICE_PARSER_ERR_NUM 16
403#define ICE_MARKER_ID_SIZE 9
404#define ICE_MARKER_MAX_SIZE \
405 (ICE_MARKER_ID_SIZE * BITS_PER_BYTE - 1)
406#define ICE_MARKER_ID_NUM 8
407#define ICE_PO_PAIR_SIZE 256
408
409struct ice_gpr_pu {
410 /* array of flags to indicate if GRP needs to be updated */
411 bool gpr_val_upd[ICE_PARSER_GPR_NUM];
412 u16 gpr_val[ICE_PARSER_GPR_NUM];
413 u64 flg_msk;
414 u64 flg_val;
415 u16 err_msk;
416 u16 err_val;
417};
418
419enum ice_pg_prio {
420 ICE_PG_P0 = 0,
421 ICE_PG_P1 = 1,
422 ICE_PG_P2 = 2,
423 ICE_PG_P3 = 3,
424};
425
426struct ice_parser_rt {
427 struct ice_parser *psr;
428 u16 gpr[ICE_PARSER_GPR_NUM];
429 u8 pkt_buf[ICE_PARSER_MAX_PKT_LEN + ICE_PARSER_PKT_REV];
430 u16 pkt_len;
431 u16 po;
432 u8 bst_key[ICE_BST_TCAM_KEY_SIZE];
433 struct ice_pg_cam_key pg_key;
434 u8 pg_prio;
435 struct ice_alu *alu0;
436 struct ice_alu *alu1;
437 struct ice_alu *alu2;
438 struct ice_pg_cam_action *action;
439 struct ice_gpr_pu pu;
440 u8 markers[ICE_MARKER_ID_SIZE];
441 bool protocols[ICE_PO_PAIR_SIZE];
442 u16 offsets[ICE_PO_PAIR_SIZE];
443};
444
445struct ice_parser_proto_off {
446 u8 proto_id; /* hardware protocol ID */
447 u16 offset; /* offset from the start of the protocol header */
448};
449
450#define ICE_PARSER_PROTO_OFF_PAIR_SIZE 16
451#define ICE_PARSER_FLAG_PSR_SIZE 8
452#define ICE_PARSER_FV_SIZE 48
453#define ICE_PARSER_FV_MAX 24
454#define ICE_BT_TUN_PORT_OFF_H 16
455#define ICE_BT_TUN_PORT_OFF_L 15
456#define ICE_BT_VM_OFF 0
457#define ICE_UDP_PORT_OFF_H 1
458#define ICE_UDP_PORT_OFF_L 0
459
460struct ice_parser_result {
461 u16 ptype; /* 16 bits hardware PTYPE */
462 /* array of protocol and header offset pairs */
463 struct ice_parser_proto_off po[ICE_PARSER_PROTO_OFF_PAIR_SIZE];
464 int po_num; /* # of protocol-offset pairs must <= 16 */
465 u64 flags_psr; /* parser flags */
466 u64 flags_pkt; /* packet flags */
467 u16 flags_sw; /* key builder flags for SW */
468 u16 flags_acl; /* key builder flags for ACL */
469 u16 flags_fd; /* key builder flags for FD */
470 u16 flags_rss; /* key builder flags for RSS */
471};
472
473void ice_parser_rt_reset(struct ice_parser_rt *rt);
474void ice_parser_rt_pktbuf_set(struct ice_parser_rt *rt, const u8 *pkt_buf,
475 int pkt_len);
476int ice_parser_rt_execute(struct ice_parser_rt *rt,
477 struct ice_parser_result *rslt);
478
479struct ice_parser {
480 struct ice_hw *hw; /* pointer to the hardware structure */
481
482 struct ice_imem_item *imem_table;
483 struct ice_metainit_item *mi_table;
484
485 struct ice_pg_cam_item *pg_cam_table;
486 struct ice_pg_cam_item *pg_sp_cam_table;
487 struct ice_pg_nm_cam_item *pg_nm_cam_table;
488 struct ice_pg_nm_cam_item *pg_nm_sp_cam_table;
489
490 struct ice_bst_tcam_item *bst_tcam_table;
491 struct ice_lbl_item *bst_lbl_table;
492 struct ice_ptype_mk_tcam_item *ptype_mk_tcam_table;
493 struct ice_mk_grp_item *mk_grp_table;
494 struct ice_proto_grp_item *proto_grp_table;
495 struct ice_flg_rd_item *flg_rd_table;
496
497 struct ice_xlt_kb *xlt_kb_sw;
498 struct ice_xlt_kb *xlt_kb_acl;
499 struct ice_xlt_kb *xlt_kb_fd;
500 struct ice_xlt_kb *xlt_kb_rss;
501
502 struct ice_parser_rt rt;
503};
504
505struct ice_parser *ice_parser_create(struct ice_hw *hw);
506void ice_parser_destroy(struct ice_parser *psr);
507void ice_parser_dvm_set(struct ice_parser *psr, bool on);
508int ice_parser_vxlan_tunnel_set(struct ice_parser *psr, u16 udp_port, bool on);
509int ice_parser_geneve_tunnel_set(struct ice_parser *psr, u16 udp_port, bool on);
510int ice_parser_ecpri_tunnel_set(struct ice_parser *psr, u16 udp_port, bool on);
511int ice_parser_run(struct ice_parser *psr, const u8 *pkt_buf,
512 int pkt_len, struct ice_parser_result *rslt);
513void ice_parser_result_dump(struct ice_hw *hw, struct ice_parser_result *rslt);
514
515struct ice_parser_fv {
516 u8 proto_id; /* hardware protocol ID */
517 u16 offset; /* offset from the start of the protocol header */
518 u16 spec; /* pattern to match */
519 u16 msk; /* pattern mask */
520};
521
522struct ice_parser_profile {
523 /* array of field vectors */
524 struct ice_parser_fv fv[ICE_PARSER_FV_SIZE];
525 int fv_num; /* # of field vectors must <= 48 */
526 u16 flags; /* key builder flags */
527 u16 flags_msk; /* key builder flag mask */
528
529 DECLARE_BITMAP(ptypes, ICE_FLOW_PTYPE_MAX); /* PTYPE bitmap */
530};
531
532int ice_parser_profile_init(struct ice_parser_result *rslt,
533 const u8 *pkt_buf, const u8 *msk_buf,
534 int buf_len, enum ice_block blk,
535 struct ice_parser_profile *prof);
536void ice_parser_profile_dump(struct ice_hw *hw,
537 struct ice_parser_profile *prof);
538#endif /* _ICE_PARSER_H_ */