net/iavf: fix default RSS configuration
[dpdk.git] / drivers / net / iavf / iavf_rxtx.h
index 7396884..d4b4935 100644 (file)
 #define IAVF_TX_OFFLOAD_NOTSUP_MASK \
                (PKT_TX_OFFLOAD_MASK ^ IAVF_TX_OFFLOAD_MASK)
 
+/**
+ * Rx Flex Descriptors
+ * These descriptors are used instead of the legacy version descriptors
+ */
+union iavf_16b_rx_flex_desc {
+       struct {
+               __le64 pkt_addr; /* Packet buffer address */
+               __le64 hdr_addr; /* Header buffer address */
+                                /* bit 0 of hdr_addr is DD bit */
+       } read;
+       struct {
+               /* Qword 0 */
+               u8 rxdid; /* descriptor builder profile ID */
+               u8 mir_id_umb_cast; /* mirror=[5:0], umb=[7:6] */
+               __le16 ptype_flex_flags0; /* ptype=[9:0], ff0=[15:10] */
+               __le16 pkt_len; /* [15:14] are reserved */
+               __le16 hdr_len_sph_flex_flags1; /* header=[10:0] */
+                                               /* sph=[11:11] */
+                                               /* ff1/ext=[15:12] */
+
+               /* Qword 1 */
+               __le16 status_error0;
+               __le16 l2tag1;
+               __le16 flex_meta0;
+               __le16 flex_meta1;
+       } wb; /* writeback */
+};
+
+union iavf_32b_rx_flex_desc {
+       struct {
+               __le64 pkt_addr; /* Packet buffer address */
+               __le64 hdr_addr; /* Header buffer address */
+                                /* bit 0 of hdr_addr is DD bit */
+               __le64 rsvd1;
+               __le64 rsvd2;
+       } read;
+       struct {
+               /* Qword 0 */
+               u8 rxdid; /* descriptor builder profile ID */
+               u8 mir_id_umb_cast; /* mirror=[5:0], umb=[7:6] */
+               __le16 ptype_flex_flags0; /* ptype=[9:0], ff0=[15:10] */
+               __le16 pkt_len; /* [15:14] are reserved */
+               __le16 hdr_len_sph_flex_flags1; /* header=[10:0] */
+                                               /* sph=[11:11] */
+                                               /* ff1/ext=[15:12] */
+
+               /* Qword 1 */
+               __le16 status_error0;
+               __le16 l2tag1;
+               __le16 flex_meta0;
+               __le16 flex_meta1;
+
+               /* Qword 2 */
+               __le16 status_error1;
+               u8 flex_flags2;
+               u8 time_stamp_low;
+               __le16 l2tag2_1st;
+               __le16 l2tag2_2nd;
+
+               /* Qword 3 */
+               __le16 flex_meta2;
+               __le16 flex_meta3;
+               union {
+                       struct {
+                               __le16 flex_meta4;
+                               __le16 flex_meta5;
+                       } flex;
+                       __le32 ts_high;
+               } flex_ts;
+       } wb; /* writeback */
+};
+
 /* HW desc structure, both 16-byte and 32-byte types are supported */
 #ifdef RTE_LIBRTE_IAVF_16BYTE_RX_DESC
 #define iavf_rx_desc iavf_16byte_rx_desc
 #define iavf_rx_flex_desc iavf_32b_rx_flex_desc
 #endif
 
+typedef void (*iavf_rxd_to_pkt_fields_t)(struct iavf_rx_queue *rxq,
+                               struct rte_mbuf *mb,
+                               volatile union iavf_rx_flex_desc *rxdp);
+
 struct iavf_rxq_ops {
        void (*release_mbufs)(struct iavf_rx_queue *rxq);
 };
