Blame SOURCES/bnxt-dpdk-0001-net-bnxt-cache-address-of-doorbell-to-subsequent-acc.patch

a6040a
From 02bd8182658600ebf2cbe61168e80c19ce4cdaa5 Mon Sep 17 00:00:00 2001
a6040a
Message-Id: <02bd8182658600ebf2cbe61168e80c19ce4cdaa5.1524241750.git.dcaratti@redhat.com>
a6040a
From: Ajit Khaparde <ajit.khaparde@broadcom.com>
a6040a
Date: Fri, 20 Apr 2018 07:22:00 -0700
a6040a
Subject: [PATCH 1/3] net/bnxt: cache address of doorbell to subsequent access
a6040a
a6040a
While creating TX, Rx, CQ rings use cached DB address instead of
a6040a
getting it from the PCI memory resource.
a6040a
a6040a
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
a6040a
---
a6040a
 drivers/net/bnxt/bnxt.h        |  1 +
a6040a
 drivers/net/bnxt/bnxt_cpr.c    |  2 +-
a6040a
 drivers/net/bnxt/bnxt_ethdev.c | 12 ++++++++++++
a6040a
 drivers/net/bnxt/bnxt_ring.c   | 17 +++++------------
a6040a
 4 files changed, 19 insertions(+), 13 deletions(-)
