Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.4.
  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_ */