net/cnxk: support CPT CTX write through microcode op
[dpdk.git] / drivers / net / enic / enic_rxtx_vec_avx2.c
index 517d409..600efff 100644 (file)
@@ -4,7 +4,8 @@
  */
 
 #include <rte_mbuf.h>
-#include <rte_ethdev_driver.h>
+#include <ethdev_driver.h>
+#include <rte_vect.h>
 
 #include "enic_compat.h"
 #include "rq_enet_desc.h"
@@ -166,21 +167,21 @@ enic_noscatter_vec_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
                        0x80, 0x80, 11, 10,
                        0x80, 0x80, 11, 10,
                        0x80, 0x80, 11, 10);
-       /* PKT_RX_RSS_HASH is 1<<1 so fits in 8-bit integer */
+       /* RTE_MBUF_F_RX_RSS_HASH is 1<<1 so fits in 8-bit integer */
        const __m256i rss_shuffle =
                _mm256_set_epi8(/* second 128 bits */
-                       PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
-                       PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
-                       PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
-                       PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
-                       PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
+                       RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH,
+                       RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH,
+                       RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH,
+                       RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH,
+                       RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH,
                        0, /* rss_types = 0 */
                        /* first 128 bits */
-                       PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
-                       PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
-                       PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
-                       PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
-                       PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
+                       RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH,
+                       RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH,
+                       RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH,
+                       RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH,
+                       RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH, RTE_MBUF_F_RX_RSS_HASH,
                        0 /* rss_types = 0 */);
        /*
         * VLAN offload flags.
@@ -190,8 +191,8 @@ enic_noscatter_vec_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
         */
        const __m256i vlan_shuffle =
                _mm256_set_epi32(0, 0, 0, 0,
-                       PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED, 0,
-                       PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED, PKT_RX_VLAN);
+                       RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED, 0,
+                       RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED, RTE_MBUF_F_RX_VLAN);
        /* Use the same shuffle index as vlan_shuffle */
        const __m256i vlan_ptype_shuffle =
                _mm256_set_epi32(0, 0, 0, 0,
@@ -210,39 +211,39 @@ enic_noscatter_vec_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
        const __m256i csum_shuffle =
                _mm256_set_epi8(/* second 128 bits */
                        /* 1111 ip4+ip4_ok+l4+l4_ok */
-                       ((PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD) >> 1),
+                       ((RTE_MBUF_F_RX_IP_CKSUM_GOOD | RTE_MBUF_F_RX_L4_CKSUM_GOOD) >> 1),
                        /* 1110 ip4_ok+ip4+l4+!l4_ok */
-                       ((PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_BAD) >> 1),
-                       (PKT_RX_IP_CKSUM_GOOD >> 1), /* 1101 ip4+ip4_ok */
-                       (PKT_RX_IP_CKSUM_GOOD >> 1), /* 1100 ip4_ok+ip4 */
-                       (PKT_RX_L4_CKSUM_GOOD >> 1), /* 1011 l4+l4_ok */
-                       (PKT_RX_L4_CKSUM_BAD >> 1),  /* 1010 l4+!l4_ok */
+                       ((RTE_MBUF_F_RX_IP_CKSUM_GOOD | RTE_MBUF_F_RX_L4_CKSUM_BAD) >> 1),
+                       (RTE_MBUF_F_RX_IP_CKSUM_GOOD >> 1), /* 1101 ip4+ip4_ok */
+                       (RTE_MBUF_F_RX_IP_CKSUM_GOOD >> 1), /* 1100 ip4_ok+ip4 */
+                       (RTE_MBUF_F_RX_L4_CKSUM_GOOD >> 1), /* 1011 l4+l4_ok */
+                       (RTE_MBUF_F_RX_L4_CKSUM_BAD >> 1),  /* 1010 l4+!l4_ok */
                        0, /* 1001 */
                        0, /* 1000 */
                        /* 0111 !ip4_ok+ip4+l4+l4_ok */
-                       ((PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_GOOD) >> 1),
+                       ((RTE_MBUF_F_RX_IP_CKSUM_BAD | RTE_MBUF_F_RX_L4_CKSUM_GOOD) >> 1),
                        /* 0110 !ip4_ok+ip4+l4+!l4_ok */
-                       ((PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD) >> 1),
-                       (PKT_RX_IP_CKSUM_BAD >> 1),  /* 0101 !ip4_ok+ip4 */
-                       (PKT_RX_IP_CKSUM_BAD >> 1),  /* 0100 !ip4_ok+ip4 */
-                       (PKT_RX_L4_CKSUM_GOOD >> 1), /* 0011 l4+l4_ok */
-                       (PKT_RX_L4_CKSUM_BAD >> 1),  /* 0010 l4+!l4_ok */
+                       ((RTE_MBUF_F_RX_IP_CKSUM_BAD | RTE_MBUF_F_RX_L4_CKSUM_BAD) >> 1),
+                       (RTE_MBUF_F_RX_IP_CKSUM_BAD >> 1),  /* 0101 !ip4_ok+ip4 */
+                       (RTE_MBUF_F_RX_IP_CKSUM_BAD >> 1),  /* 0100 !ip4_ok+ip4 */
+                       (RTE_MBUF_F_RX_L4_CKSUM_GOOD >> 1), /* 0011 l4+l4_ok */
+                       (RTE_MBUF_F_RX_L4_CKSUM_BAD >> 1),  /* 0010 l4+!l4_ok */
                        0, /* 0001 */
                        0, /* 0000 */
                        /* first 128 bits */
-                       ((PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_GOOD) >> 1),
-                       ((PKT_RX_IP_CKSUM_GOOD | PKT_RX_L4_CKSUM_BAD) >> 1),
-                       (PKT_RX_IP_CKSUM_GOOD >> 1),
-                       (PKT_RX_IP_CKSUM_GOOD >> 1),
-                       (PKT_RX_L4_CKSUM_GOOD >> 1),
-                       (PKT_RX_L4_CKSUM_BAD >> 1),
+                       ((RTE_MBUF_F_RX_IP_CKSUM_GOOD | RTE_MBUF_F_RX_L4_CKSUM_GOOD) >> 1),
+                       ((RTE_MBUF_F_RX_IP_CKSUM_GOOD | RTE_MBUF_F_RX_L4_CKSUM_BAD) >> 1),
+                       (RTE_MBUF_F_RX_IP_CKSUM_GOOD >> 1),
+                       (RTE_MBUF_F_RX_IP_CKSUM_GOOD >> 1),
+                       (RTE_MBUF_F_RX_L4_CKSUM_GOOD >> 1),
+                       (RTE_MBUF_F_RX_L4_CKSUM_BAD >> 1),
                        0, 0,
-                       ((PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_GOOD) >> 1),
-                       ((PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD) >> 1),
-                       (PKT_RX_IP_CKSUM_BAD >> 1),
-                       (PKT_RX_IP_CKSUM_BAD >> 1),
-                       (PKT_RX_L4_CKSUM_GOOD >> 1),
-                       (PKT_RX_L4_CKSUM_BAD >> 1),
+                       ((RTE_MBUF_F_RX_IP_CKSUM_BAD | RTE_MBUF_F_RX_L4_CKSUM_GOOD) >> 1),
+                       ((RTE_MBUF_F_RX_IP_CKSUM_BAD | RTE_MBUF_F_RX_L4_CKSUM_BAD) >> 1),
+                       (RTE_MBUF_F_RX_IP_CKSUM_BAD >> 1),
+                       (RTE_MBUF_F_RX_IP_CKSUM_BAD >> 1),
+                       (RTE_MBUF_F_RX_L4_CKSUM_GOOD >> 1),
+                       (RTE_MBUF_F_RX_L4_CKSUM_BAD >> 1),
                        0, 0);
        /*
         * Non-fragment PTYPEs.
@@ -470,7 +471,7 @@ enic_noscatter_vec_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
                        break;
 
                /*
-                * Compute PKT_RX_RSS_HASH.
+                * Compute RTE_MBUF_F_RX_RSS_HASH.
                 * Use 2 shifts and 1 shuffle for 8 desc: 0.375 inst/desc
                 * RSS types in byte 0, 4, 8, 12, 16, 20, 24, 28
                 * Everything else is zero.
@@ -478,7 +479,7 @@ enic_noscatter_vec_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
                __m256i rss_types =
                        _mm256_srli_epi32(_mm256_slli_epi32(flags0_7, 10), 28);
                /*
-                * RSS flags (PKT_RX_RSS_HASH) are in
+                * RSS flags (RTE_MBUF_F_RX_RSS_HASH) are in
                 * byte 0, 4, 8, 12, 16, 20, 24, 28
                 * Everything else is zero.
                 */
@@ -556,7 +557,7 @@ enic_noscatter_vec_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
                vlan0_7 = _mm256_sub_epi32(zero4, vlan0_7);
 
                /*
-                * Compute PKT_RX_VLAN and PKT_RX_VLAN_STRIPPED.
+                * Compute RTE_MBUF_F_RX_VLAN and RTE_MBUF_F_RX_VLAN_STRIPPED.
                 * Use 3 shifts, 1 or,  1 shuffle for 8 desc: 0.625 inst/desc
                 * VLAN offload flags in byte 0, 4, 8, 12, 16, 20, 24, 28
                 * Everything else is zero.
@@ -806,25 +807,21 @@ enic_noscatter_vec_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 }
 
 bool
-enic_use_vector_rx_handler(struct enic *enic)
+enic_use_vector_rx_handler(struct rte_eth_dev *eth_dev)
 {
-       struct rte_eth_dev *eth_dev;
-       struct rte_fdir_conf *fconf;
+       struct enic *enic = pmd_priv(eth_dev);
 
-       eth_dev = enic->rte_dev;
        /* User needs to request for the avx2 handler */
        if (!enic->enable_avx2_rx)
                return false;
        /* Do not support scatter Rx */
        if (!(enic->rq_count > 0 && enic->rq[0].data_queue_enable == 0))
                return false;
-       /* Do not support fdir/flow */
-       fconf = &eth_dev->data->dev_conf.fdir_conf;
-       if (fconf->mode != RTE_FDIR_MODE_NONE)
-               return false;
-       if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2)) {
+       if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) &&
+                       rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_256) {
                ENICPMD_LOG(DEBUG, " use the non-scatter avx2 Rx handler");
                eth_dev->rx_pkt_burst = &enic_noscatter_vec_recv_pkts;
+               enic->use_noscatter_vec_rx_handler = 1;
                return true;
        }
        return false;