a6040a
a6040a
backport notes:
a6040a
 - use RTE_LOG in place of PMD_DRV_LOG (missing upstream commit
a6040a
   3e92fd4e4ec0 ("net/bnxt: use dynamic log type")
a6040a
a6040a
--- a/drivers/net/bnxt/bnxt.h
a6040a
+++ b/drivers/net/bnxt/bnxt.h
a6040a
@@ -188,6 +188,7 @@ struct bnxt {
a6040a
 	struct rte_eth_dev		*eth_dev;
a6040a
 	struct rte_eth_rss_conf		rss_conf;
a6040a
 	struct rte_pci_device		*pdev;
a6040a
+	void				*doorbell_base;
a6040a
 
a6040a
 	uint32_t		flags;
a6040a
 #define BNXT_FLAG_REGISTERED	(1 << 0)
a6040a
--- a/drivers/net/bnxt/bnxt_cpr.c
a6040a
+++ b/drivers/net/bnxt/bnxt_cpr.c
a6040a
@@ -163,7 +163,7 @@ int bnxt_alloc_def_cp_ring(struct bnxt *
a6040a
 				  HWRM_NA_SIGNATURE);
a6040a
 	if (rc)
a6040a
 		goto err_out;
a6040a
-	cpr->cp_doorbell = bp->pdev->mem_resource[2].addr;
a6040a
+	cpr->cp_doorbell = (char *)bp->doorbell_base;
a6040a
 	B_CP_DIS_DB(cpr, cpr->cp_raw_cons);
a6040a
 	bp->grp_info[0].cp_fw_ring_id = cp_ring->fw_ring_id;
a6040a
 	if (BNXT_PF(bp))
a6040a
--- a/drivers/net/bnxt/bnxt_ethdev.c
a6040a
+++ b/drivers/net/bnxt/bnxt_ethdev.c
a6040a
@@ -2769,11 +2769,23 @@ static int bnxt_init_board(struct rte_et
a6040a
 		rc = -ENOMEM;
a6040a
 		goto init_err_release;
a6040a
 	}
a6040a
+
a6040a
+	if (!pci_dev->mem_resource[2].addr) {
a6040a
+		RTE_LOG(ERR, PMD,
a6040a
+			"Cannot find PCI device BAR 2 address, aborting\n");
a6040a
+		rc = -ENODEV;
a6040a
+		goto init_err_release;
a6040a
+	} else {
a6040a
+		bp->doorbell_base = (void *)pci_dev->mem_resource[2].addr;
a6040a
+	}
a6040a
+
a6040a
 	return 0;
a6040a
 
a6040a
 init_err_release:
a6040a
 	if (bp->bar0)
a6040a
 		bp->bar0 = NULL;
a6040a
+	if (bp->doorbell_base)
a6040a
+		bp->doorbell_base = NULL;
a6040a
 
a6040a
 init_err_disable:
a6040a
 
a6040a
--- a/drivers/net/bnxt/bnxt_ring.c
a6040a
+++ b/drivers/net/bnxt/bnxt_ring.c
a6040a
@@ -281,7 +281,6 @@ int bnxt_alloc_rings(struct bnxt *bp, ui
a6040a
  */
a6040a
 int bnxt_alloc_hwrm_rings(struct bnxt *bp)
a6040a
 {
a6040a
-	struct rte_pci_device *pci_dev = bp->pdev;
a6040a
 	unsigned int i;
a6040a
 	int rc = 0;
a6040a
 
a6040a
@@ -303,8 +302,7 @@ int bnxt_alloc_hwrm_rings(struct bnxt *b
a6040a
 					HWRM_NA_SIGNATURE);
a6040a
 		if (rc)
a6040a
 			goto err_out;
a6040a
-		cpr->cp_doorbell = (char *)pci_dev->mem_resource[2].addr +
a6040a
-		    idx * 0x80;
a6040a
+		cpr->cp_doorbell = (char *)bp->doorbell_base + idx * 0x80;
a6040a
 		bp->grp_info[i].cp_fw_ring_id = cp_ring->fw_ring_id;
a6040a
 		B_CP_DIS_DB(cpr, cpr->cp_raw_cons);
a6040a
 
a6040a
@@ -316,8 +314,7 @@ int bnxt_alloc_hwrm_rings(struct bnxt *b
a6040a
 		if (rc)
a6040a
 			goto err_out;
a6040a
 		rxr->rx_prod = 0;
a6040a
-		rxr->rx_doorbell = (char *)pci_dev->mem_resource[2].addr +
a6040a
-		    idx * 0x80;
a6040a
+		rxr->rx_doorbell = (char *)bp->doorbell_base + idx * 0x80;
a6040a
 		bp->grp_info[i].rx_fw_ring_id = ring->fw_ring_id;
a6040a
 		B_RX_DB(rxr->rx_doorbell, rxr->rx_prod);
a6040a
 
a6040a
@@ -336,9 +333,7 @@ int bnxt_alloc_hwrm_rings(struct bnxt *b
a6040a
 			goto err_out;
a6040a
 		RTE_LOG(DEBUG, PMD, "Alloc AGG Done!\n");
a6040a
 		rxr->ag_prod = 0;
a6040a
-		rxr->ag_doorbell =
a6040a
-		    (char *)pci_dev->mem_resource[2].addr +
a6040a
-		    map_idx * 0x80;
a6040a
+		rxr->ag_doorbell = (char *)bp->doorbell_base + map_idx * 0x80;
a6040a
 		bp->grp_info[i].ag_fw_ring_id = ring->fw_ring_id;
a6040a
 		B_RX_DB(rxr->ag_doorbell, rxr->ag_prod);
a6040a
 
a6040a
@@ -373,8 +368,7 @@ int bnxt_alloc_hwrm_rings(struct bnxt *b
a6040a
 		if (rc)
a6040a
 			goto err_out;
a6040a
 
a6040a
-		cpr->cp_doorbell = (char *)pci_dev->mem_resource[2].addr +
a6040a
-		    idx * 0x80;
a6040a
+		cpr->cp_doorbell = (char *)bp->doorbell_base + idx * 0x80;
a6040a
 		B_CP_DIS_DB(cpr, cpr->cp_raw_cons);
a6040a
 
a6040a
 		/* Tx ring */
a6040a
@@ -385,8 +379,7 @@ int bnxt_alloc_hwrm_rings(struct bnxt *b
a6040a
 		if (rc)
a6040a
 			goto err_out;
a6040a
 
a6040a
-		txr->tx_doorbell = (char *)pci_dev->mem_resource[2].addr +
a6040a
-		    idx * 0x80;
a6040a
+		txr->tx_doorbell = (char *)bp->doorbell_base + idx * 0x80;
a6040a
 		txq->index = idx;
a6040a
 	}
a6040a