LCOV - code coverage report
Current view: top level - drivers/net/i40e - i40e_ethdev.h (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 8 0.0 %
Date: 2024-12-01 18:57:19 Functions: 0 0 -
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 6 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright(c) 2010-2017 Intel Corporation
       3                 :            :  */
       4                 :            : 
       5                 :            : #ifndef _I40E_ETHDEV_H_
       6                 :            : #define _I40E_ETHDEV_H_
       7                 :            : 
       8                 :            : #include <stdint.h>
       9                 :            : #include <sys/queue.h>
      10                 :            : 
      11                 :            : #include <rte_time.h>
      12                 :            : #include <rte_kvargs.h>
      13                 :            : #include <rte_hash.h>
      14                 :            : #include <rte_flow.h>
      15                 :            : #include <rte_flow_driver.h>
      16                 :            : #include <rte_tm_driver.h>
      17                 :            : #include "rte_pmd_i40e.h"
      18                 :            : 
      19                 :            : #include "base/i40e_register.h"
      20                 :            : #include "base/i40e_type.h"
      21                 :            : #include "base/virtchnl.h"
      22                 :            : 
      23                 :            : #define I40E_AQ_LEN               32
      24                 :            : #define I40E_AQ_BUF_SZ            4096
      25                 :            : /* Number of queues per TC should be one of 1, 2, 4, 8, 16, 32, 64 */
      26                 :            : #define I40E_MAX_Q_PER_TC         64
      27                 :            : #define I40E_NUM_DESC_DEFAULT     512
      28                 :            : #define I40E_NUM_DESC_ALIGN       32
      29                 :            : #define I40E_BUF_SIZE_MIN         1024
      30                 :            : #define I40E_FRAME_SIZE_MAX       9728
      31                 :            : #define I40E_TSO_FRAME_SIZE_MAX   262144
      32                 :            : #define I40E_QUEUE_BASE_ADDR_UNIT 128
      33                 :            : /* number of VSIs and queue default setting */
      34                 :            : #define I40E_MAX_QP_NUM_PER_VF    16
      35                 :            : #define I40E_DEFAULT_QP_NUM_FDIR  1
      36                 :            : #define I40E_UINT32_BIT_SIZE      (CHAR_BIT * sizeof(uint32_t))
      37                 :            : #define I40E_VFTA_SIZE            (4096 / I40E_UINT32_BIT_SIZE)
      38                 :            : /* Maximun number of MAC addresses */
      39                 :            : #define I40E_NUM_MACADDR_MAX       64
      40                 :            : /* Maximum number of VFs */
      41                 :            : #define I40E_MAX_VF               128
      42                 :            : /*flag of no loopback*/
      43                 :            : #define I40E_AQ_LB_MODE_NONE      0x0
      44                 :            : #define I40E_AQ_LB_MODE_EN        0x01
      45                 :            : #define I40E_AQ_LB_MAC            0x01
      46                 :            : #define I40E_AQ_LB_MAC_LOCAL_X722 0x04
      47                 :            : /*
      48                 :            :  * vlan_id is a 12 bit number.
      49                 :            :  * The VFTA array is actually a 4096 bit array, 128 of 32bit elements.
      50                 :            :  * 2^5 = 32. The val of lower 5 bits specifies the bit in the 32bit element.
      51                 :            :  * The higher 7 bit val specifies VFTA array index.
      52                 :            :  */
      53                 :            : #define I40E_VFTA_BIT(vlan_id)    (1 << ((vlan_id) & 0x1F))
      54                 :            : #define I40E_VFTA_IDX(vlan_id)    ((vlan_id) >> 5)
      55                 :            : 
      56                 :            : /* Default TC traffic in case DCB is not enabled */
      57                 :            : #define I40E_DEFAULT_TCMAP        0x1
      58                 :            : #define I40E_FDIR_QUEUE_ID        0
      59                 :            : 
      60                 :            : /* Always assign pool 0 to main VSI, VMDQ will start from 1 */
      61                 :            : #define I40E_VMDQ_POOL_BASE       1
      62                 :            : 
      63                 :            : #define I40E_DEFAULT_RX_FREE_THRESH  32
      64                 :            : #define I40E_DEFAULT_RX_PTHRESH      8
      65                 :            : #define I40E_DEFAULT_RX_HTHRESH      8
      66                 :            : #define I40E_DEFAULT_RX_WTHRESH      0
      67                 :            : 
      68                 :            : #define I40E_DEFAULT_TX_FREE_THRESH  32
      69                 :            : #define I40E_DEFAULT_TX_PTHRESH      32
      70                 :            : #define I40E_DEFAULT_TX_HTHRESH      0
      71                 :            : #define I40E_DEFAULT_TX_WTHRESH      0
      72                 :            : #define I40E_DEFAULT_TX_RSBIT_THRESH 32
      73                 :            : 
      74                 :            : /* Bit shift and mask */
      75                 :            : #define I40E_4_BIT_WIDTH  (CHAR_BIT / 2)
      76                 :            : #define I40E_4_BIT_MASK   RTE_LEN2MASK(I40E_4_BIT_WIDTH, uint8_t)
      77                 :            : #define I40E_8_BIT_WIDTH  CHAR_BIT
      78                 :            : #define I40E_8_BIT_MASK   UINT8_MAX
      79                 :            : #define I40E_16_BIT_WIDTH (CHAR_BIT * 2)
      80                 :            : #define I40E_16_BIT_MASK  UINT16_MAX
      81                 :            : #define I40E_32_BIT_WIDTH (CHAR_BIT * 4)
      82                 :            : #define I40E_32_BIT_MASK  UINT32_MAX
      83                 :            : #define I40E_48_BIT_WIDTH (CHAR_BIT * 6)
      84                 :            : #define I40E_48_BIT_MASK  RTE_LEN2MASK(I40E_48_BIT_WIDTH, uint64_t)
      85                 :            : 
      86                 :            : /* Linux PF host with virtchnl version 1.1 */
      87                 :            : #define PF_IS_V11(vf) \
      88                 :            :         (((vf)->version_major == VIRTCHNL_VERSION_MAJOR) && \
      89                 :            :         ((vf)->version_minor == 1))
      90                 :            : 
      91                 :            : #define I40E_WRITE_GLB_REG(hw, reg, value)                              \
      92                 :            :         do {                                                            \
      93                 :            :                 uint32_t ori_val;                                       \
      94                 :            :                 struct rte_eth_dev *dev;                                \
      95                 :            :                 struct rte_eth_dev_data *dev_data;                      \
      96                 :            :                 ori_val = I40E_READ_REG((hw), (reg));                   \
      97                 :            :                 dev_data = ((struct i40e_adapter *)hw->back)->pf.dev_data; \
      98                 :            :                 dev = &rte_eth_devices[dev_data->port_id];               \
      99                 :            :                 I40E_PCI_REG_WRITE(I40E_PCI_REG_ADDR((hw),              \
     100                 :            :                                                      (reg)), (value));  \
     101                 :            :                 if (ori_val != value)                                   \
     102                 :            :                         PMD_DRV_LOG(WARNING,                            \
     103                 :            :                                     "i40e device %s changed global "  \
     104                 :            :                                     "register [0x%08x]. original: 0x%08x, " \
     105                 :            :                                     "new: 0x%08x ",                   \
     106                 :            :                                     (dev->device->name), (reg),           \
     107                 :            :                                     (ori_val), (value));                \
     108                 :            :         } while (0)
     109                 :            : 
     110                 :            : /* index flex payload per layer */
     111                 :            : enum i40e_flxpld_layer_idx {
     112                 :            :         I40E_FLXPLD_L2_IDX    = 0,
     113                 :            :         I40E_FLXPLD_L3_IDX    = 1,
     114                 :            :         I40E_FLXPLD_L4_IDX    = 2,
     115                 :            :         I40E_MAX_FLXPLD_LAYER = 3,
     116                 :            : };
     117                 :            : #define I40E_MAX_FLXPLD_FIED        3  /* max number of flex payload fields */
     118                 :            : #define I40E_FDIR_BITMASK_NUM_WORD  2  /* max number of bitmask words */
     119                 :            : #define I40E_FDIR_MAX_FLEXWORD_NUM  8  /* max number of flexpayload words */
     120                 :            : #define I40E_FDIR_MAX_FLEX_LEN      16 /* len in bytes of flex payload */
     121                 :            : #define I40E_INSET_MASK_NUM_REG     2  /* number of input set mask registers */
     122                 :            : 
     123                 :            : /* i40e flags */
     124                 :            : #define I40E_FLAG_RSS                   (1ULL << 0)
     125                 :            : #define I40E_FLAG_DCB                   (1ULL << 1)
     126                 :            : #define I40E_FLAG_VMDQ                  (1ULL << 2)
     127                 :            : #define I40E_FLAG_SRIOV                 (1ULL << 3)
     128                 :            : #define I40E_FLAG_HEADER_SPLIT_DISABLED (1ULL << 4)
     129                 :            : #define I40E_FLAG_HEADER_SPLIT_ENABLED  (1ULL << 5)
     130                 :            : #define I40E_FLAG_FDIR                  (1ULL << 6)
     131                 :            : #define I40E_FLAG_VXLAN                 (1ULL << 7)
     132                 :            : #define I40E_FLAG_RSS_AQ_CAPABLE        (1ULL << 8)
     133                 :            : #define I40E_FLAG_ALL (I40E_FLAG_RSS | \
     134                 :            :                        I40E_FLAG_DCB | \
     135                 :            :                        I40E_FLAG_VMDQ | \
     136                 :            :                        I40E_FLAG_SRIOV | \
     137                 :            :                        I40E_FLAG_HEADER_SPLIT_DISABLED | \
     138                 :            :                        I40E_FLAG_HEADER_SPLIT_ENABLED | \
     139                 :            :                        I40E_FLAG_FDIR | \
     140                 :            :                        I40E_FLAG_VXLAN | \
     141                 :            :                        I40E_FLAG_RSS_AQ_CAPABLE)
     142                 :            : 
     143                 :            : #define I40E_RSS_OFFLOAD_ALL ( \
     144                 :            :         RTE_ETH_RSS_FRAG_IPV4 | \
     145                 :            :         RTE_ETH_RSS_NONFRAG_IPV4_TCP | \
     146                 :            :         RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
     147                 :            :         RTE_ETH_RSS_NONFRAG_IPV4_SCTP | \
     148                 :            :         RTE_ETH_RSS_NONFRAG_IPV4_OTHER | \
     149                 :            :         RTE_ETH_RSS_FRAG_IPV6 | \
     150                 :            :         RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
     151                 :            :         RTE_ETH_RSS_NONFRAG_IPV6_UDP | \
     152                 :            :         RTE_ETH_RSS_NONFRAG_IPV6_SCTP | \
     153                 :            :         RTE_ETH_RSS_NONFRAG_IPV6_OTHER | \
     154                 :            :         RTE_ETH_RSS_L2_PAYLOAD)
     155                 :            : 
     156                 :            : /* All bits of RSS hash enable for X722*/
     157                 :            : #define I40E_RSS_HENA_ALL_X722 ( \
     158                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP) | \
     159                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP) | \
     160                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK) | \
     161                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP) | \
     162                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP) | \
     163                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK) | \
     164                 :            :         I40E_RSS_HENA_ALL)
     165                 :            : 
     166                 :            : /* All bits of RSS hash enable */
     167                 :            : #define I40E_RSS_HENA_ALL ( \
     168                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_UDP) | \
     169                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_TCP) | \
     170                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_SCTP) | \
     171                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER) | \
     172                 :            :         (1ULL << I40E_FILTER_PCTYPE_FRAG_IPV4) | \
     173                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_UDP) | \
     174                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_TCP) | \
     175                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP) | \
     176                 :            :         (1ULL << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER) | \
     177                 :            :         (1ULL << I40E_FILTER_PCTYPE_FRAG_IPV6) | \
     178                 :            :         (1ULL << I40E_FILTER_PCTYPE_FCOE_OX) | \
     179                 :            :         (1ULL << I40E_FILTER_PCTYPE_FCOE_RX) | \
     180                 :            :         (1ULL << I40E_FILTER_PCTYPE_FCOE_OTHER) | \
     181                 :            :         (1ULL << I40E_FILTER_PCTYPE_L2_PAYLOAD))
     182                 :            : 
     183                 :            : #define I40E_MISC_VEC_ID                RTE_INTR_VEC_ZERO_OFFSET
     184                 :            : #define I40E_RX_VEC_START               RTE_INTR_VEC_RXTX_OFFSET
     185                 :            : 
     186                 :            : /* Default queue interrupt throttling time in microseconds */
     187                 :            : #define I40E_ITR_INDEX_DEFAULT          0
     188                 :            : #define I40E_ITR_INDEX_NONE             3
     189                 :            : #define I40E_QUEUE_ITR_INTERVAL_DEFAULT 32 /* 32 us */
     190                 :            : #define I40E_QUEUE_ITR_INTERVAL_MAX     8160 /* 8160 us */
     191                 :            : #define I40E_VF_QUEUE_ITR_INTERVAL_DEFAULT 32 /* 32 us */
     192                 :            : /* Special FW support this floating VEB feature */
     193                 :            : #define FLOATING_VEB_SUPPORTED_FW_MAJ 5
     194                 :            : #define FLOATING_VEB_SUPPORTED_FW_MIN 0
     195                 :            : 
     196                 :            : #define I40E_GL_SWT_L2TAGCTRL(_i)             (0x001C0A70 + ((_i) * 4))
     197                 :            : #define I40E_GL_SWT_L2TAGCTRL_ETHERTYPE_SHIFT 16
     198                 :            : #define I40E_GL_SWT_L2TAGCTRL_ETHERTYPE_MASK  \
     199                 :            :         I40E_MASK(0xFFFF, I40E_GL_SWT_L2TAGCTRL_ETHERTYPE_SHIFT)
     200                 :            : 
     201                 :            : #define I40E_RSS_TYPE_NONE           0ULL
     202                 :            : #define I40E_RSS_TYPE_INVALID        1ULL
     203                 :            : 
     204                 :            : #define I40E_INSET_NONE            0x00000000000000000ULL
     205                 :            : 
     206                 :            : /* bit0 ~ bit 7 */
     207                 :            : #define I40E_INSET_DMAC            0x0000000000000001ULL
     208                 :            : #define I40E_INSET_SMAC            0x0000000000000002ULL
     209                 :            : #define I40E_INSET_VLAN_OUTER      0x0000000000000004ULL
     210                 :            : #define I40E_INSET_VLAN_INNER      0x0000000000000008ULL
     211                 :            : #define I40E_INSET_VLAN_TUNNEL     0x0000000000000010ULL
     212                 :            : 
     213                 :            : /* bit 8 ~ bit 15 */
     214                 :            : #define I40E_INSET_IPV4_SRC        0x0000000000000100ULL
     215                 :            : #define I40E_INSET_IPV4_DST        0x0000000000000200ULL
     216                 :            : #define I40E_INSET_IPV6_SRC        0x0000000000000400ULL
     217                 :            : #define I40E_INSET_IPV6_DST        0x0000000000000800ULL
     218                 :            : #define I40E_INSET_SRC_PORT        0x0000000000001000ULL
     219                 :            : #define I40E_INSET_DST_PORT        0x0000000000002000ULL
     220                 :            : #define I40E_INSET_SCTP_VT         0x0000000000004000ULL
     221                 :            : 
     222                 :            : /* bit 16 ~ bit 31 */
     223                 :            : #define I40E_INSET_IPV4_TOS        0x0000000000010000ULL
     224                 :            : #define I40E_INSET_IPV4_PROTO      0x0000000000020000ULL
     225                 :            : #define I40E_INSET_IPV4_TTL        0x0000000000040000ULL
     226                 :            : #define I40E_INSET_IPV6_TC         0x0000000000080000ULL
     227                 :            : #define I40E_INSET_IPV6_FLOW       0x0000000000100000ULL
     228                 :            : #define I40E_INSET_IPV6_NEXT_HDR   0x0000000000200000ULL
     229                 :            : #define I40E_INSET_IPV6_HOP_LIMIT  0x0000000000400000ULL
     230                 :            : #define I40E_INSET_TCP_FLAGS       0x0000000000800000ULL
     231                 :            : 
     232                 :            : /* bit 32 ~ bit 47, tunnel fields */
     233                 :            : #define I40E_INSET_TUNNEL_IPV4_DST       0x0000000100000000ULL
     234                 :            : #define I40E_INSET_TUNNEL_IPV6_DST       0x0000000200000000ULL
     235                 :            : #define I40E_INSET_TUNNEL_DMAC           0x0000000400000000ULL
     236                 :            : #define I40E_INSET_TUNNEL_SRC_PORT       0x0000000800000000ULL
     237                 :            : #define I40E_INSET_TUNNEL_DST_PORT       0x0000001000000000ULL
     238                 :            : #define I40E_INSET_TUNNEL_ID             0x0000002000000000ULL
     239                 :            : 
     240                 :            : /* bit 48 ~ bit 55 */
     241                 :            : #define I40E_INSET_LAST_ETHER_TYPE 0x0001000000000000ULL
     242                 :            : 
     243                 :            : /* bit 56 ~ bit 63, Flex Payload */
     244                 :            : #define I40E_INSET_FLEX_PAYLOAD_W1 0x0100000000000000ULL
     245                 :            : #define I40E_INSET_FLEX_PAYLOAD_W2 0x0200000000000000ULL
     246                 :            : #define I40E_INSET_FLEX_PAYLOAD_W3 0x0400000000000000ULL
     247                 :            : #define I40E_INSET_FLEX_PAYLOAD_W4 0x0800000000000000ULL
     248                 :            : #define I40E_INSET_FLEX_PAYLOAD_W5 0x1000000000000000ULL
     249                 :            : #define I40E_INSET_FLEX_PAYLOAD_W6 0x2000000000000000ULL
     250                 :            : #define I40E_INSET_FLEX_PAYLOAD_W7 0x4000000000000000ULL
     251                 :            : #define I40E_INSET_FLEX_PAYLOAD_W8 0x8000000000000000ULL
     252                 :            : #define I40E_INSET_FLEX_PAYLOAD \
     253                 :            :         (I40E_INSET_FLEX_PAYLOAD_W1 | I40E_INSET_FLEX_PAYLOAD_W2 | \
     254                 :            :         I40E_INSET_FLEX_PAYLOAD_W3 | I40E_INSET_FLEX_PAYLOAD_W4 | \
     255                 :            :         I40E_INSET_FLEX_PAYLOAD_W5 | I40E_INSET_FLEX_PAYLOAD_W6 | \
     256                 :            :         I40E_INSET_FLEX_PAYLOAD_W7 | I40E_INSET_FLEX_PAYLOAD_W8)
     257                 :            : 
     258                 :            : /* The max bandwidth of i40e is 40Gbps. */
     259                 :            : #define I40E_QOS_BW_MAX 40000
     260                 :            : /* The bandwidth should be the multiple of 50Mbps. */
     261                 :            : #define I40E_QOS_BW_GRANULARITY 50
     262                 :            : /* The min bandwidth weight is 1. */
     263                 :            : #define I40E_QOS_BW_WEIGHT_MIN 1
     264                 :            : /* The max bandwidth weight is 127. */
     265                 :            : #define I40E_QOS_BW_WEIGHT_MAX 127
     266                 :            : /* The max queue region index is 7. */
     267                 :            : #define I40E_REGION_MAX_INDEX 7
     268                 :            : 
     269                 :            : #define I40E_MAX_PERCENT            100
     270                 :            : #define I40E_DEFAULT_DCB_APP_NUM    1
     271                 :            : #define I40E_DEFAULT_DCB_APP_PRIO   3
     272                 :            : 
     273                 :            : #define I40E_FDIR_PRG_PKT_CNT       128
     274                 :            : #define I40E_FDIR_ID_BIT_SHIFT      13
     275                 :            : 
     276                 :            : /*
     277                 :            :  * Struct to store flow created.
     278                 :            :  */
     279                 :            : struct rte_flow {
     280                 :            :         TAILQ_ENTRY(rte_flow) node;
     281                 :            :         enum rte_filter_type filter_type;
     282                 :            :         void *rule;
     283                 :            : };
     284                 :            : 
     285                 :            : /**
     286                 :            :  * The overhead from MTU to max frame size.
     287                 :            :  * Considering QinQ packet, the VLAN tag needs to be counted twice.
     288                 :            :  */
     289                 :            : #define I40E_ETH_OVERHEAD \
     290                 :            :         (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN + RTE_VLAN_HLEN * 2)
     291                 :            : #define I40E_ETH_MAX_LEN (RTE_ETHER_MTU + I40E_ETH_OVERHEAD)
     292                 :            : 
     293                 :            : #define I40E_RXTX_BYTES_H_16_BIT(bytes) ((bytes) & ~I40E_48_BIT_MASK)
     294                 :            : #define I40E_RXTX_BYTES_L_48_BIT(bytes) ((bytes) & I40E_48_BIT_MASK)
     295                 :            : 
     296                 :            : struct i40e_adapter;
     297                 :            : struct rte_pci_driver;
     298                 :            : 
     299                 :            : /**
     300                 :            :  * MAC filter type
     301                 :            :  */
     302                 :            : enum i40e_mac_filter_type {
     303                 :            :         I40E_MAC_PERFECT_MATCH = 1, /**< exact match of MAC addr. */
     304                 :            :         I40E_MACVLAN_PERFECT_MATCH, /**< exact match of MAC addr and VLAN ID. */
     305                 :            :         I40E_MAC_HASH_MATCH, /**< hash match of MAC addr. */
     306                 :            :         /** hash match of MAC addr and exact match of VLAN ID. */
     307                 :            :         I40E_MACVLAN_HASH_MATCH,
     308                 :            : };
     309                 :            : 
     310                 :            : /**
     311                 :            :  * MAC filter structure
     312                 :            :  */
     313                 :            : struct i40e_mac_filter_info {
     314                 :            :         enum i40e_mac_filter_type filter_type;
     315                 :            :         struct rte_ether_addr mac_addr;
     316                 :            : };
     317                 :            : 
     318                 :            : TAILQ_HEAD(i40e_mac_filter_list, i40e_mac_filter);
     319                 :            : 
     320                 :            : /* MAC filter list structure */
     321                 :            : struct i40e_mac_filter {
     322                 :            :         TAILQ_ENTRY(i40e_mac_filter) next;
     323                 :            :         struct i40e_mac_filter_info mac_info;
     324                 :            : };
     325                 :            : 
     326                 :            : TAILQ_HEAD(i40e_vsi_list_head, i40e_vsi_list);
     327                 :            : 
     328                 :            : struct i40e_vsi;
     329                 :            : 
     330                 :            : /* VSI list structure */
     331                 :            : struct i40e_vsi_list {
     332                 :            :         TAILQ_ENTRY(i40e_vsi_list) list;
     333                 :            :         struct i40e_vsi *vsi;
     334                 :            : };
     335                 :            : 
     336                 :            : struct i40e_rx_queue;
     337                 :            : struct i40e_tx_queue;
     338                 :            : 
     339                 :            : /* Bandwidth limit information */
     340                 :            : struct i40e_bw_info {
     341                 :            :         uint16_t bw_limit;      /* BW Limit (0 = disabled) */
     342                 :            :         uint8_t  bw_max;        /* Max BW limit if enabled */
     343                 :            : 
     344                 :            :         /* Relative credits within same TC with respect to other VSIs or Comps */
     345                 :            :         uint8_t  bw_ets_share_credits[I40E_MAX_TRAFFIC_CLASS];
     346                 :            :         /* Bandwidth limit per TC */
     347                 :            :         uint16_t bw_ets_credits[I40E_MAX_TRAFFIC_CLASS];
     348                 :            :         /* Max bandwidth limit per TC */
     349                 :            :         uint8_t  bw_ets_max[I40E_MAX_TRAFFIC_CLASS];
     350                 :            : };
     351                 :            : 
     352                 :            : /* Structure that defines a VEB */
     353                 :            : struct i40e_veb {
     354                 :            :         struct i40e_vsi_list_head head;
     355                 :            :         struct i40e_vsi *associate_vsi; /* Associate VSI who owns the VEB */
     356                 :            :         struct i40e_pf *associate_pf; /* Associate PF who owns the VEB */
     357                 :            :         uint16_t seid; /* The seid of VEB itself */
     358                 :            :         uint16_t uplink_seid; /* The uplink seid of this VEB */
     359                 :            :         uint16_t stats_idx;
     360                 :            :         struct i40e_eth_stats stats;
     361                 :            :         uint8_t enabled_tc;   /* The traffic class enabled */
     362                 :            :         uint8_t strict_prio_tc; /* bit map of TCs set to strict priority mode */
     363                 :            :         struct i40e_bw_info bw_info; /* VEB bandwidth information */
     364                 :            : };
     365                 :            : 
     366                 :            : /* i40e MACVLAN filter structure */
     367                 :            : struct i40e_macvlan_filter {
     368                 :            :         struct rte_ether_addr macaddr;
     369                 :            :         enum i40e_mac_filter_type filter_type;
     370                 :            :         uint16_t vlan_id;
     371                 :            : };
     372                 :            : 
     373                 :            : /*
     374                 :            :  * Structure that defines a VSI, associated with a adapter.
     375                 :            :  */
     376                 :            : struct i40e_vsi {
     377                 :            :         struct i40e_adapter *adapter; /* Backreference to associated adapter */
     378                 :            :         struct i40e_aqc_vsi_properties_data info; /* VSI properties */
     379                 :            : 
     380                 :            :         struct i40e_eth_stats eth_stats_offset;
     381                 :            :         struct i40e_eth_stats eth_stats;
     382                 :            :         /*
     383                 :            :          * When drivers loaded, only a default main VSI exists. In case new VSI
     384                 :            :          * needs to add, HW needs to know the layout that VSIs are organized.
     385                 :            :          * Besides that, VSI isan element and can't switch packets, which needs
     386                 :            :          * to add new component VEB to perform switching. So, a new VSI needs
     387                 :            :          * to specify the uplink VSI (Parent VSI) before created. The
     388                 :            :          * uplink VSI will check whether it had a VEB to switch packets. If no,
     389                 :            :          * it will try to create one. Then, uplink VSI will move the new VSI
     390                 :            :          * into its' sib_vsi_list to manage all the downlink VSI.
     391                 :            :          *  sib_vsi_list: the VSI list that shared the same uplink VSI.
     392                 :            :          *  parent_vsi  : the uplink VSI. It's NULL for main VSI.
     393                 :            :          *  veb         : the VEB associates with the VSI.
     394                 :            :          */
     395                 :            :         struct i40e_vsi_list sib_vsi_list; /* sibling vsi list */
     396                 :            :         struct i40e_vsi *parent_vsi;
     397                 :            :         struct i40e_veb *veb;    /* Associated veb, could be null */
     398                 :            :         struct i40e_veb *floating_veb; /* Associated floating veb */
     399                 :            :         bool offset_loaded;
     400                 :            :         enum i40e_vsi_type type; /* VSI types */
     401                 :            :         uint16_t vlan_num;       /* Total VLAN number */
     402                 :            :         uint16_t mac_num;        /* Total mac number */
     403                 :            :         uint32_t vfta[I40E_VFTA_SIZE];        /* VLAN bitmap */
     404                 :            :         struct i40e_mac_filter_list mac_list; /* macvlan filter list */
     405                 :            :         /* specific VSI-defined parameters, SRIOV stored the vf_id */
     406                 :            :         uint32_t user_param;
     407                 :            :         uint16_t seid;           /* The seid of VSI itself */
     408                 :            :         uint16_t uplink_seid;    /* The uplink seid of this VSI */
     409                 :            :         uint16_t nb_qps;         /* Number of queue pairs VSI can occupy */
     410                 :            :         uint16_t nb_used_qps;    /* Number of queue pairs VSI uses */
     411                 :            :         uint16_t max_macaddrs;   /* Maximum number of MAC addresses */
     412                 :            :         uint16_t base_queue;     /* The first queue index of this VSI */
     413                 :            :         /*
     414                 :            :          * The offset to visit VSI related register, assigned by HW when
     415                 :            :          * creating VSI
     416                 :            :          */
     417                 :            :         uint16_t vsi_id;
     418                 :            :         uint16_t msix_intr; /* The MSIX interrupt binds to VSI */
     419                 :            :         uint16_t nb_msix;   /* The max number of msix vector */
     420                 :            :         uint8_t enabled_tc; /* The traffic class enabled */
     421                 :            :         uint8_t vlan_anti_spoof_on; /* The VLAN anti-spoofing enabled */
     422                 :            :         uint8_t vlan_filter_on; /* The VLAN filter enabled */
     423                 :            :         struct i40e_bw_info bw_info; /* VSI bandwidth information */
     424                 :            :         uint64_t prev_rx_bytes;
     425                 :            :         uint64_t prev_tx_bytes;
     426                 :            : };
     427                 :            : 
     428                 :            : struct pool_entry {
     429                 :            :         LIST_ENTRY(pool_entry) next;
     430                 :            :         uint16_t base;
     431                 :            :         uint16_t len;
     432                 :            : };
     433                 :            : 
     434                 :            : LIST_HEAD(res_list, pool_entry);
     435                 :            : 
     436                 :            : struct i40e_res_pool_info {
     437                 :            :         uint32_t base;              /* Resource start index */
     438                 :            :         uint32_t num_alloc;         /* Allocated resource number */
     439                 :            :         uint32_t num_free;          /* Total available resource number */
     440                 :            :         struct res_list alloc_list; /* Allocated resource list */
     441                 :            :         struct res_list free_list;  /* Available resource list */
     442                 :            : };
     443                 :            : 
     444                 :            : enum I40E_VF_STATE {
     445                 :            :         I40E_VF_INACTIVE = 0,
     446                 :            :         I40E_VF_INRESET,
     447                 :            :         I40E_VF_ININIT,
     448                 :            :         I40E_VF_ACTIVE,
     449                 :            : };
     450                 :            : 
     451                 :            : /*
     452                 :            :  * Structure to store private data for PF host.
     453                 :            :  */
     454                 :            : struct i40e_pf_vf {
     455                 :            :         struct i40e_pf *pf;
     456                 :            :         struct i40e_vsi *vsi;
     457                 :            :         enum I40E_VF_STATE state; /* The number of queue pairs available */
     458                 :            :         uint16_t vf_idx; /* VF index in pf->vfs */
     459                 :            :         uint16_t lan_nb_qps; /* Actual queues allocated */
     460                 :            :         uint16_t reset_cnt; /* Total vf reset times */
     461                 :            :         struct rte_ether_addr mac_addr;  /* Default MAC address */
     462                 :            :         /* version of the virtchnl from VF */
     463                 :            :         struct virtchnl_version_info version;
     464                 :            :         uint32_t request_caps; /* offload caps requested from VF */
     465                 :            :         uint64_t num_mdd_events; /* num of mdd events detected */
     466                 :            : 
     467                 :            :         /*
     468                 :            :          * Variables for store the arrival timestamp of VF messages.
     469                 :            :          * If the timestamp of latest message stored at
     470                 :            :          * `msg_timestamps[index % max]` then the timestamp of
     471                 :            :          * earliest message stored at `msg_time[(index + 1) % max]`.
     472                 :            :          * When a new message come, the timestamp of this message
     473                 :            :          * will be stored at `msg_timestamps[(index + 1) % max]` and the
     474                 :            :          * earliest message timestamp is at
     475                 :            :          * `msg_timestamps[(index + 2) % max]` now...
     476                 :            :          */
     477                 :            :         uint32_t msg_index;
     478                 :            :         uint64_t *msg_timestamps;
     479                 :            : 
     480                 :            :         /* cycle of stop ignoring VF message */
     481                 :            :         uint64_t ignore_end_cycle;
     482                 :            : };
     483                 :            : 
     484                 :            : /*
     485                 :            :  * Structure to store private data for flow control.
     486                 :            :  */
     487                 :            : struct i40e_fc_conf {
     488                 :            :         uint16_t pause_time; /* Flow control pause timer */
     489                 :            :         /* FC high water 0-7 for pfc and 8 for lfc unit:kilobytes */
     490                 :            :         uint32_t high_water[I40E_MAX_TRAFFIC_CLASS + 1];
     491                 :            :         /* FC low water  0-7 for pfc and 8 for lfc unit:kilobytes */
     492                 :            :         uint32_t low_water[I40E_MAX_TRAFFIC_CLASS + 1];
     493                 :            : };
     494                 :            : 
     495                 :            : /*
     496                 :            :  * Structure to store private data for VMDQ instance
     497                 :            :  */
     498                 :            : struct i40e_vmdq_info {
     499                 :            :         struct i40e_pf *pf;
     500                 :            :         struct i40e_vsi *vsi;
     501                 :            : };
     502                 :            : 
     503                 :            : #define I40E_FDIR_MAX_FLEXLEN      16  /**< Max length of flexbytes. */
     504                 :            : #define I40E_MAX_FLX_SOURCE_OFF    480
     505                 :            : #define NONUSE_FLX_PIT_DEST_OFF 63
     506                 :            : #define NONUSE_FLX_PIT_FSIZE    1
     507                 :            : #define I40E_FLX_OFFSET_IN_FIELD_VECTOR   50
     508                 :            : #define MK_FLX_PIT(src_offset, fsize, dst_offset) ( \
     509                 :            :         (((src_offset) << I40E_PRTQF_FLX_PIT_SOURCE_OFF_SHIFT) & \
     510                 :            :                 I40E_PRTQF_FLX_PIT_SOURCE_OFF_MASK) | \
     511                 :            :         (((fsize) << I40E_PRTQF_FLX_PIT_FSIZE_SHIFT) & \
     512                 :            :                         I40E_PRTQF_FLX_PIT_FSIZE_MASK) | \
     513                 :            :         ((((dst_offset) == NONUSE_FLX_PIT_DEST_OFF ? \
     514                 :            :                         NONUSE_FLX_PIT_DEST_OFF : \
     515                 :            :                         ((dst_offset) + I40E_FLX_OFFSET_IN_FIELD_VECTOR)) << \
     516                 :            :                         I40E_PRTQF_FLX_PIT_DEST_OFF_SHIFT) & \
     517                 :            :                         I40E_PRTQF_FLX_PIT_DEST_OFF_MASK))
     518                 :            : #define I40E_WORD(hi, lo) (uint16_t)((((hi) << 8) & 0xFF00) | ((lo) & 0xFF))
     519                 :            : #define I40E_FLEX_WORD_MASK(off) (0x80 >> (off))
     520                 :            : #define I40E_FDIR_IPv6_TC_OFFSET        20
     521                 :            : 
     522                 :            : /* A structure used to define the input for GTP flow */
     523                 :            : struct i40e_gtp_flow {
     524                 :            :         struct rte_eth_udpv4_flow udp; /* IPv4 UDP fields to match. */
     525                 :            :         uint8_t msg_type;              /* Message type. */
     526                 :            :         uint32_t teid;                 /* TEID in big endian. */
     527                 :            : };
     528                 :            : 
     529                 :            : /* A structure used to define the input for GTP IPV4 flow */
     530                 :            : struct i40e_gtp_ipv4_flow {
     531                 :            :         struct i40e_gtp_flow gtp;
     532                 :            :         struct rte_eth_ipv4_flow ip4;
     533                 :            : };
     534                 :            : 
     535                 :            : /* A structure used to define the input for GTP IPV6 flow */
     536                 :            : struct i40e_gtp_ipv6_flow {
     537                 :            :         struct i40e_gtp_flow gtp;
     538                 :            :         struct rte_eth_ipv6_flow ip6;
     539                 :            : };
     540                 :            : 
     541                 :            : /* A structure used to define the input for ESP IPV4 flow */
     542                 :            : struct i40e_esp_ipv4_flow {
     543                 :            :         struct rte_eth_ipv4_flow ipv4;
     544                 :            :         uint32_t spi;   /* SPI in big endian. */
     545                 :            : };
     546                 :            : 
     547                 :            : /* A structure used to define the input for ESP IPV6 flow */
     548                 :            : struct i40e_esp_ipv6_flow {
     549                 :            :         struct rte_eth_ipv6_flow ipv6;
     550                 :            :         uint32_t spi;   /* SPI in big endian. */
     551                 :            : };
     552                 :            : /* A structure used to define the input for ESP IPV4 UDP flow */
     553                 :            : struct i40e_esp_ipv4_udp_flow {
     554                 :            :         struct rte_eth_udpv4_flow udp;
     555                 :            :         uint32_t spi;   /* SPI in big endian. */
     556                 :            : };
     557                 :            : 
     558                 :            : /* A structure used to define the input for ESP IPV6 UDP flow */
     559                 :            : struct i40e_esp_ipv6_udp_flow {
     560                 :            :         struct rte_eth_udpv6_flow udp;
     561                 :            :         uint32_t spi;   /* SPI in big endian. */
     562                 :            : };
     563                 :            : 
     564                 :            : /* A structure used to define the input for raw type flow */
     565                 :            : struct i40e_raw_flow {
     566                 :            :         uint16_t pctype;
     567                 :            :         void *packet;
     568                 :            :         uint32_t length;
     569                 :            : };
     570                 :            : 
     571                 :            : /* A structure used to define the input for L2TPv3 over IPv4 flow */
     572                 :            : struct i40e_ipv4_l2tpv3oip_flow {
     573                 :            :         struct rte_eth_ipv4_flow ip4;
     574                 :            :         uint32_t session_id; /* Session ID in big endian. */
     575                 :            : };
     576                 :            : 
     577                 :            : /* A structure used to define the input for L2TPv3 over IPv6 flow */
     578                 :            : struct i40e_ipv6_l2tpv3oip_flow {
     579                 :            :         struct rte_eth_ipv6_flow ip6;
     580                 :            :         uint32_t session_id; /* Session ID in big endian. */
     581                 :            : };
     582                 :            : 
     583                 :            : /* A structure used to define the input for l2 dst type flow */
     584                 :            : struct i40e_l2_flow {
     585                 :            :         struct rte_ether_addr dst;
     586                 :            :         struct rte_ether_addr src;
     587                 :            :         uint16_t ether_type;          /**< Ether type in big endian */
     588                 :            : };
     589                 :            : 
     590                 :            : /*
     591                 :            :  * A union contains the inputs for all types of flow
     592                 :            :  * items in flows need to be in big endian
     593                 :            :  */
     594                 :            : union i40e_fdir_flow {
     595                 :            :         struct i40e_l2_flow             l2_flow;
     596                 :            :         struct rte_eth_udpv4_flow       udp4_flow;
     597                 :            :         struct rte_eth_tcpv4_flow       tcp4_flow;
     598                 :            :         struct rte_eth_sctpv4_flow      sctp4_flow;
     599                 :            :         struct rte_eth_ipv4_flow        ip4_flow;
     600                 :            :         struct rte_eth_udpv6_flow       udp6_flow;
     601                 :            :         struct rte_eth_tcpv6_flow       tcp6_flow;
     602                 :            :         struct rte_eth_sctpv6_flow      sctp6_flow;
     603                 :            :         struct rte_eth_ipv6_flow        ipv6_flow;
     604                 :            :         struct i40e_gtp_flow            gtp_flow;
     605                 :            :         struct i40e_gtp_ipv4_flow       gtp_ipv4_flow;
     606                 :            :         struct i40e_gtp_ipv6_flow       gtp_ipv6_flow;
     607                 :            :         struct i40e_raw_flow            raw_flow;
     608                 :            :         struct i40e_ipv4_l2tpv3oip_flow ip4_l2tpv3oip_flow;
     609                 :            :         struct i40e_ipv6_l2tpv3oip_flow ip6_l2tpv3oip_flow;
     610                 :            :         struct i40e_esp_ipv4_flow       esp_ipv4_flow;
     611                 :            :         struct i40e_esp_ipv6_flow       esp_ipv6_flow;
     612                 :            :         struct i40e_esp_ipv4_udp_flow   esp_ipv4_udp_flow;
     613                 :            :         struct i40e_esp_ipv6_udp_flow   esp_ipv6_udp_flow;
     614                 :            : };
     615                 :            : 
     616                 :            : enum i40e_fdir_ip_type {
     617                 :            :         I40E_FDIR_IPTYPE_IPV4,
     618                 :            :         I40E_FDIR_IPTYPE_IPV6,
     619                 :            : };
     620                 :            : 
     621                 :            : /**
     622                 :            :  * Structure to store flex pit for flow diretor.
     623                 :            :  */
     624                 :            : struct i40e_fdir_flex_pit {
     625                 :            :         uint8_t src_offset; /* offset in words from the beginning of payload */
     626                 :            :         uint8_t size;       /* size in words */
     627                 :            :         uint8_t dst_offset; /* offset in words of flexible payload */
     628                 :            : };
     629                 :            : 
     630                 :            : /* A structure used to contain extend input of flow */
     631                 :            : struct i40e_fdir_flow_ext {
     632                 :            :         uint16_t vlan_tci;
     633                 :            :         uint8_t flexbytes[RTE_ETH_FDIR_MAX_FLEXLEN];
     634                 :            :         /* It is filled by the flexible payload to match. */
     635                 :            :         uint8_t flex_mask[I40E_FDIR_MAX_FLEX_LEN];
     636                 :            :         uint8_t raw_id;
     637                 :            :         uint8_t is_vf;   /* 1 for VF, 0 for port dev */
     638                 :            :         uint16_t dst_id; /* VF ID, available when is_vf is 1*/
     639                 :            :         uint64_t input_set;
     640                 :            :         bool inner_ip;   /* If there is inner ip */
     641                 :            :         enum i40e_fdir_ip_type iip_type; /* ip type for inner ip */
     642                 :            :         enum i40e_fdir_ip_type oip_type; /* ip type for outer ip */
     643                 :            :         bool customized_pctype; /* If customized pctype is used */
     644                 :            :         bool pkt_template; /* If raw packet template is used */
     645                 :            :         bool is_udp; /* ipv4|ipv6 udp flow */
     646                 :            :         enum i40e_flxpld_layer_idx layer_idx;
     647                 :            :         struct i40e_fdir_flex_pit flex_pit[I40E_MAX_FLXPLD_LAYER * I40E_MAX_FLXPLD_FIED];
     648                 :            :         bool is_flex_flow;
     649                 :            : };
     650                 :            : 
     651                 :            : /* A structure used to define the input for a flow director filter entry */
     652                 :            : struct i40e_fdir_input {
     653                 :            :         enum i40e_filter_pctype pctype;
     654                 :            :         union i40e_fdir_flow flow;
     655                 :            :         /* Flow fields to match, dependent on flow_type */
     656                 :            :         struct i40e_fdir_flow_ext flow_ext;
     657                 :            :         /* Additional fields to match */
     658                 :            : };
     659                 :            : 
     660                 :            : /* Behavior will be taken if FDIR match */
     661                 :            : enum i40e_fdir_behavior {
     662                 :            :         I40E_FDIR_ACCEPT = 0,
     663                 :            :         I40E_FDIR_REJECT,
     664                 :            :         I40E_FDIR_PASSTHRU,
     665                 :            : };
     666                 :            : 
     667                 :            : /* Flow director report status
     668                 :            :  * It defines what will be reported if FDIR entry is matched.
     669                 :            :  */
     670                 :            : enum i40e_fdir_status {
     671                 :            :         I40E_FDIR_NO_REPORT_STATUS = 0, /* Report nothing. */
     672                 :            :         I40E_FDIR_REPORT_ID,            /* Only report FD ID. */
     673                 :            :         I40E_FDIR_REPORT_ID_FLEX_4,     /* Report FD ID and 4 flex bytes. */
     674                 :            :         I40E_FDIR_REPORT_FLEX_8,        /* Report 8 flex bytes. */
     675                 :            : };
     676                 :            : 
     677                 :            : /* A structure used to define an action when match FDIR packet filter. */
     678                 :            : struct i40e_fdir_action {
     679                 :            :         uint16_t rx_queue;        /* Queue assigned to if FDIR match. */
     680                 :            :         enum i40e_fdir_behavior behavior;     /* Behavior will be taken */
     681                 :            :         enum i40e_fdir_status report_status;  /* Status report option */
     682                 :            :         /* If report_status is I40E_FDIR_REPORT_ID_FLEX_4 or
     683                 :            :          * I40E_FDIR_REPORT_FLEX_8, flex_off specifies where the reported
     684                 :            :          * flex bytes start from in flexible payload.
     685                 :            :          */
     686                 :            :         uint8_t flex_off;
     687                 :            : };
     688                 :            : 
     689                 :            : /* A structure used to define the flow director filter entry by filter_ctrl API
     690                 :            :  * It supports RTE_ETH_FILTER_FDIR data representation.
     691                 :            :  */
     692                 :            : struct i40e_fdir_filter_conf {
     693                 :            :         uint32_t soft_id;
     694                 :            :         /* ID, an unique value is required when deal with FDIR entry */
     695                 :            :         struct i40e_fdir_input input;    /* Input set */
     696                 :            :         struct i40e_fdir_action action;  /* Action taken when match */
     697                 :            : };
     698                 :            : 
     699                 :            : struct i40e_fdir_flex_mask {
     700                 :            :         uint8_t word_mask;  /**< Bit i enables word i of flexible payload */
     701                 :            :         uint8_t nb_bitmask;
     702                 :            :         struct {
     703                 :            :                 uint8_t offset;
     704                 :            :                 uint16_t mask;
     705                 :            :         } bitmask[I40E_FDIR_BITMASK_NUM_WORD];
     706                 :            : };
     707                 :            : 
     708                 :            : #define I40E_FILTER_PCTYPE_INVALID 0
     709                 :            : #define I40E_FILTER_PCTYPE_MAX     64
     710                 :            : #define I40E_MAX_FDIR_FILTER_NUM   (1024 * 8)
     711                 :            : 
     712                 :            : struct i40e_fdir_filter {
     713                 :            :         TAILQ_ENTRY(i40e_fdir_filter) rules;
     714                 :            :         struct i40e_fdir_filter_conf fdir;
     715                 :            : };
     716                 :            : 
     717                 :            : /* fdir memory pool entry */
     718                 :            : struct i40e_fdir_entry {
     719                 :            :         struct rte_flow flow;
     720                 :            :         uint32_t idx;
     721                 :            : };
     722                 :            : 
     723                 :            : /* pre-allocated fdir memory pool */
     724                 :            : struct i40e_fdir_flow_pool {
     725                 :            :         /* a bitmap to manage the fdir pool */
     726                 :            :         struct rte_bitmap *bitmap;
     727                 :            :         /* the size the pool is pf->fdir->fdir_space_size */
     728                 :            :         struct i40e_fdir_entry *pool;
     729                 :            : };
     730                 :            : 
     731                 :            : #define FLOW_TO_FLOW_BITMAP(f) \
     732                 :            :         container_of((f), struct i40e_fdir_entry, flow)
     733                 :            : 
     734                 :            : TAILQ_HEAD(i40e_fdir_filter_list, i40e_fdir_filter);
     735                 :            : /*
     736                 :            :  *  A structure used to define fields of a FDIR related info.
     737                 :            :  */
     738                 :            : struct i40e_fdir_info {
     739                 :            :         struct i40e_vsi *fdir_vsi;     /* pointer to fdir VSI structure */
     740                 :            :         uint16_t match_counter_index;  /* Statistic counter index used for fdir*/
     741                 :            :         struct i40e_tx_queue *txq;
     742                 :            :         struct i40e_rx_queue *rxq;
     743                 :            :         void *prg_pkt[I40E_FDIR_PRG_PKT_CNT];     /* memory for fdir program packet */
     744                 :            :         uint64_t dma_addr[I40E_FDIR_PRG_PKT_CNT]; /* physic address of packet memory*/
     745                 :            :         /*
     746                 :            :          * txq available buffer counter, indicates how many available buffers
     747                 :            :          * for fdir programming, initialized as I40E_FDIR_PRG_PKT_CNT
     748                 :            :          */
     749                 :            :         int txq_available_buf_count;
     750                 :            : 
     751                 :            :         /* input set bits for each pctype */
     752                 :            :         uint64_t input_set[I40E_FILTER_PCTYPE_MAX];
     753                 :            :         /*
     754                 :            :          * the rule how bytes stream is extracted as flexible payload
     755                 :            :          * for each payload layer, the setting can up to three elements
     756                 :            :          */
     757                 :            :         struct i40e_fdir_flex_pit flex_set[I40E_MAX_FLXPLD_LAYER * I40E_MAX_FLXPLD_FIED];
     758                 :            :         struct i40e_fdir_flex_mask flex_mask[I40E_FILTER_PCTYPE_MAX];
     759                 :            : 
     760                 :            :         struct i40e_fdir_filter_list fdir_list;
     761                 :            :         struct i40e_fdir_filter **hash_map;
     762                 :            :         struct rte_hash *hash_table;
     763                 :            :         /* An array to store the inserted rules input */
     764                 :            :         struct i40e_fdir_filter *fdir_filter_array;
     765                 :            : 
     766                 :            :         /*
     767                 :            :          * Priority ordering at filter invalidation(destroying a flow) between
     768                 :            :          * "best effort" space and "guaranteed" space.
     769                 :            :          *
     770                 :            :          * 0 = At filter invalidation, the hardware first tries to increment the
     771                 :            :          * "best effort" space. The "guaranteed" space is incremented only when
     772                 :            :          * the global "best effort" space is at it max value or the "best effort"
     773                 :            :          * space of the PF is at its max value.
     774                 :            :          * 1 = At filter invalidation, the hardware first tries to increment its
     775                 :            :          * "guaranteed" space. The "best effort" space is incremented only when
     776                 :            :          * it is already at its max value.
     777                 :            :          */
     778                 :            :         uint32_t fdir_invalprio;
     779                 :            :         /* the total size of the fdir, this number is the sum of the guaranteed +
     780                 :            :          * shared space
     781                 :            :          */
     782                 :            :         uint32_t fdir_space_size;
     783                 :            :         /* the actual number of the fdir rules in hardware, initialized as 0 */
     784                 :            :         uint32_t fdir_actual_cnt;
     785                 :            :         /* the free guaranteed space of the fdir */
     786                 :            :         uint32_t fdir_guarantee_free_space;
     787                 :            :         /* the fdir total guaranteed space */
     788                 :            :         uint32_t fdir_guarantee_total_space;
     789                 :            :         /* the pre-allocated pool of the rte_flow */
     790                 :            :         struct i40e_fdir_flow_pool fdir_flow_pool;
     791                 :            : 
     792                 :            :         /* Mark if flex pit and mask is set */
     793                 :            :         bool flex_pit_flag[I40E_MAX_FLXPLD_LAYER];
     794                 :            :         bool flex_mask_flag[I40E_FILTER_PCTYPE_MAX];
     795                 :            : 
     796                 :            :         uint32_t flow_count[I40E_FILTER_PCTYPE_MAX];
     797                 :            : 
     798                 :            :         uint32_t flex_flow_count[I40E_MAX_FLXPLD_LAYER];
     799                 :            : };
     800                 :            : 
     801                 :            : /* Ethertype filter number HW supports */
     802                 :            : #define I40E_MAX_ETHERTYPE_FILTER_NUM 768
     803                 :            : 
     804                 :            : /* Ethertype filter struct */
     805                 :            : struct i40e_ethertype_filter_input {
     806                 :            :         struct rte_ether_addr mac_addr;   /* Mac address to match */
     807                 :            :         uint16_t ether_type;          /* Ether type to match */
     808                 :            : };
     809                 :            : 
     810                 :            : struct i40e_ethertype_filter {
     811                 :            :         TAILQ_ENTRY(i40e_ethertype_filter) rules;
     812                 :            :         struct i40e_ethertype_filter_input input;
     813                 :            :         uint16_t flags;              /* Flags from RTE_ETHTYPE_FLAGS_* */
     814                 :            :         uint16_t queue;              /* Queue assigned to when match */
     815                 :            : };
     816                 :            : 
     817                 :            : TAILQ_HEAD(i40e_ethertype_filter_list, i40e_ethertype_filter);
     818                 :            : 
     819                 :            : struct i40e_ethertype_rule {
     820                 :            :         struct i40e_ethertype_filter_list ethertype_list;
     821                 :            :         struct i40e_ethertype_filter  **hash_map;
     822                 :            :         struct rte_hash *hash_table;
     823                 :            : };
     824                 :            : 
     825                 :            : /* queue region info */
     826                 :            : struct i40e_queue_region_info {
     827                 :            :         /* the region id for this configuration */
     828                 :            :         uint8_t region_id;
     829                 :            :         /* the start queue index for this region */
     830                 :            :         uint8_t queue_start_index;
     831                 :            :         /* the total queue number of this queue region */
     832                 :            :         uint8_t queue_num;
     833                 :            :         /* the total number of user priority for this region */
     834                 :            :         uint8_t user_priority_num;
     835                 :            :         /* the packet's user priority for this region */
     836                 :            :         uint8_t user_priority[I40E_MAX_USER_PRIORITY];
     837                 :            :         /* the total number of flowtype for this region */
     838                 :            :         uint8_t flowtype_num;
     839                 :            :         /**
     840                 :            :          * the pctype or hardware flowtype of packet,
     841                 :            :          * the specific index for each type has been defined
     842                 :            :          * in file i40e_type.h as enum i40e_filter_pctype.
     843                 :            :          */
     844                 :            :         uint8_t hw_flowtype[I40E_FILTER_PCTYPE_MAX];
     845                 :            : };
     846                 :            : 
     847                 :            : struct i40e_queue_regions {
     848                 :            :         /* the total number of queue region for this port */
     849                 :            :         uint16_t queue_region_number;
     850                 :            :         struct i40e_queue_region_info region[I40E_REGION_MAX_INDEX + 1];
     851                 :            : };
     852                 :            : 
     853                 :            : struct i40e_rss_pattern_info {
     854                 :            :         uint8_t action_flag;
     855                 :            :         uint64_t types;
     856                 :            : };
     857                 :            : 
     858                 :            : /* Tunnel filter number HW supports */
     859                 :            : #define I40E_MAX_TUNNEL_FILTER_NUM 400
     860                 :            : 
     861                 :            : #define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_TEID_WORD0 44
     862                 :            : #define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_TEID_WORD1 45
     863                 :            : #define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_SRC_PORT 29
     864                 :            : #define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_DST_PORT 30
     865                 :            : #define I40E_AQC_ADD_CLOUD_TNL_TYPE_MPLSOUDP    8
     866                 :            : #define I40E_AQC_ADD_CLOUD_TNL_TYPE_MPLSOGRE    9
     867                 :            : #define I40E_AQC_ADD_CLOUD_FILTER_0X10          0x10
     868                 :            : #define I40E_AQC_ADD_CLOUD_FILTER_0X11          0x11
     869                 :            : #define I40E_AQC_ADD_CLOUD_FILTER_0X12          0x12
     870                 :            : #define I40E_AQC_ADD_L1_FILTER_0X10             0x10
     871                 :            : #define I40E_AQC_ADD_L1_FILTER_0X11             0x11
     872                 :            : #define I40E_AQC_ADD_L1_FILTER_0X12             0x12
     873                 :            : #define I40E_AQC_ADD_L1_FILTER_0X13             0x13
     874                 :            : #define I40E_AQC_NEW_TR_21                      21
     875                 :            : #define I40E_AQC_NEW_TR_22                      22
     876                 :            : 
     877                 :            : enum i40e_tunnel_iptype {
     878                 :            :         I40E_TUNNEL_IPTYPE_IPV4,
     879                 :            :         I40E_TUNNEL_IPTYPE_IPV6,
     880                 :            : };
     881                 :            : 
     882                 :            : /* Tunnel filter struct */
     883                 :            : struct i40e_tunnel_filter_input {
     884                 :            :         uint8_t outer_mac[6];    /* Outer mac address to match */
     885                 :            :         uint8_t inner_mac[6];    /* Inner mac address to match */
     886                 :            :         uint16_t inner_vlan;     /* Inner vlan address to match */
     887                 :            :         enum i40e_tunnel_iptype ip_type;
     888                 :            :         uint16_t flags;          /* Filter type flag */
     889                 :            :         uint32_t tenant_id;      /* Tenant id to match */
     890                 :            :         uint16_t general_fields[32];  /* Big buffer */
     891                 :            : };
     892                 :            : 
     893                 :            : struct i40e_tunnel_filter {
     894                 :            :         TAILQ_ENTRY(i40e_tunnel_filter) rules;
     895                 :            :         struct i40e_tunnel_filter_input input;
     896                 :            :         uint8_t is_to_vf; /* 0 - to PF, 1 - to VF */
     897                 :            :         uint16_t vf_id;   /* VF id, available when is_to_vf is 1. */
     898                 :            :         uint16_t queue; /* Queue assigned to when match */
     899                 :            : };
     900                 :            : 
     901                 :            : TAILQ_HEAD(i40e_tunnel_filter_list, i40e_tunnel_filter);
     902                 :            : 
     903                 :            : struct i40e_tunnel_rule {
     904                 :            :         struct i40e_tunnel_filter_list tunnel_list;
     905                 :            :         struct i40e_tunnel_filter  **hash_map;
     906                 :            :         struct rte_hash *hash_table;
     907                 :            : };
     908                 :            : 
     909                 :            : /**
     910                 :            :  * Tunnel type.
     911                 :            :  */
     912                 :            : enum i40e_tunnel_type {
     913                 :            :         I40E_TUNNEL_TYPE_NONE = 0,
     914                 :            :         I40E_TUNNEL_TYPE_VXLAN,
     915                 :            :         I40E_TUNNEL_TYPE_GENEVE,
     916                 :            :         I40E_TUNNEL_TYPE_TEREDO,
     917                 :            :         I40E_TUNNEL_TYPE_NVGRE,
     918                 :            :         I40E_TUNNEL_TYPE_IP_IN_GRE,
     919                 :            :         I40E_L2_TUNNEL_TYPE_E_TAG,
     920                 :            :         I40E_TUNNEL_TYPE_MPLSoUDP,
     921                 :            :         I40E_TUNNEL_TYPE_MPLSoGRE,
     922                 :            :         I40E_TUNNEL_TYPE_QINQ,
     923                 :            :         I40E_TUNNEL_TYPE_GTPC,
     924                 :            :         I40E_TUNNEL_TYPE_GTPU,
     925                 :            :         I40E_TUNNEL_TYPE_ESPoUDP,
     926                 :            :         I40E_TUNNEL_TYPE_ESPoIP,
     927                 :            :         I40E_CLOUD_TYPE_UDP,
     928                 :            :         I40E_CLOUD_TYPE_TCP,
     929                 :            :         I40E_CLOUD_TYPE_SCTP,
     930                 :            :         I40E_TUNNEL_TYPE_MAX,
     931                 :            : };
     932                 :            : 
     933                 :            : /**
     934                 :            :  * L4 port type.
     935                 :            :  */
     936                 :            : enum i40e_l4_port_type {
     937                 :            :         I40E_L4_PORT_TYPE_SRC = 0,
     938                 :            :         I40E_L4_PORT_TYPE_DST,
     939                 :            : };
     940                 :            : 
     941                 :            : /**
     942                 :            :  * Tunneling Packet filter configuration.
     943                 :            :  */
     944                 :            : struct i40e_tunnel_filter_conf {
     945                 :            :         struct rte_ether_addr outer_mac;    /**< Outer MAC address to match. */
     946                 :            :         struct rte_ether_addr inner_mac;    /**< Inner MAC address to match. */
     947                 :            :         uint16_t inner_vlan;            /**< Inner VLAN to match. */
     948                 :            :         uint32_t outer_vlan;            /**< Outer VLAN to match */
     949                 :            :         enum i40e_tunnel_iptype ip_type; /**< IP address type. */
     950                 :            :         /**
     951                 :            :          * Outer destination IP address to match if ETH_TUNNEL_FILTER_OIP
     952                 :            :          * is set in filter_type, or inner destination IP address to match
     953                 :            :          * if ETH_TUNNEL_FILTER_IIP is set in filter_type.
     954                 :            :          */
     955                 :            :         union {
     956                 :            :                 uint32_t ipv4_addr;     /**< IPv4 address in big endian. */
     957                 :            :                 uint32_t ipv6_addr[4];  /**< IPv6 address in big endian. */
     958                 :            :         } ip_addr;
     959                 :            :         /** Flags from ETH_TUNNEL_FILTER_XX - see above. */
     960                 :            :         uint16_t filter_type;
     961                 :            :         enum i40e_tunnel_type tunnel_type; /**< Tunnel Type. */
     962                 :            :         enum i40e_l4_port_type l4_port_type; /**< L4 Port Type. */
     963                 :            :         uint32_t tenant_id;     /**< Tenant ID to match. VNI, GRE key... */
     964                 :            :         uint16_t queue_id;      /**< Queue assigned to if match. */
     965                 :            :         uint8_t is_to_vf;       /**< 0 - to PF, 1 - to VF */
     966                 :            :         uint16_t vf_id;         /**< VF id, available when is_to_vf is 1. */
     967                 :            : };
     968                 :            : 
     969                 :            : TAILQ_HEAD(i40e_flow_list, rte_flow);
     970                 :            : 
     971                 :            : /* Struct to store Traffic Manager shaper profile. */
     972                 :            : struct i40e_tm_shaper_profile {
     973                 :            :         TAILQ_ENTRY(i40e_tm_shaper_profile) node;
     974                 :            :         uint32_t shaper_profile_id;
     975                 :            :         uint32_t reference_count;
     976                 :            :         struct rte_tm_shaper_params profile;
     977                 :            : };
     978                 :            : 
     979                 :            : TAILQ_HEAD(i40e_shaper_profile_list, i40e_tm_shaper_profile);
     980                 :            : 
     981                 :            : /* node type of Traffic Manager */
     982                 :            : enum i40e_tm_node_type {
     983                 :            :         I40E_TM_NODE_TYPE_PORT,
     984                 :            :         I40E_TM_NODE_TYPE_TC,
     985                 :            :         I40E_TM_NODE_TYPE_QUEUE,
     986                 :            :         I40E_TM_NODE_TYPE_MAX,
     987                 :            : };
     988                 :            : 
     989                 :            : /* Struct to store Traffic Manager node configuration. */
     990                 :            : struct i40e_tm_node {
     991                 :            :         TAILQ_ENTRY(i40e_tm_node) node;
     992                 :            :         uint32_t id;
     993                 :            :         uint32_t priority;
     994                 :            :         uint32_t weight;
     995                 :            :         uint32_t reference_count;
     996                 :            :         struct i40e_tm_node *parent;
     997                 :            :         struct i40e_tm_shaper_profile *shaper_profile;
     998                 :            :         struct rte_tm_node_params params;
     999                 :            : };
    1000                 :            : 
    1001                 :            : TAILQ_HEAD(i40e_tm_node_list, i40e_tm_node);
    1002                 :            : 
    1003                 :            : /* Struct to store all the Traffic Manager configuration. */
    1004                 :            : struct i40e_tm_conf {
    1005                 :            :         struct i40e_shaper_profile_list shaper_profile_list;
    1006                 :            :         struct i40e_tm_node *root; /* root node - port */
    1007                 :            :         struct i40e_tm_node_list tc_list; /* node list for all the TCs */
    1008                 :            :         struct i40e_tm_node_list queue_list; /* node list for all the queues */
    1009                 :            :         /**
    1010                 :            :          * The number of added TC nodes.
    1011                 :            :          * It should be no more than the TC number of this port.
    1012                 :            :          */
    1013                 :            :         uint32_t nb_tc_node;
    1014                 :            :         /**
    1015                 :            :          * The number of added queue nodes.
    1016                 :            :          * It should be no more than the queue number of this port.
    1017                 :            :          */
    1018                 :            :         uint32_t nb_queue_node;
    1019                 :            :         /**
    1020                 :            :          * This flag is used to check if APP can change the TM node
    1021                 :            :          * configuration.
    1022                 :            :          * When it's true, means the configuration is applied to HW,
    1023                 :            :          * APP should not change the configuration.
    1024                 :            :          * As we don't support on-the-fly configuration, when starting
    1025                 :            :          * the port, APP should call the hierarchy_commit API to set this
    1026                 :            :          * flag to true. When stopping the port, this flag should be set
    1027                 :            :          * to false.
    1028                 :            :          */
    1029                 :            :         bool committed;
    1030                 :            : };
    1031                 :            : 
    1032                 :            : enum i40e_new_pctype {
    1033                 :            :         I40E_CUSTOMIZED_GTPC = 0,
    1034                 :            :         I40E_CUSTOMIZED_GTPU_IPV4,
    1035                 :            :         I40E_CUSTOMIZED_GTPU_IPV6,
    1036                 :            :         I40E_CUSTOMIZED_GTPU,
    1037                 :            :         I40E_CUSTOMIZED_IPV4_L2TPV3,
    1038                 :            :         I40E_CUSTOMIZED_IPV6_L2TPV3,
    1039                 :            :         I40E_CUSTOMIZED_ESP_IPV4,
    1040                 :            :         I40E_CUSTOMIZED_ESP_IPV6,
    1041                 :            :         I40E_CUSTOMIZED_ESP_IPV4_UDP,
    1042                 :            :         I40E_CUSTOMIZED_ESP_IPV6_UDP,
    1043                 :            :         I40E_CUSTOMIZED_AH_IPV4,
    1044                 :            :         I40E_CUSTOMIZED_AH_IPV6,
    1045                 :            :         I40E_CUSTOMIZED_MAX,
    1046                 :            : };
    1047                 :            : 
    1048                 :            : #define I40E_FILTER_PCTYPE_INVALID     0
    1049                 :            : struct i40e_customized_pctype {
    1050                 :            :         enum i40e_new_pctype index;  /* Indicate which customized pctype */
    1051                 :            :         uint8_t pctype;   /* New pctype value */
    1052                 :            :         bool valid;   /* Check if it's valid */
    1053                 :            : };
    1054                 :            : 
    1055                 :            : struct i40e_rte_flow_rss_conf {
    1056                 :            :         struct rte_flow_action_rss conf;        /**< RSS parameters. */
    1057                 :            : 
    1058                 :            :         uint8_t key[(I40E_VFQF_HKEY_MAX_INDEX > I40E_PFQF_HKEY_MAX_INDEX ?
    1059                 :            :                      I40E_VFQF_HKEY_MAX_INDEX : I40E_PFQF_HKEY_MAX_INDEX + 1) *
    1060                 :            :                     sizeof(uint32_t)];          /**< Hash key. */
    1061                 :            :         uint16_t queue[RTE_ETH_RSS_RETA_SIZE_512];      /**< Queues indices to use. */
    1062                 :            : 
    1063                 :            :         bool symmetric_enable;          /**< true, if enable symmetric */
    1064                 :            :         uint64_t config_pctypes;        /**< All PCTYPES with the flow  */
    1065                 :            :         uint64_t inset;                 /**< input sets */
    1066                 :            : 
    1067                 :            :         uint8_t region_priority;        /**< queue region priority */
    1068                 :            :         uint8_t region_queue_num;       /**< region queue number */
    1069                 :            :         uint16_t region_queue_start;    /**< region queue start */
    1070                 :            : 
    1071                 :            :         uint32_t misc_reset_flags;
    1072                 :            : #define I40E_HASH_FLOW_RESET_FLAG_FUNC          0x01UL
    1073                 :            : #define I40E_HASH_FLOW_RESET_FLAG_KEY           0x02UL
    1074                 :            : #define I40E_HASH_FLOW_RESET_FLAG_QUEUE         0x04UL
    1075                 :            : #define I40E_HASH_FLOW_RESET_FLAG_REGION        0x08UL
    1076                 :            : 
    1077                 :            :         /**< All PCTYPES that reset with the flow  */
    1078                 :            :         uint64_t reset_config_pctypes;
    1079                 :            :         /**< Symmetric function should reset on PCTYPES */
    1080                 :            :         uint64_t reset_symmetric_pctypes;
    1081                 :            : };
    1082                 :            : 
    1083                 :            : /* RSS filter list structure */
    1084                 :            : struct i40e_rss_filter {
    1085                 :            :         TAILQ_ENTRY(i40e_rss_filter) next;
    1086                 :            :         struct i40e_rte_flow_rss_conf rss_filter_info;
    1087                 :            : };
    1088                 :            : 
    1089                 :            : TAILQ_HEAD(i40e_rss_conf_list, i40e_rss_filter);
    1090                 :            : 
    1091                 :            : struct i40e_vf_msg_cfg {
    1092                 :            :         /* maximal VF message during a statistic period */
    1093                 :            :         uint32_t max_msg;
    1094                 :            : 
    1095                 :            :         /* statistic period, in second */
    1096                 :            :         uint32_t period;
    1097                 :            :         /*
    1098                 :            :          * If message statistics from a VF exceed the maximal limitation,
    1099                 :            :          * the PF will ignore any new message from that VF for
    1100                 :            :          * 'ignore_second' time.
    1101                 :            :          */
    1102                 :            :         uint32_t ignore_second;
    1103                 :            : };
    1104                 :            : 
    1105                 :            : struct i40e_mbuf_stats {
    1106                 :            :         uint64_t tx_pkt_errors;
    1107                 :            : };
    1108                 :            : 
    1109                 :            : /*
    1110                 :            :  * Structure to store private data specific for PF instance.
    1111                 :            :  */
    1112                 :            : struct i40e_pf {
    1113                 :            :         struct i40e_adapter *adapter; /* The adapter this PF associate to */
    1114                 :            :         struct i40e_vsi *main_vsi; /* pointer to main VSI structure */
    1115                 :            :         uint16_t mac_seid; /* The seid of the MAC of this PF */
    1116                 :            :         uint16_t main_vsi_seid; /* The seid of the main VSI */
    1117                 :            :         uint16_t max_num_vsi;
    1118                 :            :         struct i40e_res_pool_info qp_pool;    /*Queue pair pool */
    1119                 :            :         struct i40e_res_pool_info msix_pool;  /* MSIX interrupt pool */
    1120                 :            : 
    1121                 :            :         struct i40e_hw_port_stats stats_offset;
    1122                 :            :         struct i40e_hw_port_stats stats;
    1123                 :            :         struct i40e_mbuf_stats mbuf_stats;
    1124                 :            : 
    1125                 :            :         /* internal packet statistics, it should be excluded from the total */
    1126                 :            :         struct i40e_eth_stats internal_stats_offset;
    1127                 :            :         struct i40e_eth_stats internal_stats;
    1128                 :            :         bool offset_loaded;
    1129                 :            : 
    1130                 :            :         struct rte_eth_dev_data *dev_data; /* Pointer to the device data */
    1131                 :            :         struct rte_ether_addr dev_addr; /* PF device mac address */
    1132                 :            :         uint64_t flags; /* PF feature flags */
    1133                 :            :         /* All kinds of queue pair setting for different VSIs */
    1134                 :            :         struct i40e_pf_vf *vfs;
    1135                 :            :         uint16_t vf_num;
    1136                 :            :         /* Each of below queue pairs should be power of 2 since it's the
    1137                 :            :            precondition after TC configuration applied */
    1138                 :            :         uint16_t lan_nb_qp_max;
    1139                 :            :         uint16_t lan_nb_qps; /* The number of queue pairs of LAN */
    1140                 :            :         uint16_t lan_qp_offset;
    1141                 :            :         uint16_t vmdq_nb_qp_max;
    1142                 :            :         uint16_t vmdq_nb_qps; /* The number of queue pairs of VMDq */
    1143                 :            :         uint16_t vmdq_qp_offset;
    1144                 :            :         uint16_t vf_nb_qp_max;
    1145                 :            :         uint16_t vf_nb_qps; /* The number of queue pairs of VF */
    1146                 :            :         uint16_t vf_qp_offset;
    1147                 :            :         uint16_t fdir_nb_qps; /* The number of queue pairs of Flow Director */
    1148                 :            :         uint16_t fdir_qp_offset;
    1149                 :            : 
    1150                 :            :         uint16_t hash_lut_size; /* The size of hash lookup table */
    1151                 :            :         bool hash_filter_enabled;
    1152                 :            :         uint64_t hash_enabled_queues;
    1153                 :            :         /* input set bits for each pctype */
    1154                 :            :         uint64_t hash_input_set[I40E_FILTER_PCTYPE_MAX];
    1155                 :            :         /* store VXLAN UDP ports */
    1156                 :            :         uint16_t vxlan_ports[I40E_MAX_PF_UDP_OFFLOAD_PORTS];
    1157                 :            :         uint16_t vxlan_bitmap; /* Vxlan bit mask */
    1158                 :            : 
    1159                 :            :         /* VMDQ related info */
    1160                 :            :         uint16_t max_nb_vmdq_vsi; /* Max number of VMDQ VSIs supported */
    1161                 :            :         uint16_t nb_cfg_vmdq_vsi; /* number of VMDQ VSIs configured */
    1162                 :            :         struct i40e_vmdq_info *vmdq;
    1163                 :            : 
    1164                 :            :         struct i40e_fdir_info fdir; /* flow director info */
    1165                 :            :         struct i40e_ethertype_rule ethertype; /* Ethertype filter rule */
    1166                 :            :         struct i40e_tunnel_rule tunnel; /* Tunnel filter rule */
    1167                 :            :         struct i40e_rss_conf_list rss_config_list; /* RSS rule list */
    1168                 :            :         struct i40e_queue_regions queue_region; /* queue region info */
    1169                 :            :         struct i40e_fc_conf fc_conf; /* Flow control conf */
    1170                 :            :         bool floating_veb; /* The flag to use the floating VEB */
    1171                 :            :         /* The floating enable flag for the specific VF */
    1172                 :            :         bool floating_veb_list[I40E_MAX_VF];
    1173                 :            :         struct i40e_flow_list flow_list;
    1174                 :            :         bool mpls_replace_flag;  /* 1 - MPLS filter replace is done */
    1175                 :            :         bool gtp_replace_flag;   /* 1 - GTP-C/U filter replace is done */
    1176                 :            :         bool qinq_replace_flag;  /* QINQ filter replace is done */
    1177                 :            :         /* l4 port flag */
    1178                 :            :         bool sport_replace_flag;   /* Source port replace is done */
    1179                 :            :         bool dport_replace_flag;   /* Destination port replace is done */
    1180                 :            :         struct i40e_tm_conf tm_conf;
    1181                 :            :         bool support_multi_driver; /* 1 - support multiple driver */
    1182                 :            : 
    1183                 :            :         /* Dynamic Device Personalization */
    1184                 :            :         bool gtp_support; /* 1 - support GTP-C and GTP-U */
    1185                 :            :         bool esp_support; /* 1 - support ESP SPI */
    1186                 :            :         /* customer customized pctype */
    1187                 :            :         struct i40e_customized_pctype customized_pctype[I40E_CUSTOMIZED_MAX];
    1188                 :            :         /* Switch Domain Id */
    1189                 :            :         uint16_t switch_domain_id;
    1190                 :            : 
    1191                 :            :         /* When firmware > 8.3, the enable flag for outer VLAN processing */
    1192                 :            :         bool fw8_3gt;
    1193                 :            : 
    1194                 :            :         struct i40e_vf_msg_cfg vf_msg_cfg;
    1195                 :            :         uint64_t prev_rx_bytes;
    1196                 :            :         uint64_t prev_tx_bytes;
    1197                 :            :         uint64_t internal_prev_rx_bytes;
    1198                 :            :         uint64_t internal_prev_tx_bytes;
    1199                 :            : };
    1200                 :            : 
    1201                 :            : enum pending_msg {
    1202                 :            :         PFMSG_LINK_CHANGE = 0x1,
    1203                 :            :         PFMSG_RESET_IMPENDING = 0x2,
    1204                 :            :         PFMSG_DRIVER_CLOSE = 0x4,
    1205                 :            : };
    1206                 :            : 
    1207                 :            : struct i40e_vsi_vlan_pvid_info {
    1208                 :            :         uint16_t on;            /* Enable or disable pvid */
    1209                 :            :         union {
    1210                 :            :                 uint16_t pvid;  /* Valid in case 'on' is set to set pvid */
    1211                 :            :                 struct {
    1212                 :            :                 /*  Valid in case 'on' is cleared. 'tagged' will reject tagged packets,
    1213                 :            :                  *  while 'untagged' will reject untagged packets.
    1214                 :            :                  */
    1215                 :            :                         uint8_t tagged;
    1216                 :            :                         uint8_t untagged;
    1217                 :            :                 } reject;
    1218                 :            :         } config;
    1219                 :            : };
    1220                 :            : 
    1221                 :            : #define I40E_MAX_PKT_TYPE  256
    1222                 :            : #define I40E_FLOW_TYPE_MAX 64
    1223                 :            : 
    1224                 :            : #define I40E_MBUF_CHECK_F_TX_MBUF        (1ULL << 0)
    1225                 :            : #define I40E_MBUF_CHECK_F_TX_SIZE        (1ULL << 1)
    1226                 :            : #define I40E_MBUF_CHECK_F_TX_SEGMENT     (1ULL << 2)
    1227                 :            : #define I40E_MBUF_CHECK_F_TX_OFFLOAD     (1ULL << 3)
    1228                 :            : 
    1229                 :            : /*
    1230                 :            :  * Structure to store private data for each PF/VF instance.
    1231                 :            :  */
    1232                 :            : struct i40e_adapter {
    1233                 :            :         /* Common for both PF and VF */
    1234                 :            :         struct i40e_hw hw;
    1235                 :            : 
    1236                 :            :         /* Specific for PF */
    1237                 :            :         struct i40e_pf pf;
    1238                 :            : 
    1239                 :            :         /* For vector PMD */
    1240                 :            :         bool rx_bulk_alloc_allowed;
    1241                 :            :         bool rx_vec_allowed;
    1242                 :            :         bool tx_simple_allowed;
    1243                 :            :         bool tx_vec_allowed;
    1244                 :            : 
    1245                 :            :         uint64_t mbuf_check; /* mbuf check flags. */
    1246                 :            :         uint16_t max_pkt_len; /* Maximum packet length */
    1247                 :            :         eth_tx_burst_t tx_pkt_burst;
    1248                 :            : 
    1249                 :            :         /* For PTP */
    1250                 :            :         struct rte_timecounter systime_tc;
    1251                 :            :         struct rte_timecounter rx_tstamp_tc;
    1252                 :            :         struct rte_timecounter tx_tstamp_tc;
    1253                 :            : 
    1254                 :            :         /* ptype mapping table */
    1255                 :            :         alignas(RTE_CACHE_LINE_MIN_SIZE) uint32_t ptype_tbl[I40E_MAX_PKT_TYPE];
    1256                 :            :         /* flow type to pctype mapping table */
    1257                 :            :         alignas(RTE_CACHE_LINE_MIN_SIZE) uint64_t pctypes_tbl[I40E_FLOW_TYPE_MAX];
    1258                 :            :         uint64_t flow_types_mask;
    1259                 :            :         uint64_t pctypes_mask;
    1260                 :            : 
    1261                 :            :         /* For RSS reta table update */
    1262                 :            :         uint8_t rss_reta_updated;
    1263                 :            : #ifdef RTE_ARCH_X86
    1264                 :            :         bool rx_use_avx2;
    1265                 :            :         bool rx_use_avx512;
    1266                 :            :         bool tx_use_avx2;
    1267                 :            :         bool tx_use_avx512;
    1268                 :            : #endif
    1269                 :            : };
    1270                 :            : 
    1271                 :            : /**
    1272                 :            :  * Structure to store private data for each VF representor instance
    1273                 :            :  */
    1274                 :            : struct i40e_vf_representor {
    1275                 :            :         uint16_t switch_domain_id;
    1276                 :            :         /**< Virtual Function ID */
    1277                 :            :         uint16_t vf_id;
    1278                 :            :         /**< Virtual Function ID */
    1279                 :            :         struct i40e_adapter *adapter;
    1280                 :            :         /**< Private data store of associated physical function */
    1281                 :            :         struct i40e_eth_stats stats_offset;
    1282                 :            :         /**< Zero-point of VF statistics*/
    1283                 :            : };
    1284                 :            : 
    1285                 :            : extern const struct rte_flow_ops i40e_flow_ops;
    1286                 :            : 
    1287                 :            : union i40e_filter_t {
    1288                 :            :         struct rte_eth_ethertype_filter ethertype_filter;
    1289                 :            :         struct i40e_fdir_filter_conf fdir_filter;
    1290                 :            :         struct rte_eth_tunnel_filter_conf tunnel_filter;
    1291                 :            :         struct i40e_tunnel_filter_conf consistent_tunnel_filter;
    1292                 :            :         struct i40e_rte_flow_rss_conf rss_conf;
    1293                 :            : };
    1294                 :            : 
    1295                 :            : typedef int (*parse_filter_t)(struct rte_eth_dev *dev,
    1296                 :            :                               const struct rte_flow_attr *attr,
    1297                 :            :                               const struct rte_flow_item pattern[],
    1298                 :            :                               const struct rte_flow_action actions[],
    1299                 :            :                               struct rte_flow_error *error,
    1300                 :            :                               union i40e_filter_t *filter);
    1301                 :            : struct i40e_valid_pattern {
    1302                 :            :         enum rte_flow_item_type *items;
    1303                 :            :         parse_filter_t parse_filter;
    1304                 :            : };
    1305                 :            : 
    1306                 :            : int i40e_dev_switch_queues(struct i40e_pf *pf, bool on);
    1307                 :            : int i40e_vsi_release(struct i40e_vsi *vsi);
    1308                 :            : struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf,
    1309                 :            :                                 enum i40e_vsi_type type,
    1310                 :            :                                 struct i40e_vsi *uplink_vsi,
    1311                 :            :                                 uint16_t user_param);
    1312                 :            : int i40e_switch_rx_queue(struct i40e_hw *hw, uint16_t q_idx, bool on);
    1313                 :            : int i40e_switch_tx_queue(struct i40e_hw *hw, uint16_t q_idx, bool on);
    1314                 :            : int i40e_vsi_add_vlan(struct i40e_vsi *vsi, uint16_t vlan);
    1315                 :            : int i40e_vsi_delete_vlan(struct i40e_vsi *vsi, uint16_t vlan);
    1316                 :            : int i40e_vsi_add_mac(struct i40e_vsi *vsi, struct i40e_mac_filter_info *filter);
    1317                 :            : int i40e_vsi_delete_mac(struct i40e_vsi *vsi, struct rte_ether_addr *addr);
    1318                 :            : void i40e_update_vsi_stats(struct i40e_vsi *vsi);
    1319                 :            : void i40e_pf_disable_irq0(struct i40e_hw *hw);
    1320                 :            : void i40e_pf_enable_irq0(struct i40e_hw *hw);
    1321                 :            : int i40e_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete);
    1322                 :            : int i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi, uint16_t itr_idx);
    1323                 :            : void i40e_vsi_queues_unbind_intr(struct i40e_vsi *vsi);
    1324                 :            : void i40e_vsi_disable_queues_intr(struct i40e_vsi *vsi);
    1325                 :            : int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi,
    1326                 :            :                            struct i40e_vsi_vlan_pvid_info *info);
    1327                 :            : int i40e_vsi_config_vlan_stripping(struct i40e_vsi *vsi, bool on);
    1328                 :            : int i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on);
    1329                 :            : uint64_t i40e_config_hena(const struct i40e_adapter *adapter, uint64_t flags);
    1330                 :            : uint64_t i40e_parse_hena(const struct i40e_adapter *adapter, uint64_t flags);
    1331                 :            : enum i40e_status_code i40e_fdir_setup_tx_resources(struct i40e_pf *pf);
    1332                 :            : enum i40e_status_code i40e_fdir_setup_rx_resources(struct i40e_pf *pf);
    1333                 :            : int i40e_fdir_setup(struct i40e_pf *pf);
    1334                 :            : void i40e_vsi_enable_queues_intr(struct i40e_vsi *vsi);
    1335                 :            : const struct rte_memzone *i40e_memzone_reserve(const char *name,
    1336                 :            :                                         uint32_t len,
    1337                 :            :                                         int socket_id);
    1338                 :            : int i40e_fdir_configure(struct rte_eth_dev *dev);
    1339                 :            : void i40e_fdir_rx_proc_enable(struct rte_eth_dev *dev, bool on);
    1340                 :            : void i40e_fdir_teardown(struct i40e_pf *pf);
    1341                 :            : enum i40e_filter_pctype
    1342                 :            :         i40e_flowtype_to_pctype(const struct i40e_adapter *adapter,
    1343                 :            :                                 uint16_t flow_type);
    1344                 :            : uint16_t i40e_pctype_to_flowtype(const struct i40e_adapter *adapter,
    1345                 :            :                                  enum i40e_filter_pctype pctype);
    1346                 :            : int i40e_dev_set_gre_key_len(struct i40e_hw *hw, uint8_t len);
    1347                 :            : void i40e_fdir_info_get(struct rte_eth_dev *dev,
    1348                 :            :                         struct rte_eth_fdir_info *fdir);
    1349                 :            : void i40e_fdir_stats_get(struct rte_eth_dev *dev,
    1350                 :            :                          struct rte_eth_fdir_stats *stat);
    1351                 :            : int i40e_select_filter_input_set(struct i40e_hw *hw,
    1352                 :            :                                  struct rte_eth_input_set_conf *conf,
    1353                 :            :                                  enum rte_filter_type filter);
    1354                 :            : void i40e_fdir_filter_restore(struct i40e_pf *pf);
    1355                 :            : int i40e_set_hash_inset(struct i40e_hw *hw, uint64_t input_set,
    1356                 :            :                         uint32_t pctype, bool add);
    1357                 :            : int i40e_pf_host_send_msg_to_vf(struct i40e_pf_vf *vf, uint32_t opcode,
    1358                 :            :                                 uint32_t retval, uint8_t *msg,
    1359                 :            :                                 uint16_t msglen);
    1360                 :            : void i40e_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
    1361                 :            :         struct rte_eth_rxq_info *qinfo);
    1362                 :            : void i40e_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
    1363                 :            :         struct rte_eth_txq_info *qinfo);
    1364                 :            : void i40e_recycle_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
    1365                 :            :         struct rte_eth_recycle_rxq_info *recycle_rxq_info);
    1366                 :            : int i40e_rx_burst_mode_get(struct rte_eth_dev *dev, uint16_t queue_id,
    1367                 :            :                            struct rte_eth_burst_mode *mode);
    1368                 :            : int i40e_tx_burst_mode_get(struct rte_eth_dev *dev, uint16_t queue_id,
    1369                 :            :                            struct rte_eth_burst_mode *mode);
    1370                 :            : struct i40e_ethertype_filter *
    1371                 :            : i40e_sw_ethertype_filter_lookup(struct i40e_ethertype_rule *ethertype_rule,
    1372                 :            :                         const struct i40e_ethertype_filter_input *input);
    1373                 :            : int i40e_sw_ethertype_filter_del(struct i40e_pf *pf,
    1374                 :            :                                  struct i40e_ethertype_filter_input *input);
    1375                 :            : int i40e_sw_fdir_filter_del(struct i40e_pf *pf,
    1376                 :            :                             struct i40e_fdir_input *input);
    1377                 :            : struct i40e_tunnel_filter *
    1378                 :            : i40e_sw_tunnel_filter_lookup(struct i40e_tunnel_rule *tunnel_rule,
    1379                 :            :                              const struct i40e_tunnel_filter_input *input);
    1380                 :            : int i40e_sw_tunnel_filter_del(struct i40e_pf *pf,
    1381                 :            :                               struct i40e_tunnel_filter_input *input);
    1382                 :            : uint64_t i40e_get_default_input_set(uint16_t pctype);
    1383                 :            : int i40e_ethertype_filter_set(struct i40e_pf *pf,
    1384                 :            :                               struct rte_eth_ethertype_filter *filter,
    1385                 :            :                               bool add);
    1386                 :            : struct rte_flow *
    1387                 :            : i40e_fdir_entry_pool_get(struct i40e_fdir_info *fdir_info);
    1388                 :            : void i40e_fdir_entry_pool_put(struct i40e_fdir_info *fdir_info,
    1389                 :            :                 struct rte_flow *flow);
    1390                 :            : int i40e_flow_add_del_fdir_filter(struct rte_eth_dev *dev,
    1391                 :            :                               const struct i40e_fdir_filter_conf *filter,
    1392                 :            :                               bool add);
    1393                 :            : int i40e_dev_tunnel_filter_set(struct i40e_pf *pf,
    1394                 :            :                                struct rte_eth_tunnel_filter_conf *tunnel_filter,
    1395                 :            :                                uint8_t add);
    1396                 :            : int i40e_dev_consistent_tunnel_filter_set(struct i40e_pf *pf,
    1397                 :            :                                   struct i40e_tunnel_filter_conf *tunnel_filter,
    1398                 :            :                                   uint8_t add);
    1399                 :            : int i40e_fdir_flush(struct rte_eth_dev *dev);
    1400                 :            : int i40e_find_all_vlan_for_mac(struct i40e_vsi *vsi,
    1401                 :            :                                struct i40e_macvlan_filter *mv_f,
    1402                 :            :                                int num, struct rte_ether_addr *addr);
    1403                 :            : int i40e_remove_macvlan_filters(struct i40e_vsi *vsi,
    1404                 :            :                                 struct i40e_macvlan_filter *filter,
    1405                 :            :                                 int total);
    1406                 :            : void i40e_set_vlan_filter(struct i40e_vsi *vsi, uint16_t vlan_id, bool on);
    1407                 :            : int i40e_add_macvlan_filters(struct i40e_vsi *vsi,
    1408                 :            :                              struct i40e_macvlan_filter *filter,
    1409                 :            :                              int total);
    1410                 :            : bool is_device_supported(struct rte_eth_dev *dev, struct rte_pci_driver *drv);
    1411                 :            : bool is_i40e_supported(struct rte_eth_dev *dev);
    1412                 :            : void i40e_set_symmetric_hash_enable_per_port(struct i40e_hw *hw,
    1413                 :            :                                              uint8_t enable);
    1414                 :            : int i40e_validate_input_set(enum i40e_filter_pctype pctype,
    1415                 :            :                             enum rte_filter_type filter, uint64_t inset);
    1416                 :            : int i40e_generate_inset_mask_reg(struct i40e_hw *hw, uint64_t inset,
    1417                 :            :                                  uint32_t *mask, uint8_t nb_elem);
    1418                 :            : uint64_t i40e_translate_input_set_reg(enum i40e_mac_type type, uint64_t input);
    1419                 :            : void i40e_check_write_reg(struct i40e_hw *hw, uint32_t addr, uint32_t val);
    1420                 :            : void i40e_check_write_global_reg(struct i40e_hw *hw,
    1421                 :            :                                  uint32_t addr, uint32_t val);
    1422                 :            : 
    1423                 :            : int i40e_tm_ops_get(struct rte_eth_dev *dev, void *ops);
    1424                 :            : void i40e_tm_conf_init(struct rte_eth_dev *dev);
    1425                 :            : void i40e_tm_conf_uninit(struct rte_eth_dev *dev);
    1426                 :            : struct i40e_customized_pctype*
    1427                 :            : i40e_find_customized_pctype(struct i40e_pf *pf, uint8_t index);
    1428                 :            : void i40e_update_customized_info(struct rte_eth_dev *dev, uint8_t *pkg,
    1429                 :            :                                  uint32_t pkg_size,
    1430                 :            :                                  enum rte_pmd_i40e_package_op op);
    1431                 :            : int i40e_dcb_init_configure(struct rte_eth_dev *dev, bool sw_dcb);
    1432                 :            : int i40e_flush_queue_region_all_conf(struct rte_eth_dev *dev,
    1433                 :            :                 struct i40e_hw *hw, struct i40e_pf *pf, uint16_t on);
    1434                 :            : void i40e_init_queue_region_conf(struct rte_eth_dev *dev);
    1435                 :            : void i40e_flex_payload_reg_set_default(struct i40e_hw *hw);
    1436                 :            : void i40e_pf_disable_rss(struct i40e_pf *pf);
    1437                 :            : int i40e_pf_calc_configured_queues_num(struct i40e_pf *pf);
    1438                 :            : int i40e_pf_reset_rss_reta(struct i40e_pf *pf);
    1439                 :            : int i40e_pf_reset_rss_key(struct i40e_pf *pf);
    1440                 :            : int i40e_pf_config_rss(struct i40e_pf *pf);
    1441                 :            : int i40e_pf_set_source_prune(struct i40e_pf *pf, int on);
    1442                 :            : int i40e_set_rss_key(struct i40e_vsi *vsi, uint8_t *key, uint8_t key_len);
    1443                 :            : int i40e_set_rss_lut(struct i40e_vsi *vsi, uint8_t *lut, uint16_t lut_size);
    1444                 :            : int i40e_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params);
    1445                 :            : int i40e_vf_representor_uninit(struct rte_eth_dev *ethdev);
    1446                 :            : 
    1447                 :            : #define I40E_DEV_TO_PCI(eth_dev) \
    1448                 :            :         RTE_DEV_TO_PCI((eth_dev)->device)
    1449                 :            : 
    1450                 :            : /* I40E_DEV_PRIVATE_TO */
    1451                 :            : #define I40E_DEV_PRIVATE_TO_PF(adapter) \
    1452                 :            :         (&((struct i40e_adapter *)adapter)->pf)
    1453                 :            : #define I40E_DEV_PRIVATE_TO_HW(adapter) \
    1454                 :            :         (&((struct i40e_adapter *)adapter)->hw)
    1455                 :            : #define I40E_DEV_PRIVATE_TO_ADAPTER(adapter) \
    1456                 :            :         ((struct i40e_adapter *)adapter)
    1457                 :            : 
    1458                 :            : static inline struct i40e_vsi *
    1459                 :            : i40e_get_vsi_from_adapter(struct i40e_adapter *adapter)
    1460                 :            : {
    1461         [ #  # ]:          0 :         if (!adapter)
    1462                 :            :                 return NULL;
    1463                 :            : 
    1464                 :            :         struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(adapter);
    1465                 :            : 
    1466                 :          0 :         return pf->main_vsi;
    1467                 :            : }
    1468                 :            : #define I40E_DEV_PRIVATE_TO_MAIN_VSI(adapter) \
    1469                 :            :         i40e_get_vsi_from_adapter((struct i40e_adapter *)adapter)
    1470                 :            : 
    1471                 :            : /* I40E_VSI_TO */
    1472                 :            : #define I40E_VSI_TO_HW(vsi) \
    1473                 :            :         (&(((struct i40e_vsi *)vsi)->adapter->hw))
    1474                 :            : #define I40E_VSI_TO_PF(vsi) \
    1475                 :            :         (&(((struct i40e_vsi *)vsi)->adapter->pf))
    1476                 :            : #define I40E_VSI_TO_VF(vsi) \
    1477                 :            :         (&(((struct i40e_vsi *)vsi)->adapter->vf))
    1478                 :            : #define I40E_VSI_TO_DEV_DATA(vsi) \
    1479                 :            :         (((struct i40e_vsi *)vsi)->adapter->pf.dev_data)
    1480                 :            : #define I40E_VSI_TO_ETH_DEV(vsi) \
    1481                 :            :         (&rte_eth_devices[((struct i40e_vsi *)vsi)->adapter->pf.dev_data->port_id])
    1482                 :            : 
    1483                 :            : /* I40E_PF_TO */
    1484                 :            : #define I40E_PF_TO_HW(pf) \
    1485                 :            :         (&(((struct i40e_pf *)pf)->adapter->hw))
    1486                 :            : #define I40E_PF_TO_ADAPTER(pf) \
    1487                 :            :         ((struct i40e_adapter *)pf->adapter)
    1488                 :            : 
    1489                 :            : static inline void
    1490                 :            : i40e_init_adminq_parameter(struct i40e_hw *hw)
    1491                 :            : {
    1492                 :          0 :         hw->aq.num_arq_entries = I40E_AQ_LEN;
    1493                 :          0 :         hw->aq.num_asq_entries = I40E_AQ_LEN;
    1494                 :          0 :         hw->aq.arq_buf_size = I40E_AQ_BUF_SZ;
    1495                 :          0 :         hw->aq.asq_buf_size = I40E_AQ_BUF_SZ;
    1496                 :            : }
    1497                 :            : 
    1498                 :            : static inline int
    1499                 :            : i40e_align_floor(int n)
    1500                 :            : {
    1501   [ #  #  #  # ]:          0 :         if (n == 0)
    1502                 :            :                 return 0;
    1503                 :          0 :         return 1 << (sizeof(n) * CHAR_BIT - 1 - rte_clz32(n));
    1504                 :            : }
    1505                 :            : 
    1506                 :            : static inline uint16_t
    1507                 :            : i40e_calc_itr_interval(bool is_pf, bool is_multi_drv)
    1508                 :            : {
    1509                 :            :         uint16_t interval = 0;
    1510                 :            : 
    1511                 :            :         if (is_multi_drv) {
    1512                 :            :                 interval = I40E_QUEUE_ITR_INTERVAL_DEFAULT;
    1513                 :            :         } else {
    1514                 :            :                 if (is_pf)
    1515                 :            :                         interval = I40E_QUEUE_ITR_INTERVAL_DEFAULT;
    1516                 :            :                 else
    1517                 :            :                         interval = I40E_VF_QUEUE_ITR_INTERVAL_DEFAULT;
    1518                 :            :         }
    1519                 :            : 
    1520                 :            :         /* Convert to hardware count, as writing each 1 represents 2 us */
    1521                 :            :         return interval / 2;
    1522                 :            : }
    1523                 :            : 
    1524                 :            : #define I40E_VALID_FLOW(flow_type) \
    1525                 :            :         ((flow_type) == RTE_ETH_FLOW_FRAG_IPV4 || \
    1526                 :            :         (flow_type) == RTE_ETH_FLOW_NONFRAG_IPV4_TCP || \
    1527                 :            :         (flow_type) == RTE_ETH_FLOW_NONFRAG_IPV4_UDP || \
    1528                 :            :         (flow_type) == RTE_ETH_FLOW_NONFRAG_IPV4_SCTP || \
    1529                 :            :         (flow_type) == RTE_ETH_FLOW_NONFRAG_IPV4_OTHER || \
    1530                 :            :         (flow_type) == RTE_ETH_FLOW_FRAG_IPV6 || \
    1531                 :            :         (flow_type) == RTE_ETH_FLOW_NONFRAG_IPV6_TCP || \
    1532                 :            :         (flow_type) == RTE_ETH_FLOW_NONFRAG_IPV6_UDP || \
    1533                 :            :         (flow_type) == RTE_ETH_FLOW_NONFRAG_IPV6_SCTP || \
    1534                 :            :         (flow_type) == RTE_ETH_FLOW_NONFRAG_IPV6_OTHER || \
    1535                 :            :         (flow_type) == RTE_ETH_FLOW_L2_PAYLOAD)
    1536                 :            : 
    1537                 :            : #define I40E_VALID_PCTYPE_X722(pctype) \
    1538                 :            :         ((pctype) == I40E_FILTER_PCTYPE_FRAG_IPV4 || \
    1539                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV4_TCP || \
    1540                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK || \
    1541                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV4_UDP || \
    1542                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP || \
    1543                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP || \
    1544                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP || \
    1545                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER || \
    1546                 :            :         (pctype) == I40E_FILTER_PCTYPE_FRAG_IPV6 || \
    1547                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV6_UDP || \
    1548                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP || \
    1549                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP || \
    1550                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV6_TCP || \
    1551                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK || \
    1552                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV6_SCTP || \
    1553                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV6_OTHER || \
    1554                 :            :         (pctype) == I40E_FILTER_PCTYPE_L2_PAYLOAD)
    1555                 :            : 
    1556                 :            : #define I40E_VALID_PCTYPE(pctype) \
    1557                 :            :         ((pctype) == I40E_FILTER_PCTYPE_FRAG_IPV4 || \
    1558                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV4_TCP || \
    1559                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV4_UDP || \
    1560                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV4_SCTP || \
    1561                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV4_OTHER || \
    1562                 :            :         (pctype) == I40E_FILTER_PCTYPE_FRAG_IPV6 || \
    1563                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV6_UDP || \
    1564                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV6_TCP || \
    1565                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV6_SCTP || \
    1566                 :            :         (pctype) == I40E_FILTER_PCTYPE_NONF_IPV6_OTHER || \
    1567                 :            :         (pctype) == I40E_FILTER_PCTYPE_L2_PAYLOAD)
    1568                 :            : 
    1569                 :            : #define I40E_PHY_TYPE_SUPPORT_40G(phy_type) \
    1570                 :            :         (((phy_type) & I40E_CAP_PHY_TYPE_40GBASE_KR4) || \
    1571                 :            :         ((phy_type) & I40E_CAP_PHY_TYPE_40GBASE_CR4_CU) || \
    1572                 :            :         ((phy_type) & I40E_CAP_PHY_TYPE_40GBASE_AOC) || \
    1573                 :            :         ((phy_type) & I40E_CAP_PHY_TYPE_40GBASE_CR4) || \
    1574                 :            :         ((phy_type) & I40E_CAP_PHY_TYPE_40GBASE_SR4) || \
    1575                 :            :         ((phy_type) & I40E_CAP_PHY_TYPE_40GBASE_LR4))
    1576                 :            : 
    1577                 :            : #define I40E_PHY_TYPE_SUPPORT_25G(phy_type) \
    1578                 :            :         (((phy_type) & I40E_CAP_PHY_TYPE_25GBASE_KR) || \
    1579                 :            :         ((phy_type) & I40E_CAP_PHY_TYPE_25GBASE_CR) || \
    1580                 :            :         ((phy_type) & I40E_CAP_PHY_TYPE_25GBASE_SR) || \
    1581                 :            :         ((phy_type) & I40E_CAP_PHY_TYPE_25GBASE_LR) || \
    1582                 :            :         ((phy_type) & I40E_CAP_PHY_TYPE_25GBASE_AOC) || \
    1583                 :            :         ((phy_type) & I40E_CAP_PHY_TYPE_25GBASE_ACC))
    1584                 :            : 
    1585                 :            : #endif /* _I40E_ETHDEV_H_ */

Generated by: LCOV version 1.14