All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ajit Khaparde <ajit.khaparde@broadcom.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH 1/2] net/bnxt: add support for runtime queue setup
Date: Fri, 25 Jun 2021 15:34:00 -0700	[thread overview]
Message-ID: <20210625223401.45505-2-ajit.khaparde@broadcom.com> (raw)
In-Reply-To: <20210625223401.45505-1-ajit.khaparde@broadcom.com>

[-- Attachment #1: Type: text/plain, Size: 9287 bytes --]

Add support for runtime Rx and Tx queue setup. This will allow
Rx/Tx queue setup after the interface is started.

Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
---
 drivers/net/bnxt/bnxt_ethdev.c |  2 ++
 drivers/net/bnxt/bnxt_hwrm.c   | 46 ++++++++++++++++++++++++------
 drivers/net/bnxt/bnxt_hwrm.h   |  3 ++
 drivers/net/bnxt/bnxt_ring.c   | 51 ++++++++++++++++++++++++++++++++++
 drivers/net/bnxt/bnxt_rxq.c    | 12 ++------
 drivers/net/bnxt/bnxt_txq.c    |  2 ++
 drivers/net/bnxt/bnxt_txr.c    |  6 ++++
 7 files changed, 105 insertions(+), 17 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 4d51a209f9..495c6cd21e 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -987,6 +987,8 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
 	dev_info->flow_type_rss_offloads = BNXT_ETH_RSS_SUPPORT;
 
 	dev_info->speed_capa = bnxt_get_speed_capabilities(bp);
+	dev_info->dev_capa = RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
+			     RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
 
 	dev_info->default_rxconf = (struct rte_eth_rxconf) {
 		.rx_thresh = {
diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 6c4f83ee3b..1a4968abe6 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -1917,7 +1917,7 @@ int bnxt_hwrm_stat_clear(struct bnxt *bp, struct bnxt_cp_ring_info *cpr)
 	return rc;
 }
 
-static int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp, struct bnxt_cp_ring_info *cpr)
+int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp, struct bnxt_cp_ring_info *cpr)
 {
 	int rc;
 	struct hwrm_stat_ctx_alloc_input req = {.req_type = 0 };
@@ -2637,10 +2637,11 @@ int bnxt_alloc_all_hwrm_stat_ctxs(struct bnxt *bp)
 			cpr = rxq->cp_ring;
 		}
 
-		rc = bnxt_hwrm_stat_ctx_alloc(bp, cpr);
-
-		if (rc)
-			return rc;
+		if (cpr->hw_stats_ctx_id == HWRM_NA_SIGNATURE) {
+			rc = bnxt_hwrm_stat_ctx_alloc(bp, cpr);
+			if (rc)
+				return rc;
+		}
 	}
 	return rc;
 }
@@ -2720,6 +2721,12 @@ void bnxt_free_hwrm_rx_ring(struct bnxt *bp, int queue_index)
 			bp->grp_info[queue_index].ag_fw_ring_id =
 							INVALID_HW_RING_ID;
 	}
+
+	if (cpr->hw_stats_ctx_id != HWRM_NA_SIGNATURE) {
+		bnxt_hwrm_stat_ctx_free(bp, cpr);
+		cpr->hw_stats_ctx_id = HWRM_NA_SIGNATURE;
+	}
+
 	if (cpr->cp_ring_struct->fw_ring_id != INVALID_HW_RING_ID)
 		bnxt_free_cp_ring(bp, cpr);
 