@@ -114,6 +190,11 @@ struct iavf_rx_queue {
        bool q_set;             /* if rx queue has been configured */
        bool rx_deferred_start; /* don't start this queue in dev start */
        const struct iavf_rxq_ops *ops;
+       uint8_t proto_xtr; /* protocol extraction type */
+       uint64_t xtr_ol_flag;
+               /* flexible descriptor metadata extraction offload flag */
+       iavf_rxd_to_pkt_fields_t rxd_to_pkt_fields;
+                               /* handle flexible descriptor by RXDID */
 };
 
 struct iavf_tx_entry {
@@ -122,6 +203,10 @@ struct iavf_tx_entry {
        uint16_t last_id;
 };
 
+struct iavf_tx_vec_entry {
+       struct rte_mbuf *mbuf;
+};
+
 /* Structure associated with each TX queue. */
 struct iavf_tx_queue {
        const struct rte_memzone *mz;  /* memzone for Tx ring */
@@ -161,77 +246,6 @@ union iavf_tx_offload {
        };
 };
 
-/* Rx Flex Descriptors
- * These descriptors are used instead of the legacy version descriptors
- */
-union iavf_16b_rx_flex_desc {
-       struct {
-               __le64 pkt_addr; /* Packet buffer address */
-               __le64 hdr_addr; /* Header buffer address */
-                                /* bit 0 of hdr_addr is DD bit */
-       } read;
-       struct {
-               /* Qword 0 */
-               u8 rxdid; /* descriptor builder profile ID */
-               u8 mir_id_umb_cast; /* mirror=[5:0], umb=[7:6] */
-               __le16 ptype_flex_flags0; /* ptype=[9:0], ff0=[15:10] */
-               __le16 pkt_len; /* [15:14] are reserved */
-               __le16 hdr_len_sph_flex_flags1; /* header=[10:0] */
-                                               /* sph=[11:11] */
-                                               /* ff1/ext=[15:12] */
-
-               /* Qword 1 */
-               __le16 status_error0;
-               __le16 l2tag1;
-               __le16 flex_meta0;
-               __le16 flex_meta1;
-       } wb; /* writeback */
-};
-
-union iavf_32b_rx_flex_desc {
-       struct {
-               __le64 pkt_addr; /* Packet buffer address */
-               __le64 hdr_addr; /* Header buffer address */
-                                /* bit 0 of hdr_addr is DD bit */
-               __le64 rsvd1;
-               __le64 rsvd2;
-       } read;
-       struct {
-               /* Qword 0 */
-               u8 rxdid; /* descriptor builder profile ID */
-               u8 mir_id_umb_cast; /* mirror=[5:0], umb=[7:6] */
-               __le16 ptype_flex_flags0; /* ptype=[9:0], ff0=[15:10] */
-               __le16 pkt_len; /* [15:14] are reserved */
-               __le16 hdr_len_sph_flex_flags1; /* header=[10:0] */
-                                               /* sph=[11:11] */
-                                               /* ff1/ext=[15:12] */
-
-               /* Qword 1 */
-               __le16 status_error0;
-               __le16 l2tag1;
-               __le16 flex_meta0;
-               __le16 flex_meta1;
-
-               /* Qword 2 */
-               __le16 status_error1;
-               u8 flex_flags2;
-               u8 time_stamp_low;
-               __le16 l2tag2_1st;
-               __le16 l2tag2_2nd;
-
-               /* Qword 3 */
-               __le16 flex_meta2;
-               __le16 flex_meta3;
-               union {
-                       struct {
-                               __le16 flex_meta4;
-                               __le16 flex_meta5;
-                       } flex;
-                       __le32 ts_high;
-               } flex_ts;
-       } wb; /* writeback */
-};
-
 /* Rx Flex Descriptor
  * RxDID Profile ID 16-21
  * Flex-field 0: RSS hash lower 16-bits
@@ -331,6 +345,7 @@ enum iavf_rxdid {
        IAVF_RXDID_COMMS_AUX_TCP        = 21,
        IAVF_RXDID_COMMS_OVS_1          = 22,
        IAVF_RXDID_COMMS_OVS_2          = 23,
+       IAVF_RXDID_COMMS_AUX_IP_OFFSET  = 25,
        IAVF_RXDID_LAST                 = 63,
 };
 
@@ -355,6 +370,20 @@ enum iavf_rx_flex_desc_status_error_0_bits {
        IAVF_RX_FLEX_DESC_STATUS0_LAST /* this entry must be last!!! */
 };
 
