171d10453SEric Joyner /* SPDX-License-Identifier: BSD-3-Clause */ 2015f8cc5SEric Joyner /* Copyright (c) 2024, Intel Corporation 371d10453SEric Joyner * All rights reserved. 471d10453SEric Joyner * 571d10453SEric Joyner * Redistribution and use in source and binary forms, with or without 671d10453SEric Joyner * modification, are permitted provided that the following conditions are met: 771d10453SEric Joyner * 871d10453SEric Joyner * 1. Redistributions of source code must retain the above copyright notice, 971d10453SEric Joyner * this list of conditions and the following disclaimer. 1071d10453SEric Joyner * 1171d10453SEric Joyner * 2. Redistributions in binary form must reproduce the above copyright 1271d10453SEric Joyner * notice, this list of conditions and the following disclaimer in the 1371d10453SEric Joyner * documentation and/or other materials provided with the distribution. 1471d10453SEric Joyner * 1571d10453SEric Joyner * 3. Neither the name of the Intel Corporation nor the names of its 1671d10453SEric Joyner * contributors may be used to endorse or promote products derived from 1771d10453SEric Joyner * this software without specific prior written permission. 1871d10453SEric Joyner * 1971d10453SEric Joyner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2071d10453SEric Joyner * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2171d10453SEric Joyner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2271d10453SEric Joyner * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 2371d10453SEric Joyner * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2471d10453SEric Joyner * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2571d10453SEric Joyner * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2671d10453SEric Joyner * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2771d10453SEric Joyner * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2871d10453SEric Joyner * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2971d10453SEric Joyner * POSSIBILITY OF SUCH DAMAGE. 3071d10453SEric Joyner */ 3171d10453SEric Joyner 3271d10453SEric Joyner #ifndef _ICE_FLEX_TYPE_H_ 3371d10453SEric Joyner #define _ICE_FLEX_TYPE_H_ 3471d10453SEric Joyner 3571d10453SEric Joyner #define ICE_FV_OFFSET_INVAL 0x1FF 3671d10453SEric Joyner 3771d10453SEric Joyner #pragma pack(1) 3871d10453SEric Joyner /* Extraction Sequence (Field Vector) Table */ 3971d10453SEric Joyner struct ice_fv_word { 4071d10453SEric Joyner u8 prot_id; 4171d10453SEric Joyner u16 off; /* Offset within the protocol header */ 4271d10453SEric Joyner u8 resvrd; 4371d10453SEric Joyner }; 448923de59SPiotr Kubaj 4571d10453SEric Joyner #pragma pack() 4671d10453SEric Joyner 4771d10453SEric Joyner #define ICE_MAX_NUM_PROFILES 256 4871d10453SEric Joyner 4971d10453SEric Joyner #define ICE_MAX_FV_WORDS 48 5071d10453SEric Joyner struct ice_fv { 5171d10453SEric Joyner struct ice_fv_word ew[ICE_MAX_FV_WORDS]; 5271d10453SEric Joyner }; 5371d10453SEric Joyner 5471d10453SEric Joyner /* Packet Type (PTYPE) values */ 5571d10453SEric Joyner #define ICE_PTYPE_MAC_PAY 1 5671d10453SEric Joyner #define ICE_PTYPE_IPV4FRAG_PAY 22 5771d10453SEric Joyner #define ICE_PTYPE_IPV4_PAY 23 5871d10453SEric Joyner #define ICE_PTYPE_IPV4_UDP_PAY 24 5971d10453SEric Joyner #define ICE_PTYPE_IPV4_TCP_PAY 26 6071d10453SEric Joyner #define ICE_PTYPE_IPV4_SCTP_PAY 27 6171d10453SEric Joyner #define ICE_PTYPE_IPV4_ICMP_PAY 28 6271d10453SEric Joyner #define ICE_PTYPE_IPV6FRAG_PAY 88 6371d10453SEric Joyner #define ICE_PTYPE_IPV6_PAY 89 6471d10453SEric Joyner #define ICE_PTYPE_IPV6_UDP_PAY 90 6571d10453SEric Joyner #define ICE_PTYPE_IPV6_TCP_PAY 92 6671d10453SEric Joyner #define ICE_PTYPE_IPV6_SCTP_PAY 93 6771d10453SEric Joyner #define ICE_PTYPE_IPV6_ICMP_PAY 94 6871d10453SEric Joyner 69d08b8680SEric Joyner struct ice_meta_sect { 70d08b8680SEric Joyner struct ice_pkg_ver ver; 71d08b8680SEric Joyner #define ICE_META_SECT_NAME_SIZE 28 72d08b8680SEric Joyner char name[ICE_META_SECT_NAME_SIZE]; 73d08b8680SEric Joyner __le32 track_id; 74d08b8680SEric Joyner }; 75d08b8680SEric Joyner 7671d10453SEric Joyner /* Packet Type Groups (PTG) - Inner Most fields (IM) */ 7771d10453SEric Joyner #define ICE_PTG_IM_IPV4_TCP 16 7871d10453SEric Joyner #define ICE_PTG_IM_IPV4_UDP 17 7971d10453SEric Joyner #define ICE_PTG_IM_IPV4_SCTP 18 8071d10453SEric Joyner #define ICE_PTG_IM_IPV4_PAY 20 8171d10453SEric Joyner #define ICE_PTG_IM_IPV4_OTHER 21 8271d10453SEric Joyner #define ICE_PTG_IM_IPV6_TCP 32 8371d10453SEric Joyner #define ICE_PTG_IM_IPV6_UDP 33 8471d10453SEric Joyner #define ICE_PTG_IM_IPV6_SCTP 34 8571d10453SEric Joyner #define ICE_PTG_IM_IPV6_OTHER 37 8671d10453SEric Joyner #define ICE_PTG_IM_L2_OTHER 67 8771d10453SEric Joyner 8871d10453SEric Joyner struct ice_flex_fields { 8971d10453SEric Joyner union { 9071d10453SEric Joyner struct { 9171d10453SEric Joyner u8 src_ip; 9271d10453SEric Joyner u8 dst_ip; 9371d10453SEric Joyner u8 flow_label; /* valid for IPv6 only */ 9471d10453SEric Joyner } ip_fields; 9571d10453SEric Joyner 9671d10453SEric Joyner struct { 9771d10453SEric Joyner u8 src_prt; 9871d10453SEric Joyner u8 dst_prt; 9971d10453SEric Joyner } tcp_udp_fields; 10071d10453SEric Joyner 10171d10453SEric Joyner struct { 10271d10453SEric Joyner u8 src_ip; 10371d10453SEric Joyner u8 dst_ip; 10471d10453SEric Joyner u8 src_prt; 10571d10453SEric Joyner u8 dst_prt; 10671d10453SEric Joyner } ip_tcp_udp_fields; 10771d10453SEric Joyner 10871d10453SEric Joyner struct { 10971d10453SEric Joyner u8 src_prt; 11071d10453SEric Joyner u8 dst_prt; 11171d10453SEric Joyner u8 flow_label; /* valid for IPv6 only */ 11271d10453SEric Joyner u8 spi; 11371d10453SEric Joyner } ip_esp_fields; 11471d10453SEric Joyner 11571d10453SEric Joyner struct { 11671d10453SEric Joyner u32 offset; 11771d10453SEric Joyner u32 length; 11871d10453SEric Joyner } off_len; 11971d10453SEric Joyner } fields; 12071d10453SEric Joyner }; 12171d10453SEric Joyner 12271d10453SEric Joyner #define ICE_XLT1_DFLT_GRP 0 12371d10453SEric Joyner #define ICE_XLT1_TABLE_SIZE 1024 12471d10453SEric Joyner 12571d10453SEric Joyner /* package labels */ 12671d10453SEric Joyner struct ice_label { 12771d10453SEric Joyner __le16 value; 12871d10453SEric Joyner #define ICE_PKG_LABEL_SIZE 64 12971d10453SEric Joyner char name[ICE_PKG_LABEL_SIZE]; 13071d10453SEric Joyner }; 13171d10453SEric Joyner 13271d10453SEric Joyner struct ice_label_section { 13371d10453SEric Joyner __le16 count; 1347d7af7f8SEric Joyner struct ice_label label[STRUCT_HACK_VAR_LEN]; 13571d10453SEric Joyner }; 13671d10453SEric Joyner 13771d10453SEric Joyner #define ICE_MAX_LABELS_IN_BUF ICE_MAX_ENTRIES_IN_BUF( \ 1387d7af7f8SEric Joyner ice_struct_size((struct ice_label_section *)0, label, 1) - \ 1397d7af7f8SEric Joyner sizeof(struct ice_label), sizeof(struct ice_label)) 14071d10453SEric Joyner 14171d10453SEric Joyner struct ice_sw_fv_section { 14271d10453SEric Joyner __le16 count; 14371d10453SEric Joyner __le16 base_offset; 1447d7af7f8SEric Joyner struct ice_fv fv[STRUCT_HACK_VAR_LEN]; 14571d10453SEric Joyner }; 14671d10453SEric Joyner 14771d10453SEric Joyner struct ice_sw_fv_list_entry { 14871d10453SEric Joyner struct LIST_ENTRY_TYPE list_entry; 14971d10453SEric Joyner u32 profile_id; 15071d10453SEric Joyner struct ice_fv *fv_ptr; 15171d10453SEric Joyner }; 15271d10453SEric Joyner 15371d10453SEric Joyner #pragma pack(1) 15471d10453SEric Joyner /* The BOOST TCAM stores the match packet header in reverse order, meaning 15571d10453SEric Joyner * the fields are reversed; in addition, this means that the normally big endian 15671d10453SEric Joyner * fields of the packet are now little endian. 15771d10453SEric Joyner */ 15871d10453SEric Joyner struct ice_boost_key_value { 15971d10453SEric Joyner #define ICE_BOOST_REMAINING_HV_KEY 15 16071d10453SEric Joyner u8 remaining_hv_key[ICE_BOOST_REMAINING_HV_KEY]; 1618923de59SPiotr Kubaj union { 1628923de59SPiotr Kubaj struct { 16371d10453SEric Joyner __le16 hv_dst_port_key; 16471d10453SEric Joyner __le16 hv_src_port_key; 1658923de59SPiotr Kubaj } /* udp_tunnel */; 1668923de59SPiotr Kubaj struct { 1678923de59SPiotr Kubaj __le16 hv_vlan_id_key; 1688923de59SPiotr Kubaj __le16 hv_etype_key; 1698923de59SPiotr Kubaj } vlan; 1708923de59SPiotr Kubaj }; 17171d10453SEric Joyner u8 tcam_search_key; 17271d10453SEric Joyner }; 17371d10453SEric Joyner #pragma pack() 17471d10453SEric Joyner 17571d10453SEric Joyner struct ice_boost_key { 17671d10453SEric Joyner struct ice_boost_key_value key; 17771d10453SEric Joyner struct ice_boost_key_value key2; 17871d10453SEric Joyner }; 17971d10453SEric Joyner 18071d10453SEric Joyner /* package Boost TCAM entry */ 18171d10453SEric Joyner struct ice_boost_tcam_entry { 18271d10453SEric Joyner __le16 addr; 18371d10453SEric Joyner __le16 reserved; 18471d10453SEric Joyner /* break up the 40 bytes of key into different fields */ 18571d10453SEric Joyner struct ice_boost_key key; 18671d10453SEric Joyner u8 boost_hit_index_group; 18771d10453SEric Joyner /* The following contains bitfields which are not on byte boundaries. 18871d10453SEric Joyner * These fields are currently unused by driver software. 18971d10453SEric Joyner */ 19071d10453SEric Joyner #define ICE_BOOST_BIT_FIELDS 43 19171d10453SEric Joyner u8 bit_fields[ICE_BOOST_BIT_FIELDS]; 19271d10453SEric Joyner }; 19371d10453SEric Joyner 19471d10453SEric Joyner struct ice_boost_tcam_section { 19571d10453SEric Joyner __le16 count; 19671d10453SEric Joyner __le16 reserved; 1977d7af7f8SEric Joyner struct ice_boost_tcam_entry tcam[STRUCT_HACK_VAR_LEN]; 19871d10453SEric Joyner }; 19971d10453SEric Joyner 20071d10453SEric Joyner #define ICE_MAX_BST_TCAMS_IN_BUF ICE_MAX_ENTRIES_IN_BUF( \ 2017d7af7f8SEric Joyner ice_struct_size((struct ice_boost_tcam_section *)0, tcam, 1) - \ 20271d10453SEric Joyner sizeof(struct ice_boost_tcam_entry), \ 20371d10453SEric Joyner sizeof(struct ice_boost_tcam_entry)) 20471d10453SEric Joyner 20571d10453SEric Joyner struct ice_xlt1_section { 20671d10453SEric Joyner __le16 count; 20771d10453SEric Joyner __le16 offset; 2087d7af7f8SEric Joyner u8 value[STRUCT_HACK_VAR_LEN]; 20971d10453SEric Joyner }; 21071d10453SEric Joyner 21171d10453SEric Joyner struct ice_xlt2_section { 21271d10453SEric Joyner __le16 count; 21371d10453SEric Joyner __le16 offset; 2147d7af7f8SEric Joyner __le16 value[STRUCT_HACK_VAR_LEN]; 21571d10453SEric Joyner }; 21671d10453SEric Joyner 21771d10453SEric Joyner struct ice_prof_redir_section { 21871d10453SEric Joyner __le16 count; 21971d10453SEric Joyner __le16 offset; 2207d7af7f8SEric Joyner u8 redir_value[STRUCT_HACK_VAR_LEN]; 22171d10453SEric Joyner }; 22271d10453SEric Joyner 22371d10453SEric Joyner /* Tunnel enabling */ 22471d10453SEric Joyner 22571d10453SEric Joyner enum ice_tunnel_type { 22671d10453SEric Joyner TNL_VXLAN = 0, 22771d10453SEric Joyner TNL_GENEVE, 2288923de59SPiotr Kubaj TNL_GRETAP, 229d08b8680SEric Joyner TNL_GTP, 2308923de59SPiotr Kubaj TNL_GTPC, 2318923de59SPiotr Kubaj TNL_GTPU, 23271d10453SEric Joyner TNL_LAST = 0xFF, 23371d10453SEric Joyner TNL_ALL = 0xFF, 23471d10453SEric Joyner }; 23571d10453SEric Joyner 23671d10453SEric Joyner struct ice_tunnel_type_scan { 23771d10453SEric Joyner enum ice_tunnel_type type; 23871d10453SEric Joyner const char *label_prefix; 23971d10453SEric Joyner }; 24071d10453SEric Joyner 24171d10453SEric Joyner struct ice_tunnel_entry { 24271d10453SEric Joyner enum ice_tunnel_type type; 24371d10453SEric Joyner u16 boost_addr; 24471d10453SEric Joyner u16 port; 24571d10453SEric Joyner u16 ref; 24671d10453SEric Joyner struct ice_boost_tcam_entry *boost_entry; 24771d10453SEric Joyner u8 valid; 24871d10453SEric Joyner u8 in_use; 24971d10453SEric Joyner u8 marked; 25071d10453SEric Joyner }; 25171d10453SEric Joyner 25271d10453SEric Joyner #define ICE_TUNNEL_MAX_ENTRIES 16 25371d10453SEric Joyner 25471d10453SEric Joyner struct ice_tunnel_table { 25571d10453SEric Joyner struct ice_tunnel_entry tbl[ICE_TUNNEL_MAX_ENTRIES]; 25671d10453SEric Joyner u16 count; 25771d10453SEric Joyner }; 25871d10453SEric Joyner 25971d10453SEric Joyner struct ice_pkg_es { 26071d10453SEric Joyner __le16 count; 26171d10453SEric Joyner __le16 offset; 2627d7af7f8SEric Joyner struct ice_fv_word es[STRUCT_HACK_VAR_LEN]; 26371d10453SEric Joyner }; 26471d10453SEric Joyner 26571d10453SEric Joyner struct ice_es { 26671d10453SEric Joyner u32 sid; 26771d10453SEric Joyner u16 count; 26871d10453SEric Joyner u16 fvw; 26971d10453SEric Joyner u16 *ref_count; 27071d10453SEric Joyner struct LIST_HEAD_TYPE prof_map; 27171d10453SEric Joyner struct ice_fv_word *t; 27271d10453SEric Joyner struct ice_lock prof_map_lock; /* protect access to profiles list */ 27371d10453SEric Joyner u8 *written; 27471d10453SEric Joyner u8 reverse; /* set to true to reverse FV order */ 27571d10453SEric Joyner }; 27671d10453SEric Joyner 27771d10453SEric Joyner /* PTYPE Group management */ 27871d10453SEric Joyner 27971d10453SEric Joyner /* Note: XLT1 table takes 13-bit as input, and results in an 8-bit packet type 28071d10453SEric Joyner * group (PTG) ID as output. 28171d10453SEric Joyner * 28271d10453SEric Joyner * Note: PTG 0 is the default packet type group and it is assumed that all PTYPE 28371d10453SEric Joyner * are a part of this group until moved to a new PTG. 28471d10453SEric Joyner */ 28571d10453SEric Joyner #define ICE_DEFAULT_PTG 0 28671d10453SEric Joyner 28771d10453SEric Joyner struct ice_ptg_entry { 28871d10453SEric Joyner struct ice_ptg_ptype *first_ptype; 28971d10453SEric Joyner u8 in_use; 29071d10453SEric Joyner }; 29171d10453SEric Joyner 29271d10453SEric Joyner struct ice_ptg_ptype { 29371d10453SEric Joyner struct ice_ptg_ptype *next_ptype; 29471d10453SEric Joyner u8 ptg; 29571d10453SEric Joyner }; 29671d10453SEric Joyner 29771d10453SEric Joyner #define ICE_MAX_TCAM_PER_PROFILE 32 29871d10453SEric Joyner #define ICE_MAX_PTG_PER_PROFILE 32 29971d10453SEric Joyner 30071d10453SEric Joyner struct ice_prof_map { 30171d10453SEric Joyner struct LIST_ENTRY_TYPE list; 30271d10453SEric Joyner u64 profile_cookie; 30371d10453SEric Joyner u64 context; 30471d10453SEric Joyner u8 prof_id; 30571d10453SEric Joyner u8 ptg_cnt; 30671d10453SEric Joyner u8 ptg[ICE_MAX_PTG_PER_PROFILE]; 30771d10453SEric Joyner }; 30871d10453SEric Joyner 30971d10453SEric Joyner #define ICE_INVALID_TCAM 0xFFFF 31071d10453SEric Joyner 31171d10453SEric Joyner struct ice_tcam_inf { 31271d10453SEric Joyner u16 tcam_idx; 31371d10453SEric Joyner u8 ptg; 31471d10453SEric Joyner u8 prof_id; 31571d10453SEric Joyner u8 in_use; 31671d10453SEric Joyner }; 31771d10453SEric Joyner 31871d10453SEric Joyner struct ice_vsig_prof { 31971d10453SEric Joyner struct LIST_ENTRY_TYPE list; 32071d10453SEric Joyner u64 profile_cookie; 32171d10453SEric Joyner u8 prof_id; 32271d10453SEric Joyner u8 tcam_count; 32371d10453SEric Joyner struct ice_tcam_inf tcam[ICE_MAX_TCAM_PER_PROFILE]; 32471d10453SEric Joyner }; 32571d10453SEric Joyner 32671d10453SEric Joyner struct ice_vsig_entry { 32771d10453SEric Joyner struct LIST_HEAD_TYPE prop_lst; 32871d10453SEric Joyner struct ice_vsig_vsi *first_vsi; 32971d10453SEric Joyner u8 in_use; 33071d10453SEric Joyner }; 33171d10453SEric Joyner 33271d10453SEric Joyner struct ice_vsig_vsi { 33371d10453SEric Joyner struct ice_vsig_vsi *next_vsi; 33471d10453SEric Joyner u32 prop_mask; 33571d10453SEric Joyner u16 changed; 33671d10453SEric Joyner u16 vsig; 33771d10453SEric Joyner }; 33871d10453SEric Joyner 33971d10453SEric Joyner #define ICE_XLT1_CNT 1024 34071d10453SEric Joyner #define ICE_MAX_PTGS 256 34171d10453SEric Joyner 34271d10453SEric Joyner /* XLT1 Table */ 34371d10453SEric Joyner struct ice_xlt1 { 34471d10453SEric Joyner struct ice_ptg_entry *ptg_tbl; 34571d10453SEric Joyner struct ice_ptg_ptype *ptypes; 34671d10453SEric Joyner u8 *t; 34771d10453SEric Joyner u32 sid; 34871d10453SEric Joyner u16 count; 34971d10453SEric Joyner }; 35071d10453SEric Joyner 35171d10453SEric Joyner #define ICE_XLT2_CNT 768 35271d10453SEric Joyner #define ICE_MAX_VSIGS 768 35371d10453SEric Joyner 35471d10453SEric Joyner /* VSIG bit layout: 35571d10453SEric Joyner * [0:12]: incremental VSIG index 1 to ICE_MAX_VSIGS 35671d10453SEric Joyner * [13:15]: PF number of device 35771d10453SEric Joyner */ 35871d10453SEric Joyner #define ICE_VSIG_IDX_M (0x1FFF) 35971d10453SEric Joyner #define ICE_PF_NUM_S 13 36071d10453SEric Joyner #define ICE_PF_NUM_M (0x07 << ICE_PF_NUM_S) 36171d10453SEric Joyner #define ICE_VSIG_VALUE(vsig, pf_id) \ 3629cf1841cSEric Joyner ((u16)((((u16)(vsig)) & ICE_VSIG_IDX_M) | \ 3639cf1841cSEric Joyner (((u16)(pf_id) << ICE_PF_NUM_S) & ICE_PF_NUM_M))) 36471d10453SEric Joyner #define ICE_DEFAULT_VSIG 0 36571d10453SEric Joyner 36671d10453SEric Joyner /* XLT2 Table */ 36771d10453SEric Joyner struct ice_xlt2 { 36871d10453SEric Joyner struct ice_vsig_entry *vsig_tbl; 36971d10453SEric Joyner struct ice_vsig_vsi *vsis; 37071d10453SEric Joyner u16 *t; 37171d10453SEric Joyner u32 sid; 37271d10453SEric Joyner u16 count; 37371d10453SEric Joyner }; 37471d10453SEric Joyner 37571d10453SEric Joyner /* Extraction sequence - list of match fields: 37671d10453SEric Joyner * protocol ID, offset, profile length 37771d10453SEric Joyner */ 37871d10453SEric Joyner union ice_match_fld { 37971d10453SEric Joyner struct { 38071d10453SEric Joyner u8 prot_id; 38171d10453SEric Joyner u8 offset; 38271d10453SEric Joyner u8 length; 38371d10453SEric Joyner u8 reserved; /* must be zero */ 38471d10453SEric Joyner } fld; 38571d10453SEric Joyner u32 val; 38671d10453SEric Joyner }; 38771d10453SEric Joyner 38871d10453SEric Joyner #define ICE_MATCH_LIST_SZ 20 38971d10453SEric Joyner #pragma pack(1) 39071d10453SEric Joyner struct ice_match { 39171d10453SEric Joyner u8 count; 39271d10453SEric Joyner union ice_match_fld list[ICE_MATCH_LIST_SZ]; 39371d10453SEric Joyner }; 39471d10453SEric Joyner 39571d10453SEric Joyner /* Profile ID Management */ 39671d10453SEric Joyner struct ice_prof_id_key { 39771d10453SEric Joyner __le16 flags; 39871d10453SEric Joyner u8 xlt1; 39971d10453SEric Joyner __le16 xlt2_cdid; 40071d10453SEric Joyner }; 40171d10453SEric Joyner 40271d10453SEric Joyner /* Keys are made up of two values, each one-half the size of the key. 40371d10453SEric Joyner * For TCAM, the entire key is 80 bits wide (or 2, 40-bit wide values) 40471d10453SEric Joyner */ 40571d10453SEric Joyner #define ICE_TCAM_KEY_VAL_SZ 5 40671d10453SEric Joyner #define ICE_TCAM_KEY_SZ (2 * ICE_TCAM_KEY_VAL_SZ) 40771d10453SEric Joyner 40871d10453SEric Joyner struct ice_prof_tcam_entry { 40971d10453SEric Joyner __le16 addr; 41071d10453SEric Joyner u8 key[ICE_TCAM_KEY_SZ]; 41171d10453SEric Joyner u8 prof_id; 41271d10453SEric Joyner }; 4137d7af7f8SEric Joyner #pragma pack() 41471d10453SEric Joyner 41571d10453SEric Joyner struct ice_prof_id_section { 41671d10453SEric Joyner __le16 count; 4177d7af7f8SEric Joyner struct ice_prof_tcam_entry entry[STRUCT_HACK_VAR_LEN]; 41871d10453SEric Joyner }; 41971d10453SEric Joyner 42071d10453SEric Joyner struct ice_prof_tcam { 42171d10453SEric Joyner u32 sid; 42271d10453SEric Joyner u16 count; 42371d10453SEric Joyner u16 max_prof_id; 42471d10453SEric Joyner struct ice_prof_tcam_entry *t; 42571d10453SEric Joyner u8 cdid_bits; /* # CDID bits to use in key, 0, 2, 4, or 8 */ 42671d10453SEric Joyner }; 42771d10453SEric Joyner 42871d10453SEric Joyner struct ice_prof_redir { 42971d10453SEric Joyner u8 *t; 43071d10453SEric Joyner u32 sid; 43171d10453SEric Joyner u16 count; 43271d10453SEric Joyner }; 43371d10453SEric Joyner 43471d10453SEric Joyner /* Tables per block */ 43571d10453SEric Joyner struct ice_blk_info { 43671d10453SEric Joyner struct ice_xlt1 xlt1; 43771d10453SEric Joyner struct ice_xlt2 xlt2; 43871d10453SEric Joyner struct ice_prof_tcam prof; 43971d10453SEric Joyner struct ice_prof_redir prof_redir; 44071d10453SEric Joyner struct ice_es es; 44171d10453SEric Joyner u8 overwrite; /* set to true to allow overwrite of table entries */ 44271d10453SEric Joyner u8 is_list_init; 44371d10453SEric Joyner }; 44471d10453SEric Joyner 44571d10453SEric Joyner enum ice_chg_type { 44671d10453SEric Joyner ICE_TCAM_NONE = 0, 44771d10453SEric Joyner ICE_PTG_ES_ADD, 44871d10453SEric Joyner ICE_TCAM_ADD, 44971d10453SEric Joyner ICE_VSIG_ADD, 45071d10453SEric Joyner ICE_VSIG_REM, 45171d10453SEric Joyner ICE_VSI_MOVE, 45271d10453SEric Joyner }; 45371d10453SEric Joyner 45471d10453SEric Joyner struct ice_chs_chg { 45571d10453SEric Joyner struct LIST_ENTRY_TYPE list_entry; 45671d10453SEric Joyner enum ice_chg_type type; 45771d10453SEric Joyner 45871d10453SEric Joyner u8 add_ptg; 45971d10453SEric Joyner u8 add_vsig; 46071d10453SEric Joyner u8 add_tcam_idx; 46171d10453SEric Joyner u8 add_prof; 46271d10453SEric Joyner u16 ptype; 46371d10453SEric Joyner u8 ptg; 46471d10453SEric Joyner u8 prof_id; 46571d10453SEric Joyner u16 vsi; 46671d10453SEric Joyner u16 vsig; 46771d10453SEric Joyner u16 orig_vsig; 46871d10453SEric Joyner u16 tcam_idx; 46971d10453SEric Joyner }; 47071d10453SEric Joyner 47171d10453SEric Joyner #define ICE_FLOW_PTYPE_MAX ICE_XLT1_CNT 47271d10453SEric Joyner 47371d10453SEric Joyner enum ice_prof_type { 4748923de59SPiotr Kubaj ICE_PROF_INVALID = 0x0, 47571d10453SEric Joyner ICE_PROF_NON_TUN = 0x1, 47671d10453SEric Joyner ICE_PROF_TUN_UDP = 0x2, 47771d10453SEric Joyner ICE_PROF_TUN_GRE = 0x4, 4788923de59SPiotr Kubaj ICE_PROF_TUN_GTPU = 0x8, 4798923de59SPiotr Kubaj ICE_PROF_TUN_GTPC = 0x10, 4808923de59SPiotr Kubaj ICE_PROF_TUN_ALL = 0x1E, 48171d10453SEric Joyner ICE_PROF_ALL = 0xFF, 48271d10453SEric Joyner }; 4839cf1841cSEric Joyner 4849cf1841cSEric Joyner /* Number of bits/bytes contained in meta init entry. Note, this should be a 4859cf1841cSEric Joyner * multiple of 32 bits. 4869cf1841cSEric Joyner */ 4879cf1841cSEric Joyner #define ICE_META_INIT_BITS 192 4889cf1841cSEric Joyner #define ICE_META_INIT_DW_CNT (ICE_META_INIT_BITS / (sizeof(__le32) * \ 4899cf1841cSEric Joyner BITS_PER_BYTE)) 4909cf1841cSEric Joyner 4919cf1841cSEric Joyner /* The meta init Flag field starts at this bit */ 4929cf1841cSEric Joyner #define ICE_META_FLAGS_ST 123 4939cf1841cSEric Joyner 4949cf1841cSEric Joyner /* The entry and bit to check for Double VLAN Mode (DVM) support */ 4959cf1841cSEric Joyner #define ICE_META_VLAN_MODE_ENTRY 0 4969cf1841cSEric Joyner #define ICE_META_FLAG_VLAN_MODE 60 4979cf1841cSEric Joyner #define ICE_META_VLAN_MODE_BIT (ICE_META_FLAGS_ST + \ 4989cf1841cSEric Joyner ICE_META_FLAG_VLAN_MODE) 4999cf1841cSEric Joyner 5009cf1841cSEric Joyner struct ice_meta_init_entry { 5019cf1841cSEric Joyner __le32 bm[ICE_META_INIT_DW_CNT]; 5029cf1841cSEric Joyner }; 5039cf1841cSEric Joyner 5049cf1841cSEric Joyner struct ice_meta_init_section { 5059cf1841cSEric Joyner __le16 count; 5069cf1841cSEric Joyner __le16 offset; 5079cf1841cSEric Joyner struct ice_meta_init_entry entry[1]; 5089cf1841cSEric Joyner }; 50971d10453SEric Joyner #endif /* _ICE_FLEX_TYPE_H_ */ 510