[v2,2/8] net/hns3: add queue count of Rx API support
diff mbox series

Message ID 1603973875-8431-3-git-send-email-oulijun@huawei.com
State Superseded, archived
Delegated to: Ferruh Yigit
Headers show
Series
  • hns3 misc updates
Related show

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Lijun Ou Oct. 29, 2020, 12:17 p.m. UTC
Here is to implement the available and used rxd number
count function. In Kunpeng series, the NIC hardware
support to read the bd numbers which wait processed from
the hardware FBD(Full Buffer Descriptor), and the driver
maintains the bd number to be wrriten back hardware.
compare the number of FBDs with the number of BDs
to be written back to the hardware.
the number of used descriptors of a rx queue is computed
as follows:
The fbd numbers of reading from FBD register plus the
bd numbers to be wrriten back to hardware maintainer by
the driver.

Signed-off-by: Lijun Ou <oulijun@huawei.com>
---
V1->V2:
- fix the checkpatch warning
---
 drivers/net/hns3/hns3_ethdev.c    |  1 +
 drivers/net/hns3/hns3_ethdev_vf.c |  1 +
 drivers/net/hns3/hns3_rxtx.c      | 25 +++++++++++++++++++++++++
 drivers/net/hns3/hns3_rxtx.h      |  1 +
 4 files changed, 28 insertions(+)

Patch
diff mbox series

diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index c34dbea..6342c70 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -6096,6 +6096,7 @@  hns3_dev_init(struct rte_eth_dev *eth_dev)
 
 	hns3_set_rxtx_function(eth_dev);
 	eth_dev->dev_ops = &hns3_eth_dev_ops;
+	eth_dev->rx_queue_count = hns3_rx_queue_count;
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
 		ret = hns3_mp_init_secondary();
 		if (ret) {
diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c
index 7d3750d..9fb7941 100644
--- a/drivers/net/hns3/hns3_ethdev_vf.c
+++ b/drivers/net/hns3/hns3_ethdev_vf.c
@@ -2743,6 +2743,7 @@  hns3vf_dev_init(struct rte_eth_dev *eth_dev)
 
 	hns3_set_rxtx_function(eth_dev);
 	eth_dev->dev_ops = &hns3vf_eth_dev_ops;
+	eth_dev->rx_queue_count = hns3_rx_queue_count;
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
 		ret = hns3_mp_init_secondary();
 		if (ret) {
diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c
index d511908..55bee17 100644
--- a/drivers/net/hns3/hns3_rxtx.c
+++ b/drivers/net/hns3/hns3_rxtx.c
@@ -3823,3 +3823,28 @@  hns3_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 
 	return 0;
 }
+
+uint32_t
+hns3_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
+{
+	/*
+	 * Number of BDs that have been processed by the driver
+	 * but have not been notified to the hardware.
+	 */
+	uint32_t driver_hold_bd_num;
+	struct hns3_rx_queue *rxq;
+	uint32_t fbd_num;
+
+	rxq = dev->data->rx_queues[rx_queue_id];
+	fbd_num = hns3_read_dev(rxq, HNS3_RING_RX_FBDNUM_REG);
+	if (dev->rx_pkt_burst == hns3_recv_pkts_vec ||
+	    dev->rx_pkt_burst == hns3_recv_pkts_vec_sve)
+		driver_hold_bd_num = rxq->rx_rearm_nb;
+	else
+		driver_hold_bd_num = rxq->rx_free_hold;
+
+	if (fbd_num <= driver_hold_bd_num)
+		return 0;
+	else
+		return fbd_num - driver_hold_bd_num;
+}
diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h
index 4be9c4a..ae09e94 100644
--- a/drivers/net/hns3/hns3_rxtx.h
+++ b/drivers/net/hns3/hns3_rxtx.h
@@ -620,6 +620,7 @@  int hns3_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc,
 			struct rte_mempool *mp);
 int hns3_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc,
 			unsigned int socket, const struct rte_eth_txconf *conf);
+uint32_t hns3_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id);
 int hns3_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id);
 int hns3_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id);
 int hns3_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id);