1/* SPDX-License-Identifier: BSD-3-Clause */ 2/* Copyright (c) 2020, Intel Corporation 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * 3. Neither the name of the Intel Corporation nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31/*$FreeBSD$*/ 32 33#ifndef _ICE_FLEX_TYPE_H_ 34#define _ICE_FLEX_TYPE_H_ 35 36#define ICE_FV_OFFSET_INVAL 0x1FF 37 38#pragma pack(1) 39/* Extraction Sequence (Field Vector) Table */ 40struct ice_fv_word { 41 u8 prot_id; 42 u16 off; /* Offset within the protocol header */ 43 u8 resvrd; 44}; 45#pragma pack() 46 47#define ICE_MAX_NUM_PROFILES 256 48 49#define ICE_MAX_FV_WORDS 48 50struct ice_fv { 51 struct ice_fv_word ew[ICE_MAX_FV_WORDS]; 52}; 53 54/* Package and segment headers and tables */ 55struct ice_pkg_hdr { 56 struct ice_pkg_ver pkg_format_ver; 57 __le32 seg_count; 58 __le32 seg_offset[STRUCT_HACK_VAR_LEN]; 59}; 60 61/* generic segment */ 62struct ice_generic_seg_hdr { 63#define SEGMENT_TYPE_METADATA 0x00000001 64#define SEGMENT_TYPE_ICE 0x00000010 65 __le32 seg_type; 66 struct ice_pkg_ver seg_format_ver; 67 __le32 seg_size; 68 char seg_id[ICE_PKG_NAME_SIZE]; 69}; 70 71/* ice specific segment */ 72 73union ice_device_id { 74 struct { 75 __le16 device_id; 76 __le16 vendor_id; 77 } dev_vend_id; 78 __le32 id; 79}; 80 81struct ice_device_id_entry { 82 union ice_device_id device; 83 union ice_device_id sub_device; 84}; 85 86struct ice_seg { 87 struct ice_generic_seg_hdr hdr; 88 __le32 device_table_count; 89 struct ice_device_id_entry device_table[STRUCT_HACK_VAR_LEN]; 90}; 91 92struct ice_nvm_table { 93 __le32 table_count; 94 __le32 vers[STRUCT_HACK_VAR_LEN]; 95}; 96 97struct ice_buf { 98#define ICE_PKG_BUF_SIZE 4096 99 u8 buf[ICE_PKG_BUF_SIZE]; 100}; 101 102struct ice_buf_table { 103 __le32 buf_count; 104 struct ice_buf buf_array[STRUCT_HACK_VAR_LEN]; 105}; 106 107/* global metadata specific segment */ 108struct ice_global_metadata_seg { 109 struct ice_generic_seg_hdr hdr; 110 struct ice_pkg_ver pkg_ver; 111 __le32 rsvd; 112 char pkg_name[ICE_PKG_NAME_SIZE]; 113}; 114 115#define ICE_MIN_S_OFF 12 116#define ICE_MAX_S_OFF 4095 117#define ICE_MIN_S_SZ 1 118#define ICE_MAX_S_SZ 4084 119 120/* section information */ 121struct ice_section_entry { 122 __le32 type; 123 __le16 offset; 124 __le16 size; 125}; 126 127#define ICE_MIN_S_COUNT 1 128#define ICE_MAX_S_COUNT 511 129#define ICE_MIN_S_DATA_END 12 130#define ICE_MAX_S_DATA_END 4096 131 132#define ICE_METADATA_BUF 0x80000000 133 134struct ice_buf_hdr { 135 __le16 section_count; 136 __le16 data_end; 137 struct ice_section_entry section_entry[STRUCT_HACK_VAR_LEN]; 138}; 139 140#define ICE_MAX_ENTRIES_IN_BUF(hd_sz, ent_sz) ((ICE_PKG_BUF_SIZE - \ 141 ice_struct_size((struct ice_buf_hdr *)0, section_entry, 1) - (hd_sz)) /\ 142 (ent_sz)) 143 144/* ice package section IDs */ 145#define ICE_SID_XLT0_SW 10 146#define ICE_SID_XLT_KEY_BUILDER_SW 11 147#define ICE_SID_XLT1_SW 12 148#define ICE_SID_XLT2_SW 13 149#define ICE_SID_PROFID_TCAM_SW 14 150#define ICE_SID_PROFID_REDIR_SW 15 151#define ICE_SID_FLD_VEC_SW 16 152#define ICE_SID_CDID_KEY_BUILDER_SW 17 153#define ICE_SID_CDID_REDIR_SW 18 154 155#define ICE_SID_XLT0_ACL 20 156#define ICE_SID_XLT_KEY_BUILDER_ACL 21 157#define ICE_SID_XLT1_ACL 22 158#define ICE_SID_XLT2_ACL 23 159#define ICE_SID_PROFID_TCAM_ACL 24 160#define ICE_SID_PROFID_REDIR_ACL 25 161#define ICE_SID_FLD_VEC_ACL 26 162#define ICE_SID_CDID_KEY_BUILDER_ACL 27 163#define ICE_SID_CDID_REDIR_ACL 28 164 165#define ICE_SID_XLT0_FD 30 166#define ICE_SID_XLT_KEY_BUILDER_FD 31 167#define ICE_SID_XLT1_FD 32 168#define ICE_SID_XLT2_FD 33 169#define ICE_SID_PROFID_TCAM_FD 34 170#define ICE_SID_PROFID_REDIR_FD 35 171#define ICE_SID_FLD_VEC_FD 36 172#define ICE_SID_CDID_KEY_BUILDER_FD 37 173#define ICE_SID_CDID_REDIR_FD 38 174 175#define ICE_SID_XLT0_RSS 40 176#define ICE_SID_XLT_KEY_BUILDER_RSS 41 177#define ICE_SID_XLT1_RSS 42 178#define ICE_SID_XLT2_RSS 43 179#define ICE_SID_PROFID_TCAM_RSS 44 180#define ICE_SID_PROFID_REDIR_RSS 45 181#define ICE_SID_FLD_VEC_RSS 46 182#define ICE_SID_CDID_KEY_BUILDER_RSS 47 183#define ICE_SID_CDID_REDIR_RSS 48 184 185#define ICE_SID_RXPARSER_CAM 50 186#define ICE_SID_RXPARSER_NOMATCH_CAM 51 187#define ICE_SID_RXPARSER_IMEM 52 188#define ICE_SID_RXPARSER_XLT0_BUILDER 53 189#define ICE_SID_RXPARSER_NODE_PTYPE 54 190#define ICE_SID_RXPARSER_MARKER_PTYPE 55 191#define ICE_SID_RXPARSER_BOOST_TCAM 56 192#define ICE_SID_RXPARSER_PROTO_GRP 57 193#define ICE_SID_RXPARSER_METADATA_INIT 58 194#define ICE_SID_RXPARSER_XLT0 59 195 196#define ICE_SID_TXPARSER_CAM 60 197#define ICE_SID_TXPARSER_NOMATCH_CAM 61 198#define ICE_SID_TXPARSER_IMEM 62 199#define ICE_SID_TXPARSER_XLT0_BUILDER 63 200#define ICE_SID_TXPARSER_NODE_PTYPE 64 201#define ICE_SID_TXPARSER_MARKER_PTYPE 65 202#define ICE_SID_TXPARSER_BOOST_TCAM 66 203#define ICE_SID_TXPARSER_PROTO_GRP 67 204#define ICE_SID_TXPARSER_METADATA_INIT 68 205#define ICE_SID_TXPARSER_XLT0 69 206 207#define ICE_SID_RXPARSER_INIT_REDIR 70 208#define ICE_SID_TXPARSER_INIT_REDIR 71 209#define ICE_SID_RXPARSER_MARKER_GRP 72 210#define ICE_SID_TXPARSER_MARKER_GRP 73 211#define ICE_SID_RXPARSER_LAST_PROTO 74 212#define ICE_SID_TXPARSER_LAST_PROTO 75 213#define ICE_SID_RXPARSER_PG_SPILL 76 214#define ICE_SID_TXPARSER_PG_SPILL 77 215#define ICE_SID_RXPARSER_NOMATCH_SPILL 78 216#define ICE_SID_TXPARSER_NOMATCH_SPILL 79 217 218#define ICE_SID_XLT0_PE 80 219#define ICE_SID_XLT_KEY_BUILDER_PE 81 220#define ICE_SID_XLT1_PE 82 221#define ICE_SID_XLT2_PE 83 222#define ICE_SID_PROFID_TCAM_PE 84 223#define ICE_SID_PROFID_REDIR_PE 85 224#define ICE_SID_FLD_VEC_PE 86 225#define ICE_SID_CDID_KEY_BUILDER_PE 87 226#define ICE_SID_CDID_REDIR_PE 88 227 228/* Label Metadata section IDs */ 229#define ICE_SID_LBL_FIRST 0x80000010 230#define ICE_SID_LBL_RXPARSER_IMEM 0x80000010 231#define ICE_SID_LBL_TXPARSER_IMEM 0x80000011 232#define ICE_SID_LBL_RESERVED_12 0x80000012 233#define ICE_SID_LBL_RESERVED_13 0x80000013 234#define ICE_SID_LBL_RXPARSER_MARKER 0x80000014 235#define ICE_SID_LBL_TXPARSER_MARKER 0x80000015 236#define ICE_SID_LBL_PTYPE 0x80000016 237#define ICE_SID_LBL_PROTOCOL_ID 0x80000017 238#define ICE_SID_LBL_RXPARSER_TMEM 0x80000018 239#define ICE_SID_LBL_TXPARSER_TMEM 0x80000019 240#define ICE_SID_LBL_RXPARSER_PG 0x8000001A 241#define ICE_SID_LBL_TXPARSER_PG 0x8000001B 242#define ICE_SID_LBL_RXPARSER_M_TCAM 0x8000001C 243#define ICE_SID_LBL_TXPARSER_M_TCAM 0x8000001D 244#define ICE_SID_LBL_SW_PROFID_TCAM 0x8000001E 245#define ICE_SID_LBL_ACL_PROFID_TCAM 0x8000001F 246#define ICE_SID_LBL_PE_PROFID_TCAM 0x80000020 247#define ICE_SID_LBL_RSS_PROFID_TCAM 0x80000021 248#define ICE_SID_LBL_FD_PROFID_TCAM 0x80000022 249#define ICE_SID_LBL_FLAG 0x80000023 250#define ICE_SID_LBL_REG 0x80000024 251#define ICE_SID_LBL_SW_PTG 0x80000025 252#define ICE_SID_LBL_ACL_PTG 0x80000026 253#define ICE_SID_LBL_PE_PTG 0x80000027 254#define ICE_SID_LBL_RSS_PTG 0x80000028 255#define ICE_SID_LBL_FD_PTG 0x80000029 256#define ICE_SID_LBL_SW_VSIG 0x8000002A 257#define ICE_SID_LBL_ACL_VSIG 0x8000002B 258#define ICE_SID_LBL_PE_VSIG 0x8000002C 259#define ICE_SID_LBL_RSS_VSIG 0x8000002D 260#define ICE_SID_LBL_FD_VSIG 0x8000002E 261#define ICE_SID_LBL_PTYPE_META 0x8000002F 262#define ICE_SID_LBL_SW_PROFID 0x80000030 263#define ICE_SID_LBL_ACL_PROFID 0x80000031 264#define ICE_SID_LBL_PE_PROFID 0x80000032 265#define ICE_SID_LBL_RSS_PROFID 0x80000033 266#define ICE_SID_LBL_FD_PROFID 0x80000034 267#define ICE_SID_LBL_RXPARSER_MARKER_GRP 0x80000035 268#define ICE_SID_LBL_TXPARSER_MARKER_GRP 0x80000036 269#define ICE_SID_LBL_RXPARSER_PROTO 0x80000037 270#define ICE_SID_LBL_TXPARSER_PROTO 0x80000038 271/* The following define MUST be updated to reflect the last label section ID */ 272#define ICE_SID_LBL_LAST 0x80000038 273 274enum ice_block { 275 ICE_BLK_SW = 0, 276 ICE_BLK_ACL, 277 ICE_BLK_FD, 278 ICE_BLK_RSS, 279 ICE_BLK_PE, 280 ICE_BLK_COUNT 281}; 282 283enum ice_sect { 284 ICE_XLT0 = 0, 285 ICE_XLT_KB, 286 ICE_XLT1, 287 ICE_XLT2, 288 ICE_PROF_TCAM, 289 ICE_PROF_REDIR, 290 ICE_VEC_TBL, 291 ICE_CDID_KB, 292 ICE_CDID_REDIR, 293 ICE_SECT_COUNT 294}; 295 296/* Packet Type (PTYPE) values */ 297#define ICE_PTYPE_MAC_PAY 1 298#define ICE_PTYPE_IPV4FRAG_PAY 22 299#define ICE_PTYPE_IPV4_PAY 23 300#define ICE_PTYPE_IPV4_UDP_PAY 24 301#define ICE_PTYPE_IPV4_TCP_PAY 26 302#define ICE_PTYPE_IPV4_SCTP_PAY 27 303#define ICE_PTYPE_IPV4_ICMP_PAY 28 304#define ICE_PTYPE_IPV6FRAG_PAY 88 305#define ICE_PTYPE_IPV6_PAY 89 306#define ICE_PTYPE_IPV6_UDP_PAY 90 307#define ICE_PTYPE_IPV6_TCP_PAY 92 308#define ICE_PTYPE_IPV6_SCTP_PAY 93 309#define ICE_PTYPE_IPV6_ICMP_PAY 94 310 311/* Packet Type Groups (PTG) - Inner Most fields (IM) */ 312#define ICE_PTG_IM_IPV4_TCP 16 313#define ICE_PTG_IM_IPV4_UDP 17 314#define ICE_PTG_IM_IPV4_SCTP 18 315#define ICE_PTG_IM_IPV4_PAY 20 316#define ICE_PTG_IM_IPV4_OTHER 21 317#define ICE_PTG_IM_IPV6_TCP 32 318#define ICE_PTG_IM_IPV6_UDP 33 319#define ICE_PTG_IM_IPV6_SCTP 34 320#define ICE_PTG_IM_IPV6_OTHER 37 321#define ICE_PTG_IM_L2_OTHER 67 322 323struct ice_flex_fields { 324 union { 325 struct { 326 u8 src_ip; 327 u8 dst_ip; 328 u8 flow_label; /* valid for IPv6 only */ 329 } ip_fields; 330 331 struct { 332 u8 src_prt; 333 u8 dst_prt; 334 } tcp_udp_fields; 335 336 struct { 337 u8 src_ip; 338 u8 dst_ip; 339 u8 src_prt; 340 u8 dst_prt; 341 } ip_tcp_udp_fields; 342 343 struct { 344 u8 src_prt; 345 u8 dst_prt; 346 u8 flow_label; /* valid for IPv6 only */ 347 u8 spi; 348 } ip_esp_fields; 349 350 struct { 351 u32 offset; 352 u32 length; 353 } off_len; 354 } fields; 355}; 356 357#define ICE_XLT1_DFLT_GRP 0 358#define ICE_XLT1_TABLE_SIZE 1024 359 360/* package labels */ 361struct ice_label { 362 __le16 value; 363#define ICE_PKG_LABEL_SIZE 64 364 char name[ICE_PKG_LABEL_SIZE]; 365}; 366 367struct ice_label_section { 368 __le16 count; 369 struct ice_label label[STRUCT_HACK_VAR_LEN]; 370}; 371 372#define ICE_MAX_LABELS_IN_BUF ICE_MAX_ENTRIES_IN_BUF( \ 373 ice_struct_size((struct ice_label_section *)0, label, 1) - \ 374 sizeof(struct ice_label), sizeof(struct ice_label)) 375 376struct ice_sw_fv_section { 377 __le16 count; 378 __le16 base_offset; 379 struct ice_fv fv[STRUCT_HACK_VAR_LEN]; 380}; 381 382struct ice_sw_fv_list_entry { 383 struct LIST_ENTRY_TYPE list_entry; 384 u32 profile_id; 385 struct ice_fv *fv_ptr; 386}; 387 388#pragma pack(1) 389/* The BOOST TCAM stores the match packet header in reverse order, meaning 390 * the fields are reversed; in addition, this means that the normally big endian 391 * fields of the packet are now little endian. 392 */ 393struct ice_boost_key_value { 394#define ICE_BOOST_REMAINING_HV_KEY 15 395 u8 remaining_hv_key[ICE_BOOST_REMAINING_HV_KEY]; 396 __le16 hv_dst_port_key; 397 __le16 hv_src_port_key; 398 u8 tcam_search_key; 399}; 400#pragma pack() 401 402struct ice_boost_key { 403 struct ice_boost_key_value key; 404 struct ice_boost_key_value key2; 405}; 406 407/* package Boost TCAM entry */ 408struct ice_boost_tcam_entry { 409 __le16 addr; 410 __le16 reserved; 411 /* break up the 40 bytes of key into different fields */ 412 struct ice_boost_key key; 413 u8 boost_hit_index_group; 414 /* The following contains bitfields which are not on byte boundaries. 415 * These fields are currently unused by driver software. 416 */ 417#define ICE_BOOST_BIT_FIELDS 43 418 u8 bit_fields[ICE_BOOST_BIT_FIELDS]; 419}; 420 421struct ice_boost_tcam_section { 422 __le16 count; 423 __le16 reserved; 424 struct ice_boost_tcam_entry tcam[STRUCT_HACK_VAR_LEN]; 425}; 426 427#define ICE_MAX_BST_TCAMS_IN_BUF ICE_MAX_ENTRIES_IN_BUF( \ 428 ice_struct_size((struct ice_boost_tcam_section *)0, tcam, 1) - \ 429 sizeof(struct ice_boost_tcam_entry), \ 430 sizeof(struct ice_boost_tcam_entry)) 431 432struct ice_xlt1_section { 433 __le16 count; 434 __le16 offset; 435 u8 value[STRUCT_HACK_VAR_LEN]; 436}; 437 438struct ice_xlt2_section { 439 __le16 count; 440 __le16 offset; 441 __le16 value[STRUCT_HACK_VAR_LEN]; 442}; 443 444struct ice_prof_redir_section { 445 __le16 count; 446 __le16 offset; 447 u8 redir_value[STRUCT_HACK_VAR_LEN]; 448}; 449 450/* package buffer building */ 451 452struct ice_buf_build { 453 struct ice_buf buf; 454 u16 reserved_section_table_entries; 455}; 456 457struct ice_pkg_enum { 458 struct ice_buf_table *buf_table; 459 u32 buf_idx; 460 461 u32 type; 462 struct ice_buf_hdr *buf; 463 u32 sect_idx; 464 void *sect; 465 u32 sect_type; 466 467 u32 entry_idx; 468 void *(*handler)(u32 sect_type, void *section, u32 index, u32 *offset); 469}; 470 471/* Tunnel enabling */ 472 473enum ice_tunnel_type { 474 TNL_VXLAN = 0, 475 TNL_GENEVE, 476 TNL_LAST = 0xFF, 477 TNL_ALL = 0xFF, 478}; 479 480struct ice_tunnel_type_scan { 481 enum ice_tunnel_type type; 482 const char *label_prefix; 483}; 484 485struct ice_tunnel_entry { 486 enum ice_tunnel_type type; 487 u16 boost_addr; 488 u16 port; 489 u16 ref; 490 struct ice_boost_tcam_entry *boost_entry; 491 u8 valid; 492 u8 in_use; 493 u8 marked; 494}; 495 496#define ICE_TUNNEL_MAX_ENTRIES 16 497 498struct ice_tunnel_table { 499 struct ice_tunnel_entry tbl[ICE_TUNNEL_MAX_ENTRIES]; 500 u16 count; 501}; 502 503struct ice_pkg_es { 504 __le16 count; 505 __le16 offset; 506 struct ice_fv_word es[STRUCT_HACK_VAR_LEN]; 507}; 508 509struct ice_es { 510 u32 sid; 511 u16 count; 512 u16 fvw; 513 u16 *ref_count; 514 struct LIST_HEAD_TYPE prof_map; 515 struct ice_fv_word *t; 516 struct ice_lock prof_map_lock; /* protect access to profiles list */ 517 u8 *written; 518 u8 reverse; /* set to true to reverse FV order */ 519}; 520 521/* PTYPE Group management */ 522 523/* Note: XLT1 table takes 13-bit as input, and results in an 8-bit packet type 524 * group (PTG) ID as output. 525 * 526 * Note: PTG 0 is the default packet type group and it is assumed that all PTYPE 527 * are a part of this group until moved to a new PTG. 528 */ 529#define ICE_DEFAULT_PTG 0 530 531struct ice_ptg_entry { 532 struct ice_ptg_ptype *first_ptype; 533 u8 in_use; 534}; 535 536struct ice_ptg_ptype { 537 struct ice_ptg_ptype *next_ptype; 538 u8 ptg; 539}; 540 541#define ICE_MAX_TCAM_PER_PROFILE 32 542#define ICE_MAX_PTG_PER_PROFILE 32 543 544struct ice_prof_map { 545 struct LIST_ENTRY_TYPE list; 546 u64 profile_cookie; 547 u64 context; 548 u8 prof_id; 549 u8 ptg_cnt; 550 u8 ptg[ICE_MAX_PTG_PER_PROFILE]; 551}; 552 553#define ICE_INVALID_TCAM 0xFFFF 554 555struct ice_tcam_inf { 556 u16 tcam_idx; 557 u8 ptg; 558 u8 prof_id; 559 u8 in_use; 560}; 561 562struct ice_vsig_prof { 563 struct LIST_ENTRY_TYPE list; 564 u64 profile_cookie; 565 u8 prof_id; 566 u8 tcam_count; 567 struct ice_tcam_inf tcam[ICE_MAX_TCAM_PER_PROFILE]; 568}; 569 570struct ice_vsig_entry { 571 struct LIST_HEAD_TYPE prop_lst; 572 struct ice_vsig_vsi *first_vsi; 573 u8 in_use; 574}; 575 576struct ice_vsig_vsi { 577 struct ice_vsig_vsi *next_vsi; 578 u32 prop_mask; 579 u16 changed; 580 u16 vsig; 581}; 582 583#define ICE_XLT1_CNT 1024 584#define ICE_MAX_PTGS 256 585 586/* XLT1 Table */ 587struct ice_xlt1 { 588 struct ice_ptg_entry *ptg_tbl; 589 struct ice_ptg_ptype *ptypes; 590 u8 *t; 591 u32 sid; 592 u16 count; 593}; 594 595#define ICE_XLT2_CNT 768 596#define ICE_MAX_VSIGS 768 597 598/* VSIG bit layout: 599 * [0:12]: incremental VSIG index 1 to ICE_MAX_VSIGS 600 * [13:15]: PF number of device 601 */ 602#define ICE_VSIG_IDX_M (0x1FFF) 603#define ICE_PF_NUM_S 13 604#define ICE_PF_NUM_M (0x07 << ICE_PF_NUM_S) 605#define ICE_VSIG_VALUE(vsig, pf_id) \ 606 (u16)((((u16)(vsig)) & ICE_VSIG_IDX_M) | \ 607 (((u16)(pf_id) << ICE_PF_NUM_S) & ICE_PF_NUM_M)) 608#define ICE_DEFAULT_VSIG 0 609 610/* XLT2 Table */ 611struct ice_xlt2 { 612 struct ice_vsig_entry *vsig_tbl; 613 struct ice_vsig_vsi *vsis; 614 u16 *t; 615 u32 sid; 616 u16 count; 617}; 618 619/* Extraction sequence - list of match fields: 620 * protocol ID, offset, profile length 621 */ 622union ice_match_fld { 623 struct { 624 u8 prot_id; 625 u8 offset; 626 u8 length; 627 u8 reserved; /* must be zero */ 628 } fld; 629 u32 val; 630}; 631 632#define ICE_MATCH_LIST_SZ 20 633#pragma pack(1) 634struct ice_match { 635 u8 count; 636 union ice_match_fld list[ICE_MATCH_LIST_SZ]; 637}; 638 639/* Profile ID Management */ 640struct ice_prof_id_key { 641 __le16 flags; 642 u8 xlt1; 643 __le16 xlt2_cdid; 644}; 645 646/* Keys are made up of two values, each one-half the size of the key. 647 * For TCAM, the entire key is 80 bits wide (or 2, 40-bit wide values) 648 */ 649#define ICE_TCAM_KEY_VAL_SZ 5 650#define ICE_TCAM_KEY_SZ (2 * ICE_TCAM_KEY_VAL_SZ) 651 652struct ice_prof_tcam_entry { 653 __le16 addr; 654 u8 key[ICE_TCAM_KEY_SZ]; 655 u8 prof_id; 656}; 657#pragma pack() 658 659struct ice_prof_id_section { 660 __le16 count; 661 struct ice_prof_tcam_entry entry[STRUCT_HACK_VAR_LEN]; 662}; 663 664struct ice_prof_tcam { 665 u32 sid; 666 u16 count; 667 u16 max_prof_id; 668 struct ice_prof_tcam_entry *t; 669 u8 cdid_bits; /* # CDID bits to use in key, 0, 2, 4, or 8 */ 670}; 671 672struct ice_prof_redir { 673 u8 *t; 674 u32 sid; 675 u16 count; 676}; 677 678/* Tables per block */ 679struct ice_blk_info { 680 struct ice_xlt1 xlt1; 681 struct ice_xlt2 xlt2; 682 struct ice_prof_tcam prof; 683 struct ice_prof_redir prof_redir; 684 struct ice_es es; 685 u8 overwrite; /* set to true to allow overwrite of table entries */ 686 u8 is_list_init; 687}; 688 689enum ice_chg_type { 690 ICE_TCAM_NONE = 0, 691 ICE_PTG_ES_ADD, 692 ICE_TCAM_ADD, 693 ICE_VSIG_ADD, 694 ICE_VSIG_REM, 695 ICE_VSI_MOVE, 696}; 697 698struct ice_chs_chg { 699 struct LIST_ENTRY_TYPE list_entry; 700 enum ice_chg_type type; 701 702 u8 add_ptg; 703 u8 add_vsig; 704 u8 add_tcam_idx; 705 u8 add_prof; 706 u16 ptype; 707 u8 ptg; 708 u8 prof_id; 709 u16 vsi; 710 u16 vsig; 711 u16 orig_vsig; 712 u16 tcam_idx; 713}; 714 715#define ICE_FLOW_PTYPE_MAX ICE_XLT1_CNT 716 717enum ice_prof_type { 718 ICE_PROF_NON_TUN = 0x1, 719 ICE_PROF_TUN_UDP = 0x2, 720 ICE_PROF_TUN_GRE = 0x4, 721 ICE_PROF_TUN_ALL = 0x6, 722 ICE_PROF_ALL = 0xFF, 723}; 724#endif /* _ICE_FLEX_TYPE_H_ */ 725