xref: /freebsd/sys/dev/ice/ice_flex_type.h (revision 015f8cc5)
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