net/dpaa2: avoid multiple IOVA conversions
[dpdk.git] / drivers / net / mlx5 / mlx5_rxtx.h
index fb13919..26621ff 100644 (file)
 
 #include <mlx5_glue.h>
 #include <mlx5_prm.h>
+#include <mlx5_common.h>
+#include <mlx5_common_mr.h>
 
 #include "mlx5_defs.h"
 #include "mlx5_utils.h"
 #include "mlx5.h"
-#include "mlx5_mr.h"
 #include "mlx5_autoconf.h"
 
 /* Support tunnel matching. */
 #define MLX5_FLOW_TUNNEL 10
 
+/* Mbuf dynamic flag offset for inline. */
+extern uint64_t rte_net_mlx5_dynf_inline_mask;
+
 struct mlx5_rxq_stats {
 #ifdef MLX5_PMD_SOFT_COUNTERS
        uint64_t ipackets; /**< Total of successfully received packets. */
@@ -115,9 +119,9 @@ struct mlx5_rxq_data {
        unsigned int strd_sz_n:4; /* Log 2 of stride size. */
        unsigned int strd_shift_en:1; /* Enable 2bytes shift on a stride. */
        unsigned int err_state:2; /* enum mlx5_rxq_err_state. */
-       unsigned int strd_headroom_en:1; /* Enable mbuf headroom in MPRQ. */
+       unsigned int strd_scatter_en:1; /* Scattered packets from a stride. */
        unsigned int lro:1; /* Enable LRO. */
-       unsigned int :1; /* Remaining bits. */
+       unsigned int dynf_meta:1; /* Dynamic metadata is configured. */
        volatile uint32_t *rq_db;
        volatile uint32_t *cq_db;
        uint16_t port_id;
@@ -155,6 +159,8 @@ struct mlx5_rxq_data {
        /* CQ (UAR) access lock required for 32bit implementations */
 #endif
        uint32_t tunnel; /* Tunnel information. */
+       uint64_t flow_meta_mask;
+       int32_t flow_meta_offset;
 } __rte_cache_aligned;
 
 enum mlx5_rxq_obj_type {
@@ -227,7 +233,7 @@ struct mlx5_ind_table_obj {
 
 /* Hash Rx queue. */
 struct mlx5_hrxq {
-       LIST_ENTRY(mlx5_hrxq) next; /* Pointer to the next element. */
+       ILIST_ENTRY(uint32_t)next; /* Index to the next element. */
        rte_atomic32_t refcnt; /* Reference counter. */
        struct mlx5_ind_table_obj *ind_table; /* Indirection table. */
        RTE_STD_C11
@@ -296,10 +302,10 @@ struct mlx5_txq_data {
        struct mlx5_mr_ctrl mr_ctrl; /* MR control descriptor. */
        struct mlx5_wqe *wqes; /* Work queue. */
        struct mlx5_wqe *wqes_end; /* Work queue array limit. */
-#ifdef NDEBUG
-       uint16_t *fcqs; /* Free completion queue. */
-#else
+#ifdef RTE_LIBRTE_MLX5_DEBUG
        uint32_t *fcqs; /* Free completion queue (debug extended). */
+#else
+       uint16_t *fcqs; /* Free completion queue. */
 #endif
        volatile struct mlx5_cqe *cqes; /* Completion queue. */
        volatile uint32_t *qp_db; /* Work queue doorbell. */
@@ -402,16 +408,16 @@ int mlx5_rxq_release(struct rte_eth_dev *dev, uint16_t idx);
 int mlx5_rxq_verify(struct rte_eth_dev *dev);
 int rxq_alloc_elts(struct mlx5_rxq_ctrl *rxq_ctrl);
 int mlx5_ind_table_obj_verify(struct rte_eth_dev *dev);
-struct mlx5_hrxq *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 __rte_unused);
-struct mlx5_hrxq *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);
-int mlx5_hrxq_release(struct rte_eth_dev *dev, struct mlx5_hrxq *hxrq);
+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 __rte_unused);
+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);
+int mlx5_hrxq_release(struct rte_eth_dev *dev, uint32_t hxrq_idx);
 int mlx5_hrxq_verify(struct rte_eth_dev *dev);
 enum mlx5_rxq_type mlx5_rxq_get_type(struct rte_eth_dev *dev, uint16_t idx);
 struct mlx5_hrxq *mlx5_hrxq_drop_new(struct rte_eth_dev *dev);
@@ -428,6 +434,7 @@ int mlx5_tx_hairpin_queue_setup
         const struct rte_eth_hairpin_conf *hairpin_conf);
 void mlx5_tx_queue_release(void *dpdk_txq);
 int mlx5_tx_uar_init_secondary(struct rte_eth_dev *dev, int fd);
+void mlx5_tx_uar_uninit_secondary(struct rte_eth_dev *dev);
 struct mlx5_txq_obj *mlx5_txq_obj_new(struct rte_eth_dev *dev, uint16_t idx,
                                      enum mlx5_txq_obj_type type);
 struct mlx5_txq_obj *mlx5_txq_obj_get(struct rte_eth_dev *dev, uint16_t idx);
@@ -474,6 +481,14 @@ void mlx5_dump_debug_information(const char *path, const char *title,
                                 const void *buf, unsigned int len);
 int mlx5_queue_state_modify_primary(struct rte_eth_dev *dev,
                        const struct mlx5_mp_arg_queue_state_modify *sm);
+void mlx5_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+                      struct rte_eth_rxq_info *qinfo);
+void mlx5_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+                      struct rte_eth_txq_info *qinfo);
+int mlx5_rx_burst_mode_get(struct rte_eth_dev *dev, uint16_t rx_queue_id,
+                          struct rte_eth_burst_mode *mode);
+int mlx5_tx_burst_mode_get(struct rte_eth_dev *dev, uint16_t tx_queue_id,
+                          struct rte_eth_burst_mode *mode);
 
 /* Vectorized version of mlx5_rxtx.c */
 int mlx5_rxq_check_vec_support(struct mlx5_rxq_data *rxq_data);
