1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright (c) 2019, Intel Corporation. */ 3 4 #ifndef _ICE_FLEX_TYPE_H_ 5 #define _ICE_FLEX_TYPE_H_ 6 7 #define ICE_FV_OFFSET_INVAL 0x1FF 8 9 /* Extraction Sequence (Field Vector) Table */ 10 struct ice_fv_word { 11 u8 prot_id; 12 u16 off; /* Offset within the protocol header */ 13 u8 resvrd; 14 } __packed; 15 16 #define ICE_MAX_FV_WORDS 48 17 struct ice_fv { 18 struct ice_fv_word ew[ICE_MAX_FV_WORDS]; 19 }; 20 21 /* Package and segment headers and tables */ 22 struct ice_pkg_hdr { 23 struct ice_pkg_ver pkg_format_ver; 24 __le32 seg_count; 25 __le32 seg_offset[]; 26 }; 27 28 /* generic segment */ 29 struct ice_generic_seg_hdr { 30 #define SEGMENT_TYPE_METADATA 0x00000001 31 #define SEGMENT_TYPE_ICE 0x00000010 32 __le32 seg_type; 33 struct ice_pkg_ver seg_format_ver; 34 __le32 seg_size; 35 char seg_id[ICE_PKG_NAME_SIZE]; 36 }; 37 38 /* ice specific segment */ 39 40 union ice_device_id { 41 struct { 42 __le16 device_id; 43 __le16 vendor_id; 44 } dev_vend_id; 45 __le32 id; 46 }; 47 48 struct ice_device_id_entry { 49 union ice_device_id device; 50 union ice_device_id sub_device; 51 }; 52 53 struct ice_seg { 54 struct ice_generic_seg_hdr hdr; 55 __le32 device_table_count; 56 struct ice_device_id_entry device_table[]; 57 }; 58 59 struct ice_nvm_table { 60 __le32 table_count; 61 __le32 vers[]; 62 }; 63 64 struct ice_buf { 65 #define ICE_PKG_BUF_SIZE 4096 66 u8 buf[ICE_PKG_BUF_SIZE]; 67 }; 68 69 struct ice_buf_table { 70 __le32 buf_count; 71 struct ice_buf buf_array[]; 72 }; 73 74 /* global metadata specific segment */ 75 struct ice_global_metadata_seg { 76 struct ice_generic_seg_hdr hdr; 77 struct ice_pkg_ver pkg_ver; 78 __le32 rsvd; 79 char pkg_name[ICE_PKG_NAME_SIZE]; 80 }; 81 82 #define ICE_MIN_S_OFF 12 83 #define ICE_MAX_S_OFF 4095 84 #define ICE_MIN_S_SZ 1 85 #define ICE_MAX_S_SZ 4084 86 87 /* section information */ 88 struct ice_section_entry { 89 __le32 type; 90 __le16 offset; 91 __le16 size; 92 }; 93 94 #define ICE_MIN_S_COUNT 1 95 #define ICE_MAX_S_COUNT 511 96 #define ICE_MIN_S_DATA_END 12 97 #define ICE_MAX_S_DATA_END 4096 98 99 #define ICE_METADATA_BUF 0x80000000 100 101 struct ice_buf_hdr { 102 __le16 section_count; 103 __le16 data_end; 104 struct ice_section_entry section_entry[]; 105 }; 106 107 #define ICE_MAX_ENTRIES_IN_BUF(hd_sz, ent_sz) ((ICE_PKG_BUF_SIZE - \ 108 struct_size((struct ice_buf_hdr *)0, section_entry, 1) - (hd_sz)) /\ 109 (ent_sz)) 110 111 /* ice package section IDs */ 112 #define ICE_SID_METADATA 1 113 #define ICE_SID_XLT0_SW 10 114 #define ICE_SID_XLT_KEY_BUILDER_SW 11 115 #define ICE_SID_XLT1_SW 12 116 #define ICE_SID_XLT2_SW 13 117 #define ICE_SID_PROFID_TCAM_SW 14 118 #define ICE_SID_PROFID_REDIR_SW 15 119 #define ICE_SID_FLD_VEC_SW 16 120 #define ICE_SID_CDID_KEY_BUILDER_SW 17 121 122 struct ice_meta_sect { 123 struct ice_pkg_ver ver; 124 #define ICE_META_SECT_NAME_SIZE 28 125 char name[ICE_META_SECT_NAME_SIZE]; 126 __le32 track_id; 127 }; 128 129 #define ICE_SID_CDID_REDIR_SW 18 130 131 #define ICE_SID_XLT0_ACL 20 132 #define ICE_SID_XLT_KEY_BUILDER_ACL 21 133 #define ICE_SID_XLT1_ACL 22 134 #define ICE_SID_XLT2_ACL 23 135 #define ICE_SID_PROFID_TCAM_ACL 24 136 #define ICE_SID_PROFID_REDIR_ACL 25 137 #define ICE_SID_FLD_VEC_ACL 26 138 #define ICE_SID_CDID_KEY_BUILDER_ACL 27 139 #define ICE_SID_CDID_REDIR_ACL 28 140 141 #define ICE_SID_XLT0_FD 30 142 #define ICE_SID_XLT_KEY_BUILDER_FD 31 143 #define ICE_SID_XLT1_FD 32 144 #define ICE_SID_XLT2_FD 33 145 #define ICE_SID_PROFID_TCAM_FD 34 146 #define ICE_SID_PROFID_REDIR_FD 35 147 #define ICE_SID_FLD_VEC_FD 36 148 #define ICE_SID_CDID_KEY_BUILDER_FD 37 149 #define ICE_SID_CDID_REDIR_FD 38 150 151 #define ICE_SID_XLT0_RSS 40 152 #define ICE_SID_XLT_KEY_BUILDER_RSS 41 153 #define ICE_SID_XLT1_RSS 42 154 #define ICE_SID_XLT2_RSS 43 155 #define ICE_SID_PROFID_TCAM_RSS 44 156 #define ICE_SID_PROFID_REDIR_RSS 45 157 #define ICE_SID_FLD_VEC_RSS 46 158 #define ICE_SID_CDID_KEY_BUILDER_RSS 47 159 #define ICE_SID_CDID_REDIR_RSS 48 160 161 #define ICE_SID_RXPARSER_BOOST_TCAM 56 162 #define ICE_SID_TXPARSER_BOOST_TCAM 66 163 164 #define ICE_SID_XLT0_PE 80 165 #define ICE_SID_XLT_KEY_BUILDER_PE 81 166 #define ICE_SID_XLT1_PE 82 167 #define ICE_SID_XLT2_PE 83 168 #define ICE_SID_PROFID_TCAM_PE 84 169 #define ICE_SID_PROFID_REDIR_PE 85 170 #define ICE_SID_FLD_VEC_PE 86 171 #define ICE_SID_CDID_KEY_BUILDER_PE 87 172 #define ICE_SID_CDID_REDIR_PE 88 173 174 /* Label Metadata section IDs */ 175 #define ICE_SID_LBL_FIRST 0x80000010 176 #define ICE_SID_LBL_RXPARSER_TMEM 0x80000018 177 /* The following define MUST be updated to reflect the last label section ID */ 178 #define ICE_SID_LBL_LAST 0x80000038 179 180 enum ice_block { 181 ICE_BLK_SW = 0, 182 ICE_BLK_ACL, 183 ICE_BLK_FD, 184 ICE_BLK_RSS, 185 ICE_BLK_PE, 186 ICE_BLK_COUNT 187 }; 188 189 enum ice_sect { 190 ICE_XLT0 = 0, 191 ICE_XLT_KB, 192 ICE_XLT1, 193 ICE_XLT2, 194 ICE_PROF_TCAM, 195 ICE_PROF_REDIR, 196 ICE_VEC_TBL, 197 ICE_CDID_KB, 198 ICE_CDID_REDIR, 199 ICE_SECT_COUNT 200 }; 201 202 #define ICE_MAC_IPV4_GTPU_IPV4_FRAG 331 203 #define ICE_MAC_IPV4_GTPU_IPV4_PAY 332 204 #define ICE_MAC_IPV4_GTPU_IPV4_UDP_PAY 333 205 #define ICE_MAC_IPV4_GTPU_IPV4_TCP 334 206 #define ICE_MAC_IPV4_GTPU_IPV4_ICMP 335 207 #define ICE_MAC_IPV6_GTPU_IPV4_FRAG 336 208 #define ICE_MAC_IPV6_GTPU_IPV4_PAY 337 209 #define ICE_MAC_IPV6_GTPU_IPV4_UDP_PAY 338 210 #define ICE_MAC_IPV6_GTPU_IPV4_TCP 339 211 #define ICE_MAC_IPV6_GTPU_IPV4_ICMP 340 212 #define ICE_MAC_IPV4_GTPU_IPV6_FRAG 341 213 #define ICE_MAC_IPV4_GTPU_IPV6_PAY 342 214 #define ICE_MAC_IPV4_GTPU_IPV6_UDP_PAY 343 215 #define ICE_MAC_IPV4_GTPU_IPV6_TCP 344 216 #define ICE_MAC_IPV4_GTPU_IPV6_ICMPV6 345 217 #define ICE_MAC_IPV6_GTPU_IPV6_FRAG 346 218 #define ICE_MAC_IPV6_GTPU_IPV6_PAY 347 219 #define ICE_MAC_IPV6_GTPU_IPV6_UDP_PAY 348 220 #define ICE_MAC_IPV6_GTPU_IPV6_TCP 349 221 #define ICE_MAC_IPV6_GTPU_IPV6_ICMPV6 350 222 223 /* Attributes that can modify PTYPE definitions. 224 * 225 * These values will represent special attributes for PTYPEs, which will 226 * resolve into metadata packet flags definitions that can be used in the TCAM 227 * for identifying a PTYPE with specific characteristics. 228 */ 229 enum ice_ptype_attrib_type { 230 /* GTP PTYPEs */ 231 ICE_PTYPE_ATTR_GTP_PDU_EH, 232 ICE_PTYPE_ATTR_GTP_SESSION, 233 ICE_PTYPE_ATTR_GTP_DOWNLINK, 234 ICE_PTYPE_ATTR_GTP_UPLINK, 235 }; 236 237 struct ice_ptype_attrib_info { 238 u16 flags; 239 u16 mask; 240 }; 241 242 /* TCAM flag definitions */ 243 #define ICE_GTP_PDU BIT(14) 244 #define ICE_GTP_PDU_LINK BIT(13) 245 246 /* GTP attributes */ 247 #define ICE_GTP_PDU_FLAG_MASK (ICE_GTP_PDU) 248 #define ICE_GTP_PDU_EH ICE_GTP_PDU 249 250 #define ICE_GTP_FLAGS_MASK (ICE_GTP_PDU | ICE_GTP_PDU_LINK) 251 #define ICE_GTP_SESSION 0 252 #define ICE_GTP_DOWNLINK ICE_GTP_PDU 253 #define ICE_GTP_UPLINK (ICE_GTP_PDU | ICE_GTP_PDU_LINK) 254 255 struct ice_ptype_attributes { 256 u16 ptype; 257 enum ice_ptype_attrib_type attrib; 258 }; 259 260 /* package labels */ 261 struct ice_label { 262 __le16 value; 263 #define ICE_PKG_LABEL_SIZE 64 264 char name[ICE_PKG_LABEL_SIZE]; 265 }; 266 267 struct ice_label_section { 268 __le16 count; 269 struct ice_label label[]; 270 }; 271 272 #define ICE_MAX_LABELS_IN_BUF ICE_MAX_ENTRIES_IN_BUF( \ 273 struct_size((struct ice_label_section *)0, label, 1) - \ 274 sizeof(struct ice_label), sizeof(struct ice_label)) 275 276 struct ice_sw_fv_section { 277 __le16 count; 278 __le16 base_offset; 279 struct ice_fv fv[]; 280 }; 281 282 /* The BOOST TCAM stores the match packet header in reverse order, meaning 283 * the fields are reversed; in addition, this means that the normally big endian 284 * fields of the packet are now little endian. 285 */ 286 struct ice_boost_key_value { 287 #define ICE_BOOST_REMAINING_HV_KEY 15 288 u8 remaining_hv_key[ICE_BOOST_REMAINING_HV_KEY]; 289 __le16 hv_dst_port_key; 290 __le16 hv_src_port_key; 291 u8 tcam_search_key; 292 } __packed; 293 294 struct ice_boost_key { 295 struct ice_boost_key_value key; 296 struct ice_boost_key_value key2; 297 }; 298 299 /* package Boost TCAM entry */ 300 struct ice_boost_tcam_entry { 301 __le16 addr; 302 __le16 reserved; 303 /* break up the 40 bytes of key into different fields */ 304 struct ice_boost_key key; 305 u8 boost_hit_index_group; 306 /* The following contains bitfields which are not on byte boundaries. 307 * These fields are currently unused by driver software. 308 */ 309 #define ICE_BOOST_BIT_FIELDS 43 310 u8 bit_fields[ICE_BOOST_BIT_FIELDS]; 311 }; 312 313 struct ice_boost_tcam_section { 314 __le16 count; 315 __le16 reserved; 316 struct ice_boost_tcam_entry tcam[]; 317 }; 318 319 #define ICE_MAX_BST_TCAMS_IN_BUF ICE_MAX_ENTRIES_IN_BUF( \ 320 struct_size((struct ice_boost_tcam_section *)0, tcam, 1) - \ 321 sizeof(struct ice_boost_tcam_entry), \ 322 sizeof(struct ice_boost_tcam_entry)) 323 324 struct ice_xlt1_section { 325 __le16 count; 326 __le16 offset; 327 u8 value[]; 328 }; 329 330 struct ice_xlt2_section { 331 __le16 count; 332 __le16 offset; 333 __le16 value[]; 334 }; 335 336 struct ice_prof_redir_section { 337 __le16 count; 338 __le16 offset; 339 u8 redir_value[]; 340 }; 341 342 /* package buffer building */ 343 344 struct ice_buf_build { 345 struct ice_buf buf; 346 u16 reserved_section_table_entries; 347 }; 348 349 struct ice_pkg_enum { 350 struct ice_buf_table *buf_table; 351 u32 buf_idx; 352 353 u32 type; 354 struct ice_buf_hdr *buf; 355 u32 sect_idx; 356 void *sect; 357 u32 sect_type; 358 359 u32 entry_idx; 360 void *(*handler)(u32 sect_type, void *section, u32 index, u32 *offset); 361 }; 362 363 /* Tunnel enabling */ 364 365 enum ice_tunnel_type { 366 TNL_VXLAN = 0, 367 TNL_GENEVE, 368 __TNL_TYPE_CNT, 369 TNL_LAST = 0xFF, 370 TNL_ALL = 0xFF, 371 }; 372 373 struct ice_tunnel_type_scan { 374 enum ice_tunnel_type type; 375 const char *label_prefix; 376 }; 377 378 struct ice_tunnel_entry { 379 enum ice_tunnel_type type; 380 u16 boost_addr; 381 u16 port; 382 struct ice_boost_tcam_entry *boost_entry; 383 u8 valid; 384 }; 385 386 #define ICE_TUNNEL_MAX_ENTRIES 16 387 388 struct ice_tunnel_table { 389 struct ice_tunnel_entry tbl[ICE_TUNNEL_MAX_ENTRIES]; 390 u16 count; 391 u16 valid_count[__TNL_TYPE_CNT]; 392 }; 393 394 struct ice_pkg_es { 395 __le16 count; 396 __le16 offset; 397 struct ice_fv_word es[]; 398 }; 399 400 struct ice_es { 401 u32 sid; 402 u16 count; 403 u16 fvw; 404 u16 *ref_count; 405 u32 *mask_ena; 406 struct list_head prof_map; 407 struct ice_fv_word *t; 408 struct mutex prof_map_lock; /* protect access to profiles list */ 409 u8 *written; 410 u8 reverse; /* set to true to reverse FV order */ 411 }; 412 413 /* PTYPE Group management */ 414 415 /* Note: XLT1 table takes 13-bit as input, and results in an 8-bit packet type 416 * group (PTG) ID as output. 417 * 418 * Note: PTG 0 is the default packet type group and it is assumed that all PTYPE 419 * are a part of this group until moved to a new PTG. 420 */ 421 #define ICE_DEFAULT_PTG 0 422 423 struct ice_ptg_entry { 424 struct ice_ptg_ptype *first_ptype; 425 u8 in_use; 426 }; 427 428 struct ice_ptg_ptype { 429 struct ice_ptg_ptype *next_ptype; 430 u8 ptg; 431 }; 432 433 #define ICE_MAX_TCAM_PER_PROFILE 32 434 #define ICE_MAX_PTG_PER_PROFILE 32 435 436 struct ice_prof_map { 437 struct list_head list; 438 u64 profile_cookie; 439 u64 context; 440 u8 prof_id; 441 u8 ptg_cnt; 442 u8 ptg[ICE_MAX_PTG_PER_PROFILE]; 443 struct ice_ptype_attrib_info attr[ICE_MAX_PTG_PER_PROFILE]; 444 }; 445 446 #define ICE_INVALID_TCAM 0xFFFF 447 448 struct ice_tcam_inf { 449 u16 tcam_idx; 450 struct ice_ptype_attrib_info attr; 451 u8 ptg; 452 u8 prof_id; 453 u8 in_use; 454 }; 455 456 struct ice_vsig_prof { 457 struct list_head list; 458 u64 profile_cookie; 459 u8 prof_id; 460 u8 tcam_count; 461 struct ice_tcam_inf tcam[ICE_MAX_TCAM_PER_PROFILE]; 462 }; 463 464 struct ice_vsig_entry { 465 struct list_head prop_lst; 466 struct ice_vsig_vsi *first_vsi; 467 u8 in_use; 468 }; 469 470 struct ice_vsig_vsi { 471 struct ice_vsig_vsi *next_vsi; 472 u32 prop_mask; 473 u16 changed; 474 u16 vsig; 475 }; 476 477 #define ICE_XLT1_CNT 1024 478 #define ICE_MAX_PTGS 256 479 480 /* XLT1 Table */ 481 struct ice_xlt1 { 482 struct ice_ptg_entry *ptg_tbl; 483 struct ice_ptg_ptype *ptypes; 484 u8 *t; 485 u32 sid; 486 u16 count; 487 }; 488 489 #define ICE_XLT2_CNT 768 490 #define ICE_MAX_VSIGS 768 491 492 /* VSIG bit layout: 493 * [0:12]: incremental VSIG index 1 to ICE_MAX_VSIGS 494 * [13:15]: PF number of device 495 */ 496 #define ICE_VSIG_IDX_M (0x1FFF) 497 #define ICE_PF_NUM_S 13 498 #define ICE_PF_NUM_M (0x07 << ICE_PF_NUM_S) 499 #define ICE_VSIG_VALUE(vsig, pf_id) \ 500 ((u16)((((u16)(vsig)) & ICE_VSIG_IDX_M) | \ 501 (((u16)(pf_id) << ICE_PF_NUM_S) & ICE_PF_NUM_M))) 502 #define ICE_DEFAULT_VSIG 0 503 504 /* XLT2 Table */ 505 struct ice_xlt2 { 506 struct ice_vsig_entry *vsig_tbl; 507 struct ice_vsig_vsi *vsis; 508 u16 *t; 509 u32 sid; 510 u16 count; 511 }; 512 513 /* Profile ID Management */ 514 struct ice_prof_id_key { 515 __le16 flags; 516 u8 xlt1; 517 __le16 xlt2_cdid; 518 } __packed; 519 520 /* Keys are made up of two values, each one-half the size of the key. 521 * For TCAM, the entire key is 80 bits wide (or 2, 40-bit wide values) 522 */ 523 #define ICE_TCAM_KEY_VAL_SZ 5 524 #define ICE_TCAM_KEY_SZ (2 * ICE_TCAM_KEY_VAL_SZ) 525 526 struct ice_prof_tcam_entry { 527 __le16 addr; 528 u8 key[ICE_TCAM_KEY_SZ]; 529 u8 prof_id; 530 } __packed; 531 532 struct ice_prof_id_section { 533 __le16 count; 534 struct ice_prof_tcam_entry entry[]; 535 }; 536 537 struct ice_prof_tcam { 538 u32 sid; 539 u16 count; 540 u16 max_prof_id; 541 struct ice_prof_tcam_entry *t; 542 u8 cdid_bits; /* # CDID bits to use in key, 0, 2, 4, or 8 */ 543 }; 544 545 struct ice_prof_redir { 546 u8 *t; 547 u32 sid; 548 u16 count; 549 }; 550 551 struct ice_mask { 552 u16 mask; /* 16-bit mask */ 553 u16 idx; /* index */ 554 u16 ref; /* reference count */ 555 u8 in_use; /* non-zero if used */ 556 }; 557 558 struct ice_masks { 559 struct mutex lock; /* lock to protect this structure */ 560 u16 first; /* first mask owned by the PF */ 561 u16 count; /* number of masks owned by the PF */ 562 #define ICE_PROF_MASK_COUNT 32 563 struct ice_mask masks[ICE_PROF_MASK_COUNT]; 564 }; 565 566 /* Tables per block */ 567 struct ice_blk_info { 568 struct ice_xlt1 xlt1; 569 struct ice_xlt2 xlt2; 570 struct ice_prof_tcam prof; 571 struct ice_prof_redir prof_redir; 572 struct ice_es es; 573 struct ice_masks masks; 574 u8 overwrite; /* set to true to allow overwrite of table entries */ 575 u8 is_list_init; 576 }; 577 578 enum ice_chg_type { 579 ICE_TCAM_NONE = 0, 580 ICE_PTG_ES_ADD, 581 ICE_TCAM_ADD, 582 ICE_VSIG_ADD, 583 ICE_VSIG_REM, 584 ICE_VSI_MOVE, 585 }; 586 587 struct ice_chs_chg { 588 struct list_head list_entry; 589 enum ice_chg_type type; 590 591 u8 add_ptg; 592 u8 add_vsig; 593 u8 add_tcam_idx; 594 u8 add_prof; 595 u16 ptype; 596 u8 ptg; 597 u8 prof_id; 598 u16 vsi; 599 u16 vsig; 600 u16 orig_vsig; 601 u16 tcam_idx; 602 struct ice_ptype_attrib_info attr; 603 }; 604 605 #define ICE_FLOW_PTYPE_MAX ICE_XLT1_CNT 606 #endif /* _ICE_FLEX_TYPE_H_ */ 607