+enum iavf_rx_flex_desc_status_error_1_bits {
+       /* Note: These are predefined bit offsets */
+       IAVF_RX_FLEX_DESC_STATUS1_CPM_S = 0, /* 4 bits */
+       IAVF_RX_FLEX_DESC_STATUS1_NAT_S = 4,
+       IAVF_RX_FLEX_DESC_STATUS1_CRYPTO_S = 5,
+       /* [10:6] reserved */
+       IAVF_RX_FLEX_DESC_STATUS1_L2TAG2P_S = 11,
+       IAVF_RX_FLEX_DESC_STATUS1_XTRMD2_VALID_S = 12,
+       IAVF_RX_FLEX_DESC_STATUS1_XTRMD3_VALID_S = 13,
+       IAVF_RX_FLEX_DESC_STATUS1_XTRMD4_VALID_S = 14,
+       IAVF_RX_FLEX_DESC_STATUS1_XTRMD5_VALID_S = 15,
+       IAVF_RX_FLEX_DESC_STATUS1_LAST /* this entry must be last!!! */
+};
+
 /* for iavf_32b_rx_flex_desc.ptype_flex_flags0 member */
 #define IAVF_RX_FLEX_DESC_PTYPE_M      (0x3FF) /* 10-bits */
 
@@ -379,6 +408,7 @@ int iavf_dev_tx_queue_setup(struct rte_eth_dev *dev,
                           const struct rte_eth_txconf *tx_conf);
 int iavf_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id);
 int iavf_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id);
+int iavf_dev_tx_done_cleanup(void *txq, uint32_t free_cnt);
 void iavf_dev_tx_queue_release(void *txq);
 void iavf_stop_queues(struct rte_eth_dev *dev);
 uint16_t iavf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
@@ -437,6 +467,22 @@ int iavf_rx_vec_dev_check(struct rte_eth_dev *dev);
 int iavf_tx_vec_dev_check(struct rte_eth_dev *dev);
 int iavf_rxq_vec_setup(struct iavf_rx_queue *rxq);
 int iavf_txq_vec_setup(struct iavf_tx_queue *txq);
+uint16_t iavf_recv_pkts_vec_avx512(void *rx_queue, struct rte_mbuf **rx_pkts,
+                                  uint16_t nb_pkts);
+uint16_t iavf_recv_pkts_vec_avx512_flex_rxd(void *rx_queue,
+                                           struct rte_mbuf **rx_pkts,
+                                           uint16_t nb_pkts);
+uint16_t iavf_recv_scattered_pkts_vec_avx512(void *rx_queue,
+                                            struct rte_mbuf **rx_pkts,
+                                            uint16_t nb_pkts);
+uint16_t iavf_recv_scattered_pkts_vec_avx512_flex_rxd(void *rx_queue,
+                                                     struct rte_mbuf **rx_pkts,
+                                                     uint16_t nb_pkts);
+uint16_t iavf_xmit_pkts_vec_avx512(void *tx_queue, struct rte_mbuf **tx_pkts,
+                                  uint16_t nb_pkts);
+int iavf_txq_vec_setup_avx512(struct iavf_tx_queue *txq);
+
+uint8_t iavf_proto_xtr_type_to_rxdid(uint8_t xtr_type);
 
 const uint32_t *iavf_get_default_ptype_table(void);
 
@@ -509,8 +555,8 @@ void iavf_fdir_rx_proc_enable(struct iavf_adapter *ad, bool on)
 {
        if (on) {
                /* enable flow director processing */
-               if (ad->fdir_ref_cnt++ == 0)
-                       FDIR_PROC_ENABLE_PER_QUEUE(ad, on);
+               FDIR_PROC_ENABLE_PER_QUEUE(ad, on);
+               ad->fdir_ref_cnt++;
        } else {
                if (ad->fdir_ref_cnt >= 1) {
                        ad->fdir_ref_cnt--;