@@ -549,44 +564,6 @@ __mlx5_uar_write64(uint64_t val, void *addr, rte_spinlock_t *lock)
 #define mlx5_uar_write64(val, dst, lock) __mlx5_uar_write64(val, dst, lock)
 #endif
 
-/* CQE status. */
-enum mlx5_cqe_status {
-       MLX5_CQE_STATUS_SW_OWN = -1,
-       MLX5_CQE_STATUS_HW_OWN = -2,
-       MLX5_CQE_STATUS_ERR = -3,
-};
-
-/**
- * Check whether CQE is valid.
- *
- * @param cqe
- *   Pointer to CQE.
- * @param cqes_n
- *   Size of completion queue.
- * @param ci
- *   Consumer index.
- *
- * @return
- *   The CQE status.
- */
-static __rte_always_inline enum mlx5_cqe_status
-check_cqe(volatile struct mlx5_cqe *cqe, const uint16_t cqes_n,
-         const uint16_t ci)
-{
-       const uint16_t idx = ci & cqes_n;
-       const uint8_t op_own = cqe->op_own;
-       const uint8_t op_owner = MLX5_CQE_OWNER(op_own);
-       const uint8_t op_code = MLX5_CQE_OPCODE(op_own);
-
-       if (unlikely((op_owner != (!!(idx))) || (op_code == MLX5_CQE_INVALID)))
-               return MLX5_CQE_STATUS_HW_OWN;
-       rte_cio_rmb();
-       if (unlikely(op_code == MLX5_CQE_RESP_ERR ||
-                    op_code == MLX5_CQE_REQ_ERR))
-               return MLX5_CQE_STATUS_ERR;
-       return MLX5_CQE_STATUS_SW_OWN;
-}
-
 /**
  * Get Memory Pool (MP) from mbuf. If mbuf is indirect, the pool from which the
  * cloned mbuf is allocated is returned instead.
@@ -624,8 +601,8 @@ mlx5_rx_addr2mr(struct mlx5_rxq_data *rxq, uintptr_t addr)
        uint32_t lkey;
 
        /* Linear search on MR cache array. */
-       lkey = mlx5_mr_lookup_cache(mr_ctrl->cache, &mr_ctrl->mru,
-                                   MLX5_MR_CACHE_N, addr);
+       lkey = mlx5_mr_lookup_lkey(mr_ctrl->cache, &mr_ctrl->mru,
+                                  MLX5_MR_CACHE_N, addr);
        if (likely(lkey != UINT32_MAX))
                return lkey;
        /* Take slower bottom-half (Binary Search) on miss. */
@@ -656,8 +633,8 @@ mlx5_tx_mb2mr(struct mlx5_txq_data *txq, struct rte_mbuf *mb)
        if (unlikely(*mr_ctrl->dev_gen_ptr != mr_ctrl->cur_gen))
                mlx5_mr_flush_local_cache(mr_ctrl);
        /* Linear search on MR cache array. */
-       lkey = mlx5_mr_lookup_cache(mr_ctrl->cache, &mr_ctrl->mru,
-                                   MLX5_MR_CACHE_N, addr);
+       lkey = mlx5_mr_lookup_lkey(mr_ctrl->cache, &mr_ctrl->mru,
+                                  MLX5_MR_CACHE_N, addr);
        if (likely(lkey != UINT32_MAX))
                return lkey;
        /* Take slower bottom-half on miss. */