For direct re-arm mode, add two internal API for i40e.

One is to enable direct re-arming mode in Rx queue.

The other is to map Tx queue with Rx queue to make Rx queue take
buffers from the specific Tx queue.

Suggested-by: Honnappa Nagarahalli <honnappa.nagaraha...@arm.com>
Signed-off-by: Feifei Wang <feifei.wa...@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.w...@arm.com>
---
 drivers/net/i40e/i40e_ethdev.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index c0bfff43ee..33f89c5d9a 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -369,6 +369,13 @@ static int i40e_dev_rx_queue_intr_enable(struct 
rte_eth_dev *dev,
 static int i40e_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
                                          uint16_t queue_id);
 
+static int i40e_dev_rx_queue_direct_rearm_enable(struct rte_eth_dev *dev,
+                                               uint16_t queue_id);
+static int i40e_dev_rx_queue_direct_rearm_map(struct rte_eth_dev *dev,
+                                               uint16_t rx_queue_id,
+                                               uint16_t tx_port_id,
+                                               uint16_t tx_queue_id);
+
 static int i40e_get_regs(struct rte_eth_dev *dev,
                         struct rte_dev_reg_info *regs);
 
@@ -476,6 +483,8 @@ static const struct eth_dev_ops i40e_eth_dev_ops = {
        .rx_queue_setup               = i40e_dev_rx_queue_setup,
        .rx_queue_intr_enable         = i40e_dev_rx_queue_intr_enable,
        .rx_queue_intr_disable        = i40e_dev_rx_queue_intr_disable,
+       .rx_queue_direct_rearm_enable = i40e_dev_rx_queue_direct_rearm_enable,
+       .rx_queue_direct_rearm_map    = i40e_dev_rx_queue_direct_rearm_map,
        .rx_queue_release             = i40e_dev_rx_queue_release,
        .tx_queue_setup               = i40e_dev_tx_queue_setup,
        .tx_queue_release             = i40e_dev_tx_queue_release,
@@ -11115,6 +11124,31 @@ i40e_dev_rx_queue_intr_disable(struct rte_eth_dev 
*dev, uint16_t queue_id)
        return 0;
 }
 
+static int i40e_dev_rx_queue_direct_rearm_enable(struct rte_eth_dev *dev,
+                       uint16_t queue_id)
+{
+       struct i40e_rx_queue *rxq;
+
+       rxq = dev->data->rx_queues[queue_id];
+       rxq->direct_rxrearm_enable = 1;
+
+       return 0;
+}
+
+static int i40e_dev_rx_queue_direct_rearm_map(struct rte_eth_dev *dev,
+                               uint16_t rx_queue_id, uint16_t tx_port_id,
+                               uint16_t tx_queue_id)
+{
+       struct i40e_rx_queue *rxq;
+
+       rxq = dev->data->rx_queues[rx_queue_id];
+
+       rxq->direct_rxrearm_port = tx_port_id;
+       rxq->direct_rxrearm_queue = tx_queue_id;
+
+       return 0;
+}
+
 /**
  * This function is used to check if the register is valid.
  * Below is the valid registers list for X722 only:
-- 
2.25.1

Reply via email to