1*71d10453SEric Joyner /* SPDX-License-Identifier: BSD-3-Clause */ 2*71d10453SEric Joyner /* Copyright (c) 2020, Intel Corporation 3*71d10453SEric Joyner * All rights reserved. 4*71d10453SEric Joyner * 5*71d10453SEric Joyner * Redistribution and use in source and binary forms, with or without 6*71d10453SEric Joyner * modification, are permitted provided that the following conditions are met: 7*71d10453SEric Joyner * 8*71d10453SEric Joyner * 1. Redistributions of source code must retain the above copyright notice, 9*71d10453SEric Joyner * this list of conditions and the following disclaimer. 10*71d10453SEric Joyner * 11*71d10453SEric Joyner * 2. Redistributions in binary form must reproduce the above copyright 12*71d10453SEric Joyner * notice, this list of conditions and the following disclaimer in the 13*71d10453SEric Joyner * documentation and/or other materials provided with the distribution. 14*71d10453SEric Joyner * 15*71d10453SEric Joyner * 3. Neither the name of the Intel Corporation nor the names of its 16*71d10453SEric Joyner * contributors may be used to endorse or promote products derived from 17*71d10453SEric Joyner * this software without specific prior written permission. 18*71d10453SEric Joyner * 19*71d10453SEric Joyner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20*71d10453SEric Joyner * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21*71d10453SEric Joyner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22*71d10453SEric Joyner * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23*71d10453SEric Joyner * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*71d10453SEric Joyner * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*71d10453SEric Joyner * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*71d10453SEric Joyner * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*71d10453SEric Joyner * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*71d10453SEric Joyner * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*71d10453SEric Joyner * POSSIBILITY OF SUCH DAMAGE. 30*71d10453SEric Joyner */ 31*71d10453SEric Joyner /*$FreeBSD$*/ 32*71d10453SEric Joyner 33*71d10453SEric Joyner #ifndef _ICE_FLOW_H_ 34*71d10453SEric Joyner #define _ICE_FLOW_H_ 35*71d10453SEric Joyner 36*71d10453SEric Joyner #include "ice_flex_type.h" 37*71d10453SEric Joyner #define ICE_IPV4_MAKE_PREFIX_MASK(prefix) ((u32)(~0) << (32 - (prefix))) 38*71d10453SEric Joyner #define ICE_FLOW_PROF_ID_INVAL 0xfffffffffffffffful 39*71d10453SEric Joyner #define ICE_FLOW_PROF_ID_BYPASS 0 40*71d10453SEric Joyner #define ICE_FLOW_PROF_ID_DEFAULT 1 41*71d10453SEric Joyner #define ICE_FLOW_ENTRY_HANDLE_INVAL 0 42*71d10453SEric Joyner #define ICE_FLOW_VSI_INVAL 0xffff 43*71d10453SEric Joyner #define ICE_FLOW_FLD_OFF_INVAL 0xffff 44*71d10453SEric Joyner 45*71d10453SEric Joyner /* Generate flow hash field from flow field type(s) */ 46*71d10453SEric Joyner #define ICE_FLOW_HASH_IPV4 \ 47*71d10453SEric Joyner (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | \ 48*71d10453SEric Joyner BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)) 49*71d10453SEric Joyner #define ICE_FLOW_HASH_IPV6 \ 50*71d10453SEric Joyner (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | \ 51*71d10453SEric Joyner BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)) 52*71d10453SEric Joyner #define ICE_FLOW_HASH_TCP_PORT \ 53*71d10453SEric Joyner (BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) | \ 54*71d10453SEric Joyner BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)) 55*71d10453SEric Joyner #define ICE_FLOW_HASH_UDP_PORT \ 56*71d10453SEric Joyner (BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT) | \ 57*71d10453SEric Joyner BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)) 58*71d10453SEric Joyner #define ICE_FLOW_HASH_SCTP_PORT \ 59*71d10453SEric Joyner (BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT) | \ 60*71d10453SEric Joyner BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)) 61*71d10453SEric Joyner 62*71d10453SEric Joyner #define ICE_HASH_INVALID 0 63*71d10453SEric Joyner #define ICE_HASH_TCP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_TCP_PORT) 64*71d10453SEric Joyner #define ICE_HASH_TCP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_TCP_PORT) 65*71d10453SEric Joyner #define ICE_HASH_UDP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_UDP_PORT) 66*71d10453SEric Joyner #define ICE_HASH_UDP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_UDP_PORT) 67*71d10453SEric Joyner #define ICE_HASH_SCTP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_SCTP_PORT) 68*71d10453SEric Joyner #define ICE_HASH_SCTP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_SCTP_PORT) 69*71d10453SEric Joyner 70*71d10453SEric Joyner /* Protocol header fields within a packet segment. A segment consists of one or 71*71d10453SEric Joyner * more protocol headers that make up a logical group of protocol headers. Each 72*71d10453SEric Joyner * logical group of protocol headers encapsulates or is encapsulated using/by 73*71d10453SEric Joyner * tunneling or encapsulation protocols for network virtualization such as GRE, 74*71d10453SEric Joyner * VxLAN, etc. 75*71d10453SEric Joyner */ 76*71d10453SEric Joyner enum ice_flow_seg_hdr { 77*71d10453SEric Joyner ICE_FLOW_SEG_HDR_NONE = 0x00000000, 78*71d10453SEric Joyner ICE_FLOW_SEG_HDR_ETH = 0x00000001, 79*71d10453SEric Joyner ICE_FLOW_SEG_HDR_VLAN = 0x00000002, 80*71d10453SEric Joyner ICE_FLOW_SEG_HDR_IPV4 = 0x00000004, 81*71d10453SEric Joyner ICE_FLOW_SEG_HDR_IPV6 = 0x00000008, 82*71d10453SEric Joyner ICE_FLOW_SEG_HDR_ARP = 0x00000010, 83*71d10453SEric Joyner ICE_FLOW_SEG_HDR_ICMP = 0x00000020, 84*71d10453SEric Joyner ICE_FLOW_SEG_HDR_TCP = 0x00000040, 85*71d10453SEric Joyner ICE_FLOW_SEG_HDR_UDP = 0x00000080, 86*71d10453SEric Joyner ICE_FLOW_SEG_HDR_SCTP = 0x00000100, 87*71d10453SEric Joyner ICE_FLOW_SEG_HDR_GRE = 0x00000200, 88*71d10453SEric Joyner }; 89*71d10453SEric Joyner 90*71d10453SEric Joyner enum ice_flow_field { 91*71d10453SEric Joyner /* L2 */ 92*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_ETH_DA, 93*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_ETH_SA, 94*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_S_VLAN, 95*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_C_VLAN, 96*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_ETH_TYPE, 97*71d10453SEric Joyner /* L3 */ 98*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_IPV4_DSCP, 99*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_IPV6_DSCP, 100*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_IPV4_TTL, 101*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_IPV4_PROT, 102*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_IPV6_TTL, 103*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_IPV6_PROT, 104*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_IPV4_SA, 105*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_IPV4_DA, 106*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_IPV6_SA, 107*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_IPV6_DA, 108*71d10453SEric Joyner /* L4 */ 109*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_TCP_SRC_PORT, 110*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_TCP_DST_PORT, 111*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_UDP_SRC_PORT, 112*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_UDP_DST_PORT, 113*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT, 114*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_SCTP_DST_PORT, 115*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_TCP_FLAGS, 116*71d10453SEric Joyner /* ARP */ 117*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_ARP_SIP, 118*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_ARP_DIP, 119*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_ARP_SHA, 120*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_ARP_DHA, 121*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_ARP_OP, 122*71d10453SEric Joyner /* ICMP */ 123*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_ICMP_TYPE, 124*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_ICMP_CODE, 125*71d10453SEric Joyner /* GRE */ 126*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_GRE_KEYID, 127*71d10453SEric Joyner /* The total number of enums must not exceed 64 */ 128*71d10453SEric Joyner ICE_FLOW_FIELD_IDX_MAX 129*71d10453SEric Joyner }; 130*71d10453SEric Joyner 131*71d10453SEric Joyner /* Flow headers and fields for AVF support */ 132*71d10453SEric Joyner enum ice_flow_avf_hdr_field { 133*71d10453SEric Joyner /* Values 0 - 28 are reserved for future use */ 134*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_INVALID = 0, 135*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_UNICAST_IPV4_UDP = 29, 136*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_MULTICAST_IPV4_UDP, 137*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_IPV4_UDP, 138*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_IPV4_TCP_SYN_NO_ACK, 139*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_IPV4_TCP, 140*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_IPV4_SCTP, 141*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_IPV4_OTHER, 142*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_FRAG_IPV4, 143*71d10453SEric Joyner /* Values 37-38 are reserved */ 144*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_UNICAST_IPV6_UDP = 39, 145*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_MULTICAST_IPV6_UDP, 146*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_IPV6_UDP, 147*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_IPV6_TCP_SYN_NO_ACK, 148*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_IPV6_TCP, 149*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_IPV6_SCTP, 150*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_IPV6_OTHER, 151*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_FRAG_IPV6, 152*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_RSVD47, 153*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_FCOE_OX, 154*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_FCOE_RX, 155*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_FCOE_OTHER, 156*71d10453SEric Joyner /* Values 51-62 are reserved */ 157*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_L2_PAYLOAD = 63, 158*71d10453SEric Joyner ICE_AVF_FLOW_FIELD_MAX 159*71d10453SEric Joyner }; 160*71d10453SEric Joyner 161*71d10453SEric Joyner /* Supported RSS offloads This macro is defined to support 162*71d10453SEric Joyner * VIRTCHNL_OP_GET_RSS_HENA_CAPS ops. PF driver sends the RSS hardware 163*71d10453SEric Joyner * capabilities to the caller of this ops. 164*71d10453SEric Joyner */ 165*71d10453SEric Joyner #define ICE_DEFAULT_RSS_HENA ( \ 166*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_UDP) | \ 167*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_SCTP) | \ 168*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_TCP) | \ 169*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_OTHER) | \ 170*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_FRAG_IPV4) | \ 171*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_UDP) | \ 172*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_TCP) | \ 173*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_SCTP) | \ 174*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_OTHER) | \ 175*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_FRAG_IPV6) | \ 176*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_TCP_SYN_NO_ACK) | \ 177*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_UNICAST_IPV4_UDP) | \ 178*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_MULTICAST_IPV4_UDP) | \ 179*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_TCP_SYN_NO_ACK) | \ 180*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_UNICAST_IPV6_UDP) | \ 181*71d10453SEric Joyner BIT_ULL(ICE_AVF_FLOW_FIELD_MULTICAST_IPV6_UDP)) 182*71d10453SEric Joyner 183*71d10453SEric Joyner enum ice_flow_dir { 184*71d10453SEric Joyner ICE_FLOW_DIR_UNDEFINED = 0, 185*71d10453SEric Joyner ICE_FLOW_TX = 0x01, 186*71d10453SEric Joyner ICE_FLOW_RX = 0x02, 187*71d10453SEric Joyner ICE_FLOW_TX_RX = ICE_FLOW_RX | ICE_FLOW_TX 188*71d10453SEric Joyner }; 189*71d10453SEric Joyner 190*71d10453SEric Joyner enum ice_flow_priority { 191*71d10453SEric Joyner ICE_FLOW_PRIO_LOW, 192*71d10453SEric Joyner ICE_FLOW_PRIO_NORMAL, 193*71d10453SEric Joyner ICE_FLOW_PRIO_HIGH 194*71d10453SEric Joyner }; 195*71d10453SEric Joyner 196*71d10453SEric Joyner #define ICE_FLOW_SEG_MAX 2 197*71d10453SEric Joyner #define ICE_FLOW_SEG_RAW_FLD_MAX 2 198*71d10453SEric Joyner #define ICE_FLOW_PROFILE_MAX 1024 199*71d10453SEric Joyner #define ICE_FLOW_SW_FIELD_VECTOR_MAX 48 200*71d10453SEric Joyner #define ICE_FLOW_ACL_FIELD_VECTOR_MAX 32 201*71d10453SEric Joyner #define ICE_FLOW_FV_EXTRACT_SZ 2 202*71d10453SEric Joyner 203*71d10453SEric Joyner #define ICE_FLOW_SET_HDRS(seg, val) ((seg)->hdrs |= (u32)(val)) 204*71d10453SEric Joyner 205*71d10453SEric Joyner struct ice_flow_seg_xtrct { 206*71d10453SEric Joyner u8 prot_id; /* Protocol ID of extracted header field */ 207*71d10453SEric Joyner u16 off; /* Starting offset of the field in header in bytes */ 208*71d10453SEric Joyner u8 idx; /* Index of FV entry used */ 209*71d10453SEric Joyner u8 disp; /* Displacement of field in bits fr. FV entry's start */ 210*71d10453SEric Joyner }; 211*71d10453SEric Joyner 212*71d10453SEric Joyner enum ice_flow_fld_match_type { 213*71d10453SEric Joyner ICE_FLOW_FLD_TYPE_REG, /* Value, mask */ 214*71d10453SEric Joyner ICE_FLOW_FLD_TYPE_RANGE, /* Value, mask, last (upper bound) */ 215*71d10453SEric Joyner ICE_FLOW_FLD_TYPE_PREFIX, /* IP address, prefix, size of prefix */ 216*71d10453SEric Joyner ICE_FLOW_FLD_TYPE_SIZE, /* Value, mask, size of match */ 217*71d10453SEric Joyner }; 218*71d10453SEric Joyner 219*71d10453SEric Joyner struct ice_flow_fld_loc { 220*71d10453SEric Joyner /* Describe offsets of field information relative to the beginning of 221*71d10453SEric Joyner * input buffer provided when adding flow entries. 222*71d10453SEric Joyner */ 223*71d10453SEric Joyner u16 val; /* Offset where the value is located */ 224*71d10453SEric Joyner u16 mask; /* Offset where the mask/prefix value is located */ 225*71d10453SEric Joyner u16 last; /* Length or offset where the upper value is located */ 226*71d10453SEric Joyner }; 227*71d10453SEric Joyner 228*71d10453SEric Joyner struct ice_flow_fld_info { 229*71d10453SEric Joyner enum ice_flow_fld_match_type type; 230*71d10453SEric Joyner /* Location where to retrieve data from an input buffer */ 231*71d10453SEric Joyner struct ice_flow_fld_loc src; 232*71d10453SEric Joyner /* Location where to put the data into the final entry buffer */ 233*71d10453SEric Joyner struct ice_flow_fld_loc entry; 234*71d10453SEric Joyner struct ice_flow_seg_xtrct xtrct; 235*71d10453SEric Joyner }; 236*71d10453SEric Joyner 237*71d10453SEric Joyner struct ice_flow_seg_fld_raw { 238*71d10453SEric Joyner struct ice_flow_fld_info info; 239*71d10453SEric Joyner u16 off; /* Offset from the start of the segment */ 240*71d10453SEric Joyner }; 241*71d10453SEric Joyner 242*71d10453SEric Joyner struct ice_flow_seg_info { 243*71d10453SEric Joyner u32 hdrs; /* Bitmask indicating protocol headers present */ 244*71d10453SEric Joyner u64 match; /* Bitmask indicating header fields to be matched */ 245*71d10453SEric Joyner u64 range; /* Bitmask indicating header fields matched as ranges */ 246*71d10453SEric Joyner 247*71d10453SEric Joyner struct ice_flow_fld_info fields[ICE_FLOW_FIELD_IDX_MAX]; 248*71d10453SEric Joyner 249*71d10453SEric Joyner u8 raws_cnt; /* Number of raw fields to be matched */ 250*71d10453SEric Joyner struct ice_flow_seg_fld_raw raws[ICE_FLOW_SEG_RAW_FLD_MAX]; 251*71d10453SEric Joyner }; 252*71d10453SEric Joyner 253*71d10453SEric Joyner /* This structure describes a flow entry, and is tracked only in this file */ 254*71d10453SEric Joyner struct ice_flow_entry { 255*71d10453SEric Joyner struct LIST_ENTRY_TYPE l_entry; 256*71d10453SEric Joyner 257*71d10453SEric Joyner u64 id; 258*71d10453SEric Joyner struct ice_flow_prof *prof; 259*71d10453SEric Joyner /* Action list */ 260*71d10453SEric Joyner struct ice_flow_action *acts; 261*71d10453SEric Joyner /* Flow entry's content */ 262*71d10453SEric Joyner void *entry; 263*71d10453SEric Joyner enum ice_flow_priority priority; 264*71d10453SEric Joyner u16 vsi_handle; 265*71d10453SEric Joyner u16 entry_sz; 266*71d10453SEric Joyner u8 acts_cnt; 267*71d10453SEric Joyner }; 268*71d10453SEric Joyner 269*71d10453SEric Joyner #define ICE_FLOW_ENTRY_HNDL(e) ((u64)e) 270*71d10453SEric Joyner #define ICE_FLOW_ENTRY_PTR(h) ((struct ice_flow_entry *)(h)) 271*71d10453SEric Joyner 272*71d10453SEric Joyner struct ice_flow_prof { 273*71d10453SEric Joyner struct LIST_ENTRY_TYPE l_entry; 274*71d10453SEric Joyner 275*71d10453SEric Joyner u64 id; 276*71d10453SEric Joyner enum ice_flow_dir dir; 277*71d10453SEric Joyner u8 segs_cnt; 278*71d10453SEric Joyner u8 acts_cnt; 279*71d10453SEric Joyner 280*71d10453SEric Joyner /* Keep track of flow entries associated with this flow profile */ 281*71d10453SEric Joyner struct ice_lock entries_lock; 282*71d10453SEric Joyner struct LIST_HEAD_TYPE entries; 283*71d10453SEric Joyner 284*71d10453SEric Joyner struct ice_flow_seg_info segs[ICE_FLOW_SEG_MAX]; 285*71d10453SEric Joyner 286*71d10453SEric Joyner /* software VSI handles referenced by this flow profile */ 287*71d10453SEric Joyner ice_declare_bitmap(vsis, ICE_MAX_VSI); 288*71d10453SEric Joyner 289*71d10453SEric Joyner union { 290*71d10453SEric Joyner /* struct sw_recipe */ 291*71d10453SEric Joyner /* struct fd */ 292*71d10453SEric Joyner u32 data; 293*71d10453SEric Joyner } cfg; 294*71d10453SEric Joyner 295*71d10453SEric Joyner /* Default actions */ 296*71d10453SEric Joyner struct ice_flow_action *acts; 297*71d10453SEric Joyner }; 298*71d10453SEric Joyner 299*71d10453SEric Joyner struct ice_rss_cfg { 300*71d10453SEric Joyner struct LIST_ENTRY_TYPE l_entry; 301*71d10453SEric Joyner /* bitmap of VSIs added to the RSS entry */ 302*71d10453SEric Joyner ice_declare_bitmap(vsis, ICE_MAX_VSI); 303*71d10453SEric Joyner u64 hashed_flds; 304*71d10453SEric Joyner u32 packet_hdr; 305*71d10453SEric Joyner }; 306*71d10453SEric Joyner 307*71d10453SEric Joyner enum ice_flow_action_type { 308*71d10453SEric Joyner ICE_FLOW_ACT_NOP, 309*71d10453SEric Joyner ICE_FLOW_ACT_ALLOW, 310*71d10453SEric Joyner ICE_FLOW_ACT_DROP, 311*71d10453SEric Joyner ICE_FLOW_ACT_CNTR_PKT, 312*71d10453SEric Joyner ICE_FLOW_ACT_FWD_VSI, 313*71d10453SEric Joyner ICE_FLOW_ACT_FWD_VSI_LIST, /* Should be abstracted away */ 314*71d10453SEric Joyner ICE_FLOW_ACT_FWD_QUEUE, /* Can Queues be abstracted away? */ 315*71d10453SEric Joyner ICE_FLOW_ACT_FWD_QUEUE_GROUP, /* Can Queues be abstracted away? */ 316*71d10453SEric Joyner ICE_FLOW_ACT_PUSH, 317*71d10453SEric Joyner ICE_FLOW_ACT_POP, 318*71d10453SEric Joyner ICE_FLOW_ACT_MODIFY, 319*71d10453SEric Joyner ICE_FLOW_ACT_CNTR_BYTES, 320*71d10453SEric Joyner ICE_FLOW_ACT_CNTR_PKT_BYTES, 321*71d10453SEric Joyner ICE_FLOW_ACT_GENERIC_0, 322*71d10453SEric Joyner ICE_FLOW_ACT_GENERIC_1, 323*71d10453SEric Joyner ICE_FLOW_ACT_GENERIC_2, 324*71d10453SEric Joyner ICE_FLOW_ACT_GENERIC_3, 325*71d10453SEric Joyner ICE_FLOW_ACT_GENERIC_4, 326*71d10453SEric Joyner ICE_FLOW_ACT_RPT_FLOW_ID, 327*71d10453SEric Joyner ICE_FLOW_ACT_BUILD_PROF_IDX, 328*71d10453SEric Joyner }; 329*71d10453SEric Joyner 330*71d10453SEric Joyner struct ice_flow_action { 331*71d10453SEric Joyner enum ice_flow_action_type type; 332*71d10453SEric Joyner union { 333*71d10453SEric Joyner u32 dummy; 334*71d10453SEric Joyner } data; 335*71d10453SEric Joyner }; 336*71d10453SEric Joyner 337*71d10453SEric Joyner u64 338*71d10453SEric Joyner ice_flow_find_prof(struct ice_hw *hw, enum ice_block blk, enum ice_flow_dir dir, 339*71d10453SEric Joyner struct ice_flow_seg_info *segs, u8 segs_cnt); 340*71d10453SEric Joyner enum ice_status 341*71d10453SEric Joyner ice_flow_add_prof(struct ice_hw *hw, enum ice_block blk, enum ice_flow_dir dir, 342*71d10453SEric Joyner u64 prof_id, struct ice_flow_seg_info *segs, u8 segs_cnt, 343*71d10453SEric Joyner struct ice_flow_action *acts, u8 acts_cnt, 344*71d10453SEric Joyner struct ice_flow_prof **prof); 345*71d10453SEric Joyner enum ice_status 346*71d10453SEric Joyner ice_flow_rem_prof(struct ice_hw *hw, enum ice_block blk, u64 prof_id); 347*71d10453SEric Joyner enum ice_status 348*71d10453SEric Joyner ice_flow_assoc_vsig_vsi(struct ice_hw *hw, enum ice_block blk, u16 vsi_handle, 349*71d10453SEric Joyner u16 vsig); 350*71d10453SEric Joyner enum ice_status 351*71d10453SEric Joyner ice_flow_get_hw_prof(struct ice_hw *hw, enum ice_block blk, u64 prof_id, 352*71d10453SEric Joyner u8 *hw_prof); 353*71d10453SEric Joyner 354*71d10453SEric Joyner u64 ice_flow_find_entry(struct ice_hw *hw, enum ice_block blk, u64 entry_id); 355*71d10453SEric Joyner enum ice_status 356*71d10453SEric Joyner ice_flow_add_entry(struct ice_hw *hw, enum ice_block blk, u64 prof_id, 357*71d10453SEric Joyner u64 entry_id, u16 vsi, enum ice_flow_priority prio, 358*71d10453SEric Joyner void *data, struct ice_flow_action *acts, u8 acts_cnt, 359*71d10453SEric Joyner u64 *entry_h); 360*71d10453SEric Joyner enum ice_status ice_flow_rem_entry(struct ice_hw *hw, enum ice_block blk, 361*71d10453SEric Joyner u64 entry_h); 362*71d10453SEric Joyner void 363*71d10453SEric Joyner ice_flow_set_fld(struct ice_flow_seg_info *seg, enum ice_flow_field fld, 364*71d10453SEric Joyner u16 val_loc, u16 mask_loc, u16 last_loc, bool range); 365*71d10453SEric Joyner void 366*71d10453SEric Joyner ice_flow_set_fld_prefix(struct ice_flow_seg_info *seg, enum ice_flow_field fld, 367*71d10453SEric Joyner u16 val_loc, u16 prefix_loc, u8 prefix_sz); 368*71d10453SEric Joyner void 369*71d10453SEric Joyner ice_flow_add_fld_raw(struct ice_flow_seg_info *seg, u16 off, u8 len, 370*71d10453SEric Joyner u16 val_loc, u16 mask_loc); 371*71d10453SEric Joyner void ice_rem_vsi_rss_list(struct ice_hw *hw, u16 vsi_handle); 372*71d10453SEric Joyner enum ice_status ice_replay_rss_cfg(struct ice_hw *hw, u16 vsi_handle); 373*71d10453SEric Joyner enum ice_status 374*71d10453SEric Joyner ice_add_avf_rss_cfg(struct ice_hw *hw, u16 vsi_handle, u64 hashed_flds); 375*71d10453SEric Joyner enum ice_status ice_rem_vsi_rss_cfg(struct ice_hw *hw, u16 vsi_handle); 376*71d10453SEric Joyner enum ice_status 377*71d10453SEric Joyner ice_add_rss_cfg(struct ice_hw *hw, u16 vsi_handle, u64 hashed_flds, 378*71d10453SEric Joyner u32 addl_hdrs); 379*71d10453SEric Joyner enum ice_status 380*71d10453SEric Joyner ice_rem_rss_cfg(struct ice_hw *hw, u16 vsi_handle, u64 hashed_flds, 381*71d10453SEric Joyner u32 addl_hdrs); 382*71d10453SEric Joyner u64 ice_get_rss_cfg(struct ice_hw *hw, u16 vsi_handle, u32 hdrs); 383*71d10453SEric Joyner #endif /* _ICE_FLOW_H_ */ 384