net/hns3: fix queue state when concurrent with reset
[dpdk.git] / drivers / net / mlx5 / mlx5_rxtx.h
index 04b1916..4f0fda0 100644 (file)
@@ -14,7 +14,6 @@
 #include <rte_mempool.h>
 #include <rte_common.h>
 #include <rte_hexdump.h>
-#include <rte_atomic.h>
 #include <rte_spinlock.h>
 #include <rte_io.h>
 #include <rte_bus_pci.h>
@@ -127,6 +126,7 @@ struct mlx5_rxq_data {
        unsigned int strd_scatter_en:1; /* Scattered packets from a stride. */
        unsigned int lro:1; /* Enable LRO. */
        unsigned int dynf_meta:1; /* Dynamic metadata is configured. */
+       unsigned int mcqe_format:3; /* CQE compression format. */
        volatile uint32_t *rq_db;
        volatile uint32_t *cq_db;
        uint16_t port_id;
@@ -136,6 +136,7 @@ struct mlx5_rxq_data {
        uint32_t rq_pi;
        uint32_t cq_ci;
        uint16_t rq_repl_thresh; /* Threshold for buffer replenishment. */
+       uint32_t byte_mask;
        union {
                struct rxq_zip zip; /* Compressed context. */
                uint16_t decompressed;
@@ -167,6 +168,7 @@ struct mlx5_rxq_data {
        uint64_t timestamp_rx_flag; /* Dynamic mbuf flag for timestamp. */
        uint64_t flow_meta_mask;
        int32_t flow_meta_offset;
+       uint32_t flow_meta_port_mask;
        uint32_t rxseg_n; /* Number of split segment descriptions. */
        struct mlx5_eth_rxseg rxseg[MLX5_MAX_RXQ_NSEG];
        /* Buffer split segment descriptions - sizes, offsets, pools. */
@@ -192,14 +194,6 @@ struct mlx5_rxq_ctrl {
        uint32_t flow_tunnels_n[MLX5_FLOW_TUNNEL]; /* Tunnels counters. */
        uint32_t wqn; /* WQ number. */
        uint16_t dump_file_n; /* Number of dump files. */
-       struct mlx5_devx_dbr_page *rq_dbrec_page;
-       uint64_t rq_dbr_offset;
-       /* Storing RQ door-bell information, needed when freeing door-bell. */
-       struct mlx5_devx_dbr_page *cq_dbrec_page;
-       uint64_t cq_dbr_offset;
-       /* Storing CQ door-bell information, needed when freeing door-bell. */
-       void *wq_umem; /* WQ buffer registration info. */
-       void *cq_umem; /* CQ buffer registration info. */
        struct rte_eth_hairpin_conf hairpin_conf; /* Hairpin configuration. */
        uint32_t hairpin_status; /* Hairpin binding status. */
 };
@@ -216,6 +210,7 @@ struct mlx5_txq_local {
        uint16_t wqe_free; /* available wqe remain. */
        uint16_t mbuf_off; /* data offset in current mbuf. */
        uint16_t mbuf_nseg; /* number of remaining mbuf. */
+       uint16_t mbuf_free; /* number of inline mbufs to free. */
 };
 
 /* TX queue descriptor. */
@@ -249,6 +244,7 @@ struct mlx5_txq_data {
        uint16_t vlan_en:1; /* VLAN insertion in WQE is supported. */
        uint16_t db_nc:1; /* Doorbell mapped to non-cached region. */
        uint16_t db_heu:1; /* Doorbell heuristic write barrier. */
+       uint16_t fast_free:1; /* mbuf fast free on Tx is enabled. */
        uint16_t inlen_send; /* Ordinary send data inline size. */
        uint16_t inlen_empw; /* eMPW max packet size to inline. */
        uint16_t inlen_mode; /* Minimal data length to inline. */
@@ -310,9 +306,6 @@ struct mlx5_txq_ctrl {
 
 extern uint8_t rss_hash_default_key[];
 
-int mlx5_check_mprq_support(struct rte_eth_dev *dev);
-int mlx5_rxq_mprq_enabled(struct mlx5_rxq_data *rxq);
-int mlx5_mprq_enabled(struct rte_eth_dev *dev);
 unsigned int mlx5_rxq_cqe_num(struct mlx5_rxq_data *rxq_data);
 int mlx5_mprq_free_mp(struct rte_eth_dev *dev);
 int mlx5_mprq_alloc_mp(struct rte_eth_dev *dev);
@@ -349,19 +342,30 @@ struct mlx5_ind_table_obj *mlx5_ind_table_obj_get(struct rte_eth_dev *dev,
                                                  const uint16_t *queues,
                                                  uint32_t queues_n);
 int mlx5_ind_table_obj_release(struct rte_eth_dev *dev,
-                              struct mlx5_ind_table_obj *ind_tbl);
-uint32_t mlx5_hrxq_new(struct rte_eth_dev *dev,
-                      const uint8_t *rss_key, uint32_t rss_key_len,
-                      uint64_t hash_fields,
-                      const uint16_t *queues, uint32_t queues_n,
-                      int tunnel, bool shared);
+                              struct mlx5_ind_table_obj *ind_tbl,
+                              bool standalone);
+int mlx5_ind_table_obj_setup(struct rte_eth_dev *dev,
+                            struct mlx5_ind_table_obj *ind_tbl);
+int mlx5_ind_table_obj_modify(struct rte_eth_dev *dev,
+                             struct mlx5_ind_table_obj *ind_tbl,
+                             uint16_t *queues, const uint32_t queues_n,
+                             bool standalone);
+struct mlx5_cache_entry *mlx5_hrxq_create_cb(struct mlx5_cache_list *list,
+               struct mlx5_cache_entry *entry __rte_unused, void *cb_ctx);
+int mlx5_hrxq_match_cb(struct mlx5_cache_list *list,
+                      struct mlx5_cache_entry *entry,
+                      void *cb_ctx);
+void mlx5_hrxq_remove_cb(struct mlx5_cache_list *list,
+                        struct mlx5_cache_entry *entry);
 uint32_t mlx5_hrxq_get(struct rte_eth_dev *dev,
-                      const uint8_t *rss_key, uint32_t rss_key_len,
-                      uint64_t hash_fields,
-                      const uint16_t *queues, uint32_t queues_n);
+                      struct mlx5_flow_rss_desc *rss_desc);
 int mlx5_hrxq_release(struct rte_eth_dev *dev, uint32_t hxrq_idx);
-int mlx5_hrxq_verify(struct rte_eth_dev *dev);
+uint32_t mlx5_hrxq_verify(struct rte_eth_dev *dev);
+
+
 enum mlx5_rxq_type mlx5_rxq_get_type(struct rte_eth_dev *dev, uint16_t idx);
+const struct rte_eth_hairpin_conf *mlx5_rxq_get_hairpin_conf
+       (struct rte_eth_dev *dev, uint16_t idx);
 struct mlx5_hrxq *mlx5_drop_action_create(struct rte_eth_dev *dev);
 void mlx5_drop_action_destroy(struct rte_eth_dev *dev);
 uint64_t mlx5_get_rx_port_offloads(void);
@@ -677,8 +681,8 @@ mlx5_txpp_convert_tx_ts(struct mlx5_dev_ctx_shared *sh, uint64_t mts)
                 * the service thread, data should be re-read.
                 */
                rte_compiler_barrier();
-               ci = rte_atomic64_read(&sh->txpp.ts.ci_ts);
-               ts = rte_atomic64_read(&sh->txpp.ts.ts);
+               ci = __atomic_load_n(&sh->txpp.ts.ci_ts, __ATOMIC_RELAXED);
+               ts = __atomic_load_n(&sh->txpp.ts.ts, __ATOMIC_RELAXED);
                rte_compiler_barrier();
                if (!((ts ^ ci) << (64 - MLX5_CQ_INDEX_WIDTH)))
                        break;
@@ -688,7 +692,8 @@ mlx5_txpp_convert_tx_ts(struct mlx5_dev_ctx_shared *sh, uint64_t mts)
        mts -= ts;
        if (unlikely(mts >= UINT64_MAX / 2)) {
                /* We have negative integer, mts is in the past. */
-               rte_atomic32_inc(&sh->txpp.err_ts_past);
+               __atomic_fetch_add(&sh->txpp.err_ts_past,
+                                  1, __ATOMIC_RELAXED);
                return -1;
        }
        tick = sh->txpp.tick;
@@ -697,7 +702,8 @@ mlx5_txpp_convert_tx_ts(struct mlx5_dev_ctx_shared *sh, uint64_t mts)
        mts = (mts + tick - 1) / tick;
        if (unlikely(mts >= (1 << MLX5_CQ_INDEX_WIDTH) / 2 - 1)) {
                /* We have mts is too distant future. */
-               rte_atomic32_inc(&sh->txpp.err_ts_future);
+               __atomic_fetch_add(&sh->txpp.err_ts_future,
+                                  1, __ATOMIC_RELAXED);
                return -1;
        }
        mts <<= 64 - MLX5_CQ_INDEX_WIDTH;
@@ -906,4 +912,74 @@ mprq_buf_to_pkt(struct mlx5_rxq_data *rxq, struct rte_mbuf *pkt, uint32_t len,
        return MLX5_RXQ_CODE_EXIT;
 }
 
+/**
+ * Check whether Multi-Packet RQ can be enabled for the device.
+ *
+ * @param dev
+ *   Pointer to Ethernet device.
+ *
+ * @return
+ *   1 if supported, negative errno value if not.
+ */
+static __rte_always_inline int
+mlx5_check_mprq_support(struct rte_eth_dev *dev)
+{
+       struct mlx5_priv *priv = dev->data->dev_private;
+
+       if (priv->config.mprq.enabled &&
+           priv->rxqs_n >= priv->config.mprq.min_rxqs_num)
+               return 1;
+       return -ENOTSUP;
+}
+
+/**
+ * Check whether Multi-Packet RQ is enabled for the Rx queue.
+ *
+ *  @param rxq
+ *     Pointer to receive queue structure.
+ *
+ * @return
+ *   0 if disabled, otherwise enabled.
+ */
+static __rte_always_inline int
+mlx5_rxq_mprq_enabled(struct mlx5_rxq_data *rxq)
+{
+       return rxq->strd_num_n > 0;
+}
+
+/**
+ * Check whether Multi-Packet RQ is enabled for the device.
+ *
+ * @param dev
+ *   Pointer to Ethernet device.
+ *
+ * @return
+ *   0 if disabled, otherwise enabled.
+ */
+static __rte_always_inline int
+mlx5_mprq_enabled(struct rte_eth_dev *dev)
+{
+       struct mlx5_priv *priv = dev->data->dev_private;
+       uint32_t i;
+       uint16_t n = 0;
+       uint16_t n_ibv = 0;
+
+       if (mlx5_check_mprq_support(dev) < 0)
+               return 0;
+       /* All the configured queues should be enabled. */
+       for (i = 0; i < priv->rxqs_n; ++i) {
+               struct mlx5_rxq_data *rxq = (*priv->rxqs)[i];
+               struct mlx5_rxq_ctrl *rxq_ctrl = container_of
+                       (rxq, struct mlx5_rxq_ctrl, rxq);
+
+               if (rxq == NULL || rxq_ctrl->type != MLX5_RXQ_TYPE_STANDARD)
+                       continue;
+               n_ibv++;
+               if (mlx5_rxq_mprq_enabled(rxq))
+                       ++n;
+       }
+       /* Multi-Packet RQ can't be partially configured. */
+       MLX5_ASSERT(n == 0 || n == n_ibv);
+       return n == n_ibv;
+}
 #endif /* RTE_PMD_MLX5_RXTX_H_ */