541 lines · c
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 48#define ICE_SID_RXPARSER_IMEM_ENTRY_SIZE 489#define ICE_SID_RXPARSER_METADATA_INIT_ENTRY_SIZE 2410#define ICE_SID_RXPARSER_CAM_ENTRY_SIZE 1611#define ICE_SID_RXPARSER_PG_SPILL_ENTRY_SIZE 1712#define ICE_SID_RXPARSER_NOMATCH_CAM_ENTRY_SIZE 1213#define ICE_SID_RXPARSER_NOMATCH_SPILL_ENTRY_SIZE 1314#define ICE_SID_RXPARSER_BOOST_TCAM_ENTRY_SIZE 8815#define ICE_SID_RXPARSER_MARKER_TYPE_ENTRY_SIZE 2416#define ICE_SID_RXPARSER_MARKER_GRP_ENTRY_SIZE 817#define ICE_SID_RXPARSER_PROTO_GRP_ENTRY_SIZE 2418#define ICE_SID_RXPARSER_FLAG_REDIR_ENTRY_SIZE 119 20#define ICE_SEC_LBL_DATA_OFFSET 221#define ICE_SID_LBL_ENTRY_SIZE 6622 23/*** ICE_SID_RXPARSER_IMEM section ***/24#define ICE_IMEM_TABLE_SIZE 19225 26/* TCAM boost Master; if bit is set, and TCAM hit, TCAM output overrides iMEM27 * 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 16151 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_CAM192 * sections ***/193#define ICE_PG_CAM_TABLE_SIZE 2048194#define ICE_PG_SP_CAM_TABLE_SIZE 128195#define ICE_PG_NM_CAM_TABLE_SIZE 1024196#define ICE_PG_NM_SP_CAM_TABLE_SIZE 64197 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 256259#define ICE_BST_TCAM_KEY_SIZE 20260#define ICE_BST_KEY_TCAM_SIZE 19261 262/* Boost TCAM item */263struct ice_bst_tcam_item {264 u16 addr;265 u8 key[ICE_BST_TCAM_KEY_SIZE];266 u8 key_inv[ICE_BST_TCAM_KEY_SIZE];267 u8 hit_idx_grp;268 u8 pg_prio;269 struct ice_np_keybuilder np_kb;270 struct ice_pg_keybuilder pg_kb;271 struct ice_alu alu0;272 struct ice_alu alu1;273 struct ice_alu alu2;274};275 276#define ICE_LBL_LEN 64277#define ICE_LBL_BST_DVM "BOOST_MAC_VLAN_DVM"278#define ICE_LBL_BST_SVM "BOOST_MAC_VLAN_SVM"279#define ICE_LBL_TNL_VXLAN "TNL_VXLAN"280#define ICE_LBL_TNL_GENEVE "TNL_GENEVE"281#define ICE_LBL_TNL_UDP_ECPRI "TNL_UDP_ECPRI"282 283enum ice_lbl_type {284 ICE_LBL_BST_TYPE_UNKNOWN,285 ICE_LBL_BST_TYPE_DVM,286 ICE_LBL_BST_TYPE_SVM,287 ICE_LBL_BST_TYPE_VXLAN,288 ICE_LBL_BST_TYPE_GENEVE,289 ICE_LBL_BST_TYPE_UDP_ECPRI,290};291 292struct ice_lbl_item {293 u16 idx;294 char label[ICE_LBL_LEN];295 296 /* must be at the end, not part of the DDP section */297 enum ice_lbl_type type;298};299 300struct ice_bst_tcam_item *301ice_bst_tcam_match(struct ice_bst_tcam_item *tcam_table, u8 *pat);302struct ice_bst_tcam_item *303ice_bst_tcam_search(struct ice_bst_tcam_item *tcam_table,304 struct ice_lbl_item *lbl_table,305 enum ice_lbl_type type, u16 *start);306 307/*** ICE_SID_RXPARSER_MARKER_PTYPE section ***/308#define ICE_PTYPE_MK_TCAM_TABLE_SIZE 1024309#define ICE_PTYPE_MK_TCAM_KEY_SIZE 10310 311struct ice_ptype_mk_tcam_item {312 u16 address;313 u16 ptype;314 u8 key[ICE_PTYPE_MK_TCAM_KEY_SIZE];315 u8 key_inv[ICE_PTYPE_MK_TCAM_KEY_SIZE];316} __packed;317 318struct ice_ptype_mk_tcam_item *319ice_ptype_mk_tcam_match(struct ice_ptype_mk_tcam_item *table,320 u8 *pat, int len);321/*** ICE_SID_RXPARSER_MARKER_GRP section ***/322#define ICE_MK_GRP_TABLE_SIZE 128323#define ICE_MK_COUNT_PER_GRP 8324 325/* Marker Group item */326struct ice_mk_grp_item {327 int idx;328 u8 markers[ICE_MK_COUNT_PER_GRP];329};330 331/*** ICE_SID_RXPARSER_PROTO_GRP section ***/332#define ICE_PROTO_COUNT_PER_GRP 8333#define ICE_PROTO_GRP_TABLE_SIZE 192334#define ICE_PROTO_GRP_ITEM_SIZE 22335struct ice_proto_off {336 bool polarity; /* true: positive, false: negative */337 u8 proto_id;338 u16 offset; /* 10 bit protocol offset */339};340 341/* Protocol Group item */342struct ice_proto_grp_item {343 u16 idx;344 struct ice_proto_off po[ICE_PROTO_COUNT_PER_GRP];345};346 347/*** ICE_SID_RXPARSER_FLAG_REDIR section ***/348#define ICE_FLG_RD_TABLE_SIZE 64349#define ICE_FLG_RDT_SIZE 64350 351/* Flags Redirection item */352struct ice_flg_rd_item {353 u16 idx;354 bool expose;355 u8 intr_flg_id; /* Internal Flag ID */356};357 358u64 ice_flg_redirect(struct ice_flg_rd_item *table, u64 psr_flg);359 360/*** ICE_SID_XLT_KEY_BUILDER_SW, ICE_SID_XLT_KEY_BUILDER_ACL,361 * ICE_SID_XLT_KEY_BUILDER_FD and ICE_SID_XLT_KEY_BUILDER_RSS362 * sections ***/363#define ICE_XLT_KB_FLAG0_14_CNT 15364#define ICE_XLT_KB_TBL_CNT 8365#define ICE_XLT_KB_TBL_ENTRY_SIZE 24366 367struct ice_xlt_kb_entry {368 u8 xlt1_ad_sel;369 u8 xlt2_ad_sel;370 u16 flg0_14_sel[ICE_XLT_KB_FLAG0_14_CNT];371 u8 xlt1_md_sel;372 u8 xlt2_md_sel;373};374 375/* XLT Key Builder */376struct ice_xlt_kb {377 u8 xlt1_pm; /* XLT1 Partition Mode */378 u8 xlt2_pm; /* XLT2 Partition Mode */379 u8 prof_id_pm; /* Profile ID Partition Mode */380 u64 flag15;381 382 struct ice_xlt_kb_entry entries[ICE_XLT_KB_TBL_CNT];383};384 385u16 ice_xlt_kb_flag_get(struct ice_xlt_kb *kb, u64 pkt_flag);386 387/*** Parser API ***/388#define ICE_GPR_HV_IDX 64389#define ICE_GPR_HV_SIZE 32390#define ICE_GPR_ERR_IDX 84391#define ICE_GPR_FLG_IDX 104392#define ICE_GPR_FLG_SIZE 16393 394#define ICE_GPR_TSR_IDX 108 /* TSR: TCAM Search Register */395#define ICE_GPR_NN_IDX 109 /* NN: Next Parsing Cycle Node ID */396#define ICE_GPR_HO_IDX 110 /* HO: Next Parsing Cycle hdr Offset */397#define ICE_GPR_NP_IDX 111 /* NP: Next Parsing Cycle */398 399#define ICE_PARSER_MAX_PKT_LEN 504400#define ICE_PARSER_PKT_REV 32401#define ICE_PARSER_GPR_NUM 128402#define ICE_PARSER_FLG_NUM 64403#define ICE_PARSER_ERR_NUM 16404#define ICE_BST_KEY_SIZE 10405#define ICE_MARKER_ID_SIZE 9406#define ICE_MARKER_MAX_SIZE \407 (ICE_MARKER_ID_SIZE * BITS_PER_BYTE - 1)408#define ICE_MARKER_ID_NUM 8409#define ICE_PO_PAIR_SIZE 256410 411struct ice_gpr_pu {412 /* array of flags to indicate if GRP needs to be updated */413 bool gpr_val_upd[ICE_PARSER_GPR_NUM];414 u16 gpr_val[ICE_PARSER_GPR_NUM];415 u64 flg_msk;416 u64 flg_val;417 u16 err_msk;418 u16 err_val;419};420 421enum ice_pg_prio {422 ICE_PG_P0 = 0,423 ICE_PG_P1 = 1,424 ICE_PG_P2 = 2,425 ICE_PG_P3 = 3,426};427 428struct ice_parser_rt {429 struct ice_parser *psr;430 u16 gpr[ICE_PARSER_GPR_NUM];431 u8 pkt_buf[ICE_PARSER_MAX_PKT_LEN + ICE_PARSER_PKT_REV];432 u16 pkt_len;433 u16 po;434 u8 bst_key[ICE_BST_KEY_SIZE];435 struct ice_pg_cam_key pg_key;436 struct ice_alu *alu0;437 struct ice_alu *alu1;438 struct ice_alu *alu2;439 struct ice_pg_cam_action *action;440 u8 pg_prio;441 struct ice_gpr_pu pu;442 u8 markers[ICE_MARKER_ID_SIZE];443 bool protocols[ICE_PO_PAIR_SIZE];444 u16 offsets[ICE_PO_PAIR_SIZE];445};446 447struct ice_parser_proto_off {448 u8 proto_id; /* hardware protocol ID */449 u16 offset; /* offset from the start of the protocol header */450};451 452#define ICE_PARSER_PROTO_OFF_PAIR_SIZE 16453#define ICE_PARSER_FLAG_PSR_SIZE 8454#define ICE_PARSER_FV_SIZE 48455#define ICE_PARSER_FV_MAX 24456#define ICE_BT_TUN_PORT_OFF_H 16457#define ICE_BT_TUN_PORT_OFF_L 15458#define ICE_BT_VM_OFF 0459#define ICE_UDP_PORT_OFF_H 1460#define ICE_UDP_PORT_OFF_L 0461 462struct ice_parser_result {463 u16 ptype; /* 16 bits hardware PTYPE */464 /* array of protocol and header offset pairs */465 struct ice_parser_proto_off po[ICE_PARSER_PROTO_OFF_PAIR_SIZE];466 int po_num; /* # of protocol-offset pairs must <= 16 */467 u64 flags_psr; /* parser flags */468 u64 flags_pkt; /* packet flags */469 u16 flags_sw; /* key builder flags for SW */470 u16 flags_acl; /* key builder flags for ACL */471 u16 flags_fd; /* key builder flags for FD */472 u16 flags_rss; /* key builder flags for RSS */473};474 475void ice_parser_rt_reset(struct ice_parser_rt *rt);476void ice_parser_rt_pktbuf_set(struct ice_parser_rt *rt, const u8 *pkt_buf,477 int pkt_len);478int ice_parser_rt_execute(struct ice_parser_rt *rt,479 struct ice_parser_result *rslt);480 481struct ice_parser {482 struct ice_hw *hw; /* pointer to the hardware structure */483 484 struct ice_imem_item *imem_table;485 struct ice_metainit_item *mi_table;486 487 struct ice_pg_cam_item *pg_cam_table;488 struct ice_pg_cam_item *pg_sp_cam_table;489 struct ice_pg_nm_cam_item *pg_nm_cam_table;490 struct ice_pg_nm_cam_item *pg_nm_sp_cam_table;491 492 struct ice_bst_tcam_item *bst_tcam_table;493 struct ice_lbl_item *bst_lbl_table;494 struct ice_ptype_mk_tcam_item *ptype_mk_tcam_table;495 struct ice_mk_grp_item *mk_grp_table;496 struct ice_proto_grp_item *proto_grp_table;497 struct ice_flg_rd_item *flg_rd_table;498 499 struct ice_xlt_kb *xlt_kb_sw;500 struct ice_xlt_kb *xlt_kb_acl;501 struct ice_xlt_kb *xlt_kb_fd;502 struct ice_xlt_kb *xlt_kb_rss;503 504 struct ice_parser_rt rt;505};506 507struct ice_parser *ice_parser_create(struct ice_hw *hw);508void ice_parser_destroy(struct ice_parser *psr);509void ice_parser_dvm_set(struct ice_parser *psr, bool on);510int ice_parser_vxlan_tunnel_set(struct ice_parser *psr, u16 udp_port, bool on);511int ice_parser_geneve_tunnel_set(struct ice_parser *psr, u16 udp_port, bool on);512int ice_parser_ecpri_tunnel_set(struct ice_parser *psr, u16 udp_port, bool on);513int ice_parser_run(struct ice_parser *psr, const u8 *pkt_buf,514 int pkt_len, struct ice_parser_result *rslt);515void ice_parser_result_dump(struct ice_hw *hw, struct ice_parser_result *rslt);516 517struct ice_parser_fv {518 u8 proto_id; /* hardware protocol ID */519 u16 offset; /* offset from the start of the protocol header */520 u16 spec; /* pattern to match */521 u16 msk; /* pattern mask */522};523 524struct ice_parser_profile {525 /* array of field vectors */526 struct ice_parser_fv fv[ICE_PARSER_FV_SIZE];527 int fv_num; /* # of field vectors must <= 48 */528 u16 flags; /* key builder flags */529 u16 flags_msk; /* key builder flag mask */530 531 DECLARE_BITMAP(ptypes, ICE_FLOW_PTYPE_MAX); /* PTYPE bitmap */532};533 534int ice_parser_profile_init(struct ice_parser_result *rslt,535 const u8 *pkt_buf, const u8 *msk_buf,536 int buf_len, enum ice_block blk,537 struct ice_parser_profile *prof);538void ice_parser_profile_dump(struct ice_hw *hw,539 struct ice_parser_profile *prof);540#endif /* _ICE_PARSER_H_ */541