net/virtio: move vring alignment to generic header
[dpdk.git] / drivers / net / ice / ice_rxtx.c
index 93a0ac6..4136d04 100644 (file)
@@ -2,8 +2,9 @@
  * Copyright(c) 2018 Intel Corporation
  */
 
-#include <rte_ethdev_driver.h>
+#include <ethdev_driver.h>
 #include <rte_net.h>
+#include <rte_vect.h>
 
 #include "rte_pmd_ice.h"
 #include "ice_rxtx.h"
@@ -25,6 +26,32 @@ uint64_t rte_net_ice_dynflag_proto_xtr_ipv6_flow_mask;
 uint64_t rte_net_ice_dynflag_proto_xtr_tcp_mask;
 uint64_t rte_net_ice_dynflag_proto_xtr_ip_offset_mask;
 
+int
+ice_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc)
+{
+       volatile union ice_rx_flex_desc *rxdp;
+       struct ice_rx_queue *rxq = rx_queue;
+       uint16_t desc;
+
+       desc = rxq->rx_tail;
+       rxdp = &rxq->rx_ring[desc];
+       /* watch for changes in status bit */
+       pmc->addr = &rxdp->wb.status_error0;
+
+       /*
+        * we expect the DD bit to be set to 1 if this descriptor was already
+        * written to.
+        */
+       pmc->val = rte_cpu_to_le_16(1 << ICE_RX_FLEX_DESC_STATUS0_DD_S);
+       pmc->mask = rte_cpu_to_le_16(1 << ICE_RX_FLEX_DESC_STATUS0_DD_S);
+
+       /* register is 16-bit */
+       pmc->size = sizeof(uint16_t);
+
+       return 0;
+}
+
+
 static inline uint8_t
 ice_proto_xtr_type_to_rxdid(uint8_t xtr_type)
 {
@@ -42,6 +69,28 @@ ice_proto_xtr_type_to_rxdid(uint8_t xtr_type)
                                rxdid_map[xtr_type] : ICE_RXDID_COMMS_OVS;
 }
 