@@ -5093,7 +5100,6 @@ static int
 bnxt_vnic_rss_configure_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic)
 {
 	struct hwrm_vnic_rss_cfg_output *resp = bp->hwrm_cmd_resp_addr;
-	uint8_t *rx_queue_state = bp->eth_dev->data->rx_queue_state;
 	struct hwrm_vnic_rss_cfg_input req = {.req_type = 0 };
 	struct bnxt_rx_queue **rxqs = bp->rx_queues;
 	uint16_t *ring_tbl = vnic->rss_table;
@@ -5127,8 +5133,7 @@ bnxt_vnic_rss_configure_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic)
 
 			/* Find next active ring. */
 			for (cnt = 0; cnt < max_rings; cnt++) {
-				if (rx_queue_state[k] !=
-						RTE_ETH_QUEUE_STATE_STOPPED)
+				if (rxqs[k]->rx_started)
 					break;
 				if (++k == max_rings)
 					k = 0;
@@ -6194,3 +6199,28 @@ int bnxt_hwrm_read_sfp_module_eeprom_info(struct bnxt *bp, uint16_t i2c_addr,
 
 	return rc;
 }
+
+void bnxt_free_hwrm_tx_ring(struct bnxt *bp, int queue_index)
+{
+	struct bnxt_tx_queue *txq = bp->tx_queues[queue_index];
+	struct bnxt_tx_ring_info *txr = txq->tx_ring;
+	struct bnxt_ring *ring = txr->tx_ring_struct;
+	struct bnxt_cp_ring_info *cpr = txq->cp_ring;
+
+	if (ring->fw_ring_id != INVALID_HW_RING_ID) {
+		bnxt_hwrm_ring_free(bp, ring,
+				    HWRM_RING_FREE_INPUT_RING_TYPE_TX,
+				    cpr->cp_ring_struct->fw_ring_id);
+		ring->fw_ring_id = INVALID_HW_RING_ID;
+	}
+
+	if (cpr->hw_stats_ctx_id != HWRM_NA_SIGNATURE) {
+		bnxt_hwrm_stat_ctx_free(bp, cpr);
+		cpr->hw_stats_ctx_id = HWRM_NA_SIGNATURE;
+	}
+
+	if (cpr->cp_ring_struct->fw_ring_id != INVALID_HW_RING_ID) {
+		bnxt_free_cp_ring(bp, cpr);
+		cpr->cp_ring_struct->fw_ring_id = INVALID_HW_RING_ID;
+	}
+}
diff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h
index 057f7f94d0..ec3414f0c6 100644
--- a/drivers/net/bnxt/bnxt_hwrm.h
+++ b/drivers/net/bnxt/bnxt_hwrm.h
@@ -304,4 +304,7 @@ int bnxt_hwrm_ring_stats(struct bnxt *bp, uint32_t cid, int idx,
 int bnxt_hwrm_read_sfp_module_eeprom_info(struct bnxt *bp, uint16_t i2c_addr,
 					  uint16_t page_number, uint16_t start_addr,
 					  uint16_t data_length, uint8_t *buf);
+int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp, struct bnxt_cp_ring_info *cpr);
+void bnxt_free_hwrm_tx_ring(struct bnxt *bp, int queue_index);
+int bnxt_alloc_hwrm_tx_ring(struct bnxt *bp, int queue_index);
 #endif
diff --git a/drivers/net/bnxt/bnxt_ring.c b/drivers/net/bnxt/bnxt_ring.c
index cb18dfba7f..9ec0c10911 100644
--- a/drivers/net/bnxt/bnxt_ring.c
+++ b/drivers/net/bnxt/bnxt_ring.c
@@ -599,6 +599,10 @@ int bnxt_alloc_hwrm_rx_ring(struct bnxt *bp, int queue_index)
 	if (rc)
 		goto err_out;
 
+	rc = bnxt_hwrm_stat_ctx_alloc(bp, cpr);
+	if (rc)
+		goto err_out;
+
 	if (BNXT_HAS_RING_GRPS(bp)) {
 		bp->grp_info[queue_index].fw_stats_ctx = cpr->hw_stats_ctx_id;
 		bp->grp_info[queue_index].cp_fw_ring_id = cp_ring->fw_ring_id;
@@ -837,3 +841,50 @@ int bnxt_alloc_async_ring_struct(struct bnxt *bp)
 	return bnxt_alloc_rings(bp, bp->eth_dev->device->numa_node, 0, NULL,
 				NULL, bp->async_cp_ring, NULL, "def_cp");
 }
+
+int bnxt_alloc_hwrm_tx_ring(struct bnxt *bp, int queue_index)
+{
+	struct bnxt_tx_queue *txq = bp->tx_queues[queue_index];
+	struct bnxt_cp_ring_info *cpr = txq->cp_ring;
+	struct bnxt_ring *cp_ring = cpr->cp_ring_struct;
+	struct bnxt_tx_ring_info *txr = txq->tx_ring;
+	struct bnxt_ring *ring = txr->tx_ring_struct;
+	unsigned int idx = queue_index + bp->rx_cp_nr_rings;
+	uint16_t tx_cosq_id = 0;
+	struct bnxt_coal coal;
+	int rc = 0;
+
+	rc = bnxt_alloc_cmpl_ring(bp, idx, cpr);
+	if (rc)
+		goto err_out;
+
+	bnxt_init_dflt_coal(&coal);
+	bnxt_hwrm_set_ring_coal(bp, &coal, cp_ring->fw_ring_id);
+
+	rc = bnxt_hwrm_stat_ctx_alloc(bp, cpr);
+	if (rc)
+		goto err_out;
+
+	if (bp->vnic_cap_flags & BNXT_VNIC_CAP_COS_CLASSIFY)
+		tx_cosq_id = bp->tx_cosq_id[queue_index < bp->max_lltc ? queue_index : 0];
+	else
+		tx_cosq_id = bp->tx_cosq_id[0];
+
+	rc = bnxt_hwrm_ring_alloc(bp, ring,
+				  HWRM_RING_ALLOC_INPUT_RING_TYPE_TX,
+				  queue_index, cpr->hw_stats_ctx_id,
+				  cp_ring->fw_ring_id,
+				  tx_cosq_id);
+	if (rc)
+		goto err_out;
+
+	bnxt_set_db(bp, &txr->tx_db, HWRM_RING_ALLOC_INPUT_RING_TYPE_TX,
+		    queue_index, ring->fw_ring_id,
+		    ring->ring_mask);
+	txq->index = idx;
+
+	return rc;
+err_out:
+	bnxt_free_hwrm_tx_ring(bp, queue_index);
+	return rc;
+}
diff --git a/drivers/net/bnxt/bnxt_rxq.c b/drivers/net/bnxt/bnxt_rxq.c
index 44b09e9c61..bbcb3b06e7 100644
--- a/drivers/net/bnxt/bnxt_rxq.c
+++ b/drivers/net/bnxt/bnxt_rxq.c
@@ -248,6 +248,7 @@ void bnxt_rx_queue_release_op(void *rx_queue)
 		if (is_bnxt_in_error(rxq->bp))
 			return;
 
+		bnxt_free_hwrm_rx_ring(rxq->bp, rxq->queue_id);
 		bnxt_rx_queue_release_mbufs(rxq);
 
 		/* Free RX ring hardware descriptors */
@@ -286,7 +287,6 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
 	uint64_t rx_offloads = eth_dev->data->dev_conf.rxmode.offloads;
 	struct bnxt_rx_queue *rxq;
 	int rc = 0;
-	uint8_t queue_state;
 
 	rc = is_bnxt_in_error(bp);
 	if (rc)
@@ -360,14 +360,8 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
 	else
 		rxq->rx_deferred_start = rx_conf->rx_deferred_start;
 
-	if (rxq->rx_deferred_start) {
-		queue_state = RTE_ETH_QUEUE_STATE_STOPPED;
-		rxq->rx_started = false;
-	} else {
-		queue_state = RTE_ETH_QUEUE_STATE_STARTED;
-		rxq->rx_started = true;
-	}
-	eth_dev->data->rx_queue_state[queue_idx] = queue_state;
+	rxq->rx_started = rxq->rx_deferred_start ? false : true;
+	rxq->vnic = BNXT_GET_DEFAULT_VNIC(bp);
 
 	/* Configure mtu if it is different from what was configured before */
 	if (!queue_idx)
diff --git a/drivers/net/bnxt/bnxt_txq.c b/drivers/net/bnxt/bnxt_txq.c
index bc789224d2..830416af3d 100644
--- a/drivers/net/bnxt/bnxt_txq.c
+++ b/drivers/net/bnxt/bnxt_txq.c
@@ -8,6 +8,7 @@
 #include <rte_malloc.h>
 
 #include "bnxt.h"
+#include "bnxt_hwrm.h"
 #include "bnxt_ring.h"
 #include "bnxt_txq.h"
 #include "bnxt_txr.h"
@@ -61,6 +62,7 @@ void bnxt_tx_queue_release_op(void *tx_queue)
 			return;
 
 		/* Free TX ring hardware descriptors */
+		bnxt_free_hwrm_tx_ring(txq->bp, txq->queue_id);
 		bnxt_tx_queue_release_mbufs(txq);
 		if (txq->tx_ring) {
 			bnxt_free_ring(txq->tx_ring->tx_ring_struct);
diff --git a/drivers/net/bnxt/bnxt_txr.c b/drivers/net/bnxt/bnxt_txr.c
index 8eb9493997..9a6b96e04a 100644
--- a/drivers/net/bnxt/bnxt_txr.c
+++ b/drivers/net/bnxt/bnxt_txr.c
@@ -9,6 +9,7 @@
 #include <rte_malloc.h>
 
 #include "bnxt.h"
+#include "bnxt_hwrm.h"
 #include "bnxt_ring.h"
 #include "bnxt_txq.h"
 #include "bnxt_txr.h"
@@ -547,6 +548,11 @@ int bnxt_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 	if (rc)
 		return rc;
 
+	bnxt_free_hwrm_tx_ring(bp, tx_queue_id);
+	rc = bnxt_alloc_hwrm_tx_ring(bp, tx_queue_id);
+	if (rc)
+		return rc;
+
 	dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
 	txq->tx_started = true;
 	PMD_DRV_LOG(DEBUG, "Tx queue started\n");
-- 
2.21.1 (Apple Git-122.3)


  reply	other threads:[~2021-06-25 22:34 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-25 22:33 [dpdk-dev] [PATCH 0/2] bet/bnxt: add runtime queue setup support Ajit Khaparde
2021-06-25 22:34 ` Ajit Khaparde [this message]
2021-06-25 22:34 ` [dpdk-dev] [PATCH 2/2] net/bnxt: fix ring alloc and free logic Ajit Khaparde
2021-06-29 19:44 ` [dpdk-dev] [PATCH 0/2] bet/bnxt: add runtime queue setup support Ajit Khaparde

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210625223401.45505-2-ajit.khaparde@broadcom.com \
    --to=ajit.khaparde@broadcom.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.