+static inline void
+ice_rxd_to_pkt_fields_by_comms_generic(__rte_unused struct ice_rx_queue *rxq,
+                                      struct rte_mbuf *mb,
+                                      volatile union ice_rx_flex_desc *rxdp)
+{
+       volatile struct ice_32b_rx_flex_desc_comms *desc =
+                       (volatile struct ice_32b_rx_flex_desc_comms *)rxdp;
+       uint16_t stat_err = rte_le_to_cpu_16(desc->status_error0);
+
+       if (likely(stat_err & (1 << ICE_RX_FLEX_DESC_STATUS0_RSS_VALID_S))) {
+               mb->ol_flags |= PKT_RX_RSS_HASH;
+               mb->hash.rss = rte_le_to_cpu_32(desc->rss_hash);
+       }
+
+#ifndef RTE_LIBRTE_ICE_16BYTE_RX_DESC
+       if (desc->flow_id != 0xFFFFFFFF) {
+               mb->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID;
+               mb->hash.fdir.hi = rte_le_to_cpu_32(desc->flow_id);
+       }
+#endif
+}
+
 static inline void
 ice_rxd_to_pkt_fields_by_comms_ovs(__rte_unused struct ice_rx_queue *rxq,
                                   struct rte_mbuf *mb,
@@ -147,7 +196,7 @@ ice_rxd_to_pkt_fields_by_comms_aux_v2(struct ice_rx_queue *rxq,
 #endif
 }
 
-static void
+void
 ice_select_rxd_to_pkt_fields_handler(struct ice_rx_queue *rxq, uint32_t rxdid)
 {
        switch (rxdid) {
@@ -181,6 +230,10 @@ ice_select_rxd_to_pkt_fields_handler(struct ice_rx_queue *rxq, uint32_t rxdid)
                rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v2;
                break;
 
+       case ICE_RXDID_COMMS_GENERIC:
+               rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_generic;
+               break;
+
        case ICE_RXDID_COMMS_OVS:
                rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_ovs;
                break;
@@ -219,23 +272,23 @@ ice_program_hw_rx_queue(struct ice_rx_queue *rxq)
                                   dev->data->dev_conf.rxmode.max_rx_pkt_len);
 
        if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
-               if (rxq->max_pkt_len <= RTE_ETHER_MAX_LEN ||
+               if (rxq->max_pkt_len <= ICE_ETH_MAX_LEN ||
                    rxq->max_pkt_len > ICE_FRAME_SIZE_MAX) {
                        PMD_DRV_LOG(ERR, "maximum packet length must "
                                    "be larger than %u and smaller than %u,"
                                    "as jumbo frame is enabled",
-                                   (uint32_t)RTE_ETHER_MAX_LEN,
+                                   (uint32_t)ICE_ETH_MAX_LEN,
                                    (uint32_t)ICE_FRAME_SIZE_MAX);
                        return -EINVAL;
                }
        } else {
                if (rxq->max_pkt_len < RTE_ETHER_MIN_LEN ||
-                   rxq->max_pkt_len > RTE_ETHER_MAX_LEN) {
+                   rxq->max_pkt_len > ICE_ETH_MAX_LEN) {
                        PMD_DRV_LOG(ERR, "maximum packet length must be "
                                    "larger than %u and smaller than %u, "
                                    "as jumbo frame is disabled",
                                    (uint32_t)RTE_ETHER_MIN_LEN,
-                                   (uint32_t)RTE_ETHER_MAX_LEN);
+                                   (uint32_t)ICE_ETH_MAX_LEN);
                        return -EINVAL;
                }
        }
@@ -674,7 +727,7 @@ ice_fdir_program_hw_rx_queue(struct ice_rx_queue *rxq)
        rx_ctx.hbuf = rxq->rx_hdr_len >> ICE_RLAN_CTX_HBUF_S;
        rx_ctx.dtype = 0; /* No Header Split mode */
        rx_ctx.dsize = 1; /* 32B descriptors */
-       rx_ctx.rxmax = RTE_ETHER_MAX_LEN;
+       rx_ctx.rxmax = ICE_ETH_MAX_LEN;
        /* TPH: Transaction Layer Packet (TLP) processing hints */
        rx_ctx.tphrdesc_ena = 1;
        rx_ctx.tphwdesc_ena = 1;
@@ -1424,6 +1477,11 @@ ice_rxd_error_to_pkt_flags(uint16_t stat_err0)
        if (unlikely(stat_err0 & (1 << ICE_RX_FLEX_DESC_STATUS0_XSUM_EIPE_S)))
                flags |= PKT_RX_EIP_CKSUM_BAD;
 
+       if (unlikely(stat_err0 & (1 << ICE_RX_FLEX_DESC_STATUS0_XSUM_EUDPE_S)))
+               flags |= PKT_RX_OUTER_L4_CKSUM_BAD;
+       else
+               flags |= PKT_RX_OUTER_L4_CKSUM_GOOD;
+
        return flags;
 }
 
@@ -1841,7 +1899,7 @@ ice_recv_scattered_pkts(void *rx_queue,
                rx_id = (uint16_t)(rx_id == 0 ?
                                   (rxq->nb_rx_desc - 1) : (rx_id - 1));
                /* write TAIL register */
-               ICE_PCI_REG_WRITE(rxq->qrx_tail, rx_id);
+               ICE_PCI_REG_WC_WRITE(rxq->qrx_tail, rx_id);
                nb_hold = 0;
        }
        rxq->nb_rx_hold = nb_hold;
@@ -1929,6 +1987,10 @@ ice_dev_supported_ptypes_get(struct rte_eth_dev *dev)
 #ifdef RTE_ARCH_X86
        if (dev->rx_pkt_burst == ice_recv_pkts_vec ||
            dev->rx_pkt_burst == ice_recv_scattered_pkts_vec ||
+#ifdef CC_AVX512_SUPPORT
+           dev->rx_pkt_burst == ice_recv_pkts_vec_avx512 ||
+           dev->rx_pkt_burst == ice_recv_scattered_pkts_vec_avx512 ||
+#endif
            dev->rx_pkt_burst == ice_recv_pkts_vec_avx2 ||
            dev->rx_pkt_burst == ice_recv_scattered_pkts_vec_avx2)
                return ptypes;
@@ -2231,7 +2293,7 @@ ice_recv_pkts(void *rx_queue,
                rx_id = (uint16_t)(rx_id == 0 ?
                                   (rxq->nb_rx_desc - 1) : (rx_id - 1));
                /* write TAIL register */
-               ICE_PCI_REG_WRITE(rxq->qrx_tail, rx_id);
+               ICE_PCI_REG_WC_WRITE(rxq->qrx_tail, rx_id);
                nb_hold = 0;
        }
        rxq->nb_rx_hold = nb_hold;
@@ -2288,8 +2350,11 @@ ice_parse_tunneling_params(uint64_t ol_flags,
        *cd_tunneling |= (tx_offload.l2_len >> 1) <<
                ICE_TXD_CTX_QW0_NATLEN_S;
 
-       if ((ol_flags & PKT_TX_OUTER_UDP_CKSUM) &&
-           (ol_flags & PKT_TX_OUTER_IP_CKSUM) &&
+       /**
+        * Calculate the tunneling UDP checksum.
+        * Shall be set only if L4TUNT = 01b and EIPT is not zero
+        */
+       if (!(*cd_tunneling & ICE_TX_CTX_EIPT_NONE) &&
            (*cd_tunneling & ICE_TXD_CTX_UDP_TUNNELING))
                *cd_tunneling |= ICE_TXD_CTX_QW0_L4T_CS_M;
 }
@@ -2946,7 +3011,7 @@ tx_xmit_pkts(struct ice_tx_queue *txq,
                txq->tx_tail = 0;
 
        /* Update the tx tail register */
-       ICE_PCI_REG_WRITE(txq->qtx_tail, txq->tx_tail);
+       ICE_PCI_REG_WC_WRITE(txq->qtx_tail, txq->tx_tail);
 
        return nb_pkts;
 }
@@ -2986,10 +3051,12 @@ ice_set_rx_function(struct rte_eth_dev *dev)
 #ifdef RTE_ARCH_X86
        struct ice_rx_queue *rxq;
        int i;
+       bool use_avx512 = false;
        bool use_avx2 = false;
 
        if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
-               if (!ice_rx_vec_dev_check(dev) && ad->rx_bulk_alloc_allowed) {
+               if (!ice_rx_vec_dev_check(dev) && ad->rx_bulk_alloc_allowed &&
+                               rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_128) {
                        ad->rx_vec_allowed = true;
                        for (i = 0; i < dev->data->nb_rx_queues; i++) {
                                rxq = dev->data->rx_queues[i];
@@ -2999,8 +3066,19 @@ ice_set_rx_function(struct rte_eth_dev *dev)
                                }
                        }
 
-                       if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
-                       rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1)
+                       if (rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_512 &&
+                       rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1 &&
+                       rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512BW) == 1)
+#ifdef CC_AVX512_SUPPORT
+                               use_avx512 = true;
+#else
+                       PMD_DRV_LOG(NOTICE,
+                               "AVX512 is not supported in build env");
+#endif
+                       if (!use_avx512 &&
+                       (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
+                       rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1) &&
+                       rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_256)
                                use_avx2 = true;
 
                } else {
@@ -3010,20 +3088,41 @@ ice_set_rx_function(struct rte_eth_dev *dev)
 
        if (ad->rx_vec_allowed) {
                if (dev->data->scattered_rx) {
-                       PMD_DRV_LOG(DEBUG,
+                       if (use_avx512) {
+#ifdef CC_AVX512_SUPPORT
+                               PMD_DRV_LOG(NOTICE,
+                                       "Using AVX512 Vector Scattered Rx (port %d).",
+                                       dev->data->port_id);
+                               dev->rx_pkt_burst =
+                                       ice_recv_scattered_pkts_vec_avx512;
+#endif
+                       } else {
+                               PMD_DRV_LOG(DEBUG,
                                        "Using %sVector Scattered Rx (port %d).",
                                        use_avx2 ? "avx2 " : "",
                                        dev->data->port_id);
-                       dev->rx_pkt_burst = use_avx2 ?
+                               dev->rx_pkt_burst = use_avx2 ?
                                        ice_recv_scattered_pkts_vec_avx2 :
                                        ice_recv_scattered_pkts_vec;
+                       }
                } else {
-                       PMD_DRV_LOG(DEBUG, "Using %sVector Rx (port %d).",
+                       if (use_avx512) {
+#ifdef CC_AVX512_SUPPORT
+                               PMD_DRV_LOG(NOTICE,
+                                       "Using AVX512 Vector Rx (port %d).",
+                                       dev->data->port_id);
+                               dev->rx_pkt_burst =
+                                       ice_recv_pkts_vec_avx512;
+#endif
+                       } else {
+                               PMD_DRV_LOG(DEBUG,
+                                       "Using %sVector Rx (port %d).",
                                        use_avx2 ? "avx2 " : "",
                                        dev->data->port_id);
-                       dev->rx_pkt_burst = use_avx2 ?
-                                               ice_recv_pkts_vec_avx2 :
-                                               ice_recv_pkts_vec;
+                               dev->rx_pkt_burst = use_avx2 ?
+                                       ice_recv_pkts_vec_avx2 :
+                                       ice_recv_pkts_vec;
+                       }
                }
                return;
        }
@@ -3060,6 +3159,10 @@ static const struct {
        { ice_recv_pkts_bulk_alloc,         "Scalar Bulk Alloc" },
        { ice_recv_pkts,                    "Scalar" },
 #ifdef RTE_ARCH_X86
+#ifdef CC_AVX512_SUPPORT
+       { ice_recv_scattered_pkts_vec_avx512, "Vector AVX512 Scattered" },
+       { ice_recv_pkts_vec_avx512,           "Vector AVX512" },
+#endif
        { ice_recv_scattered_pkts_vec_avx2, "Vector AVX2 Scattered" },
        { ice_recv_pkts_vec_avx2,           "Vector AVX2" },
        { ice_recv_scattered_pkts_vec,      "Vector SSE Scattered" },
@@ -3164,10 +3267,12 @@ ice_set_tx_function(struct rte_eth_dev *dev)
 #ifdef RTE_ARCH_X86
        struct ice_tx_queue *txq;
        int i;
+       bool use_avx512 = false;
        bool use_avx2 = false;
 
        if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
-               if (!ice_tx_vec_dev_check(dev)) {
+               if (!ice_tx_vec_dev_check(dev) &&
+                               rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_128) {
                        ad->tx_vec_allowed = true;
                        for (i = 0; i < dev->data->nb_tx_queues; i++) {
                                txq = dev->data->tx_queues[i];
@@ -3177,8 +3282,19 @@ ice_set_tx_function(struct rte_eth_dev *dev)
                                }
                        }
 
-                       if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
-                       rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1)
+                       if (rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_512 &&
+                       rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1 &&
+                       rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512BW) == 1)
+#ifdef CC_AVX512_SUPPORT
+                               use_avx512 = true;
+#else
+                       PMD_DRV_LOG(NOTICE,
+                               "AVX512 is not supported in build env");
+#endif
+                       if (!use_avx512 &&
+                       (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1 ||
+                       rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 1) &&
+                       rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_256)
                                use_avx2 = true;
 
                } else {
@@ -3187,12 +3303,20 @@ ice_set_tx_function(struct rte_eth_dev *dev)
        }
 
        if (ad->tx_vec_allowed) {
-               PMD_DRV_LOG(DEBUG, "Using %sVector Tx (port %d).",
-                           use_avx2 ? "avx2 " : "",
-                           dev->data->port_id);
-               dev->tx_pkt_burst = use_avx2 ?
-                                   ice_xmit_pkts_vec_avx2 :
-                                   ice_xmit_pkts_vec;
+               if (use_avx512) {
+#ifdef CC_AVX512_SUPPORT
+                       PMD_DRV_LOG(NOTICE, "Using AVX512 Vector Tx (port %d).",
+                                   dev->data->port_id);
+                       dev->tx_pkt_burst = ice_xmit_pkts_vec_avx512;
+#endif
+               } else {
+                       PMD_DRV_LOG(DEBUG, "Using %sVector Tx (port %d).",
+                                   use_avx2 ? "avx2 " : "",
+                                   dev->data->port_id);
+                       dev->tx_pkt_burst = use_avx2 ?
+                                           ice_xmit_pkts_vec_avx2 :
+                                           ice_xmit_pkts_vec;
+               }
                dev->tx_pkt_prepare = NULL;
 
                return;
@@ -3217,6 +3341,9 @@ static const struct {
        { ice_xmit_pkts_simple,   "Scalar Simple" },
        { ice_xmit_pkts,          "Scalar" },
 #ifdef RTE_ARCH_X86
+#ifdef CC_AVX512_SUPPORT
+       { ice_xmit_pkts_vec_avx512, "Vector AVX512" },
+#endif
        { ice_xmit_pkts_vec_avx2, "Vector AVX2" },
        { ice_xmit_pkts_vec,      "Vector SSE" },
 #endif
@@ -3779,6 +3906,50 @@ ice_get_default_pkt_type(uint16_t ptype)
                        RTE_PTYPE_TUNNEL_GTPU |
                        RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
                        RTE_PTYPE_INNER_L4_ICMP,
+
+               /* IPv4 --> UDP ECPRI */
+               [372] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [373] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [374] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [375] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [376] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [377] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [378] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [379] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [380] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [381] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+
+               /* IPV6 --> UDP ECPRI */
+               [382] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [383] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [384] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [385] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [386] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [387] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [388] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [389] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [390] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
+               [391] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
+                       RTE_PTYPE_L4_UDP,
                /* All others reserved */
        };