[PATCH] pci: define more standard register offsets

David Marchand david.marchand at redhat.com
Wed Apr 16 08:10:34 CEST 2025


The PCI standard defines registers for:
- subsystem id,
- revision id,
- status of the device,
- vital product data,

Add them to rte_pci.h and use in existing drivers.

Signed-off-by: David Marchand <david.marchand at redhat.com>
---
 drivers/dma/hisilicon/hisi_dmadev.c |  3 +--
 drivers/dma/hisilicon/hisi_dmadev.h |  1 -
 drivers/net/bnxt/bnxt_ethdev.c      |  8 ++++----
 drivers/net/bnxt/bnxt_util.h        |  2 --
 drivers/net/cxgbe/base/adapter.h    | 17 +++++++++--------
 drivers/net/hns3/hns3_common.c      |  5 ++---
 drivers/net/hns3/hns3_ethdev.h      |  5 +----
 drivers/net/intel/e1000/em_rxtx.c   | 17 ++++++-----------
 drivers/raw/ntb/ntb_hw_intel.c      |  5 ++---
 drivers/raw/ntb/ntb_hw_intel.h      |  3 ---
 lib/pci/rte_pci.h                   | 10 ++++++++++
 11 files changed, 35 insertions(+), 41 deletions(-)

diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c
index fdd2fa225f..019c4a8189 100644
--- a/drivers/dma/hisilicon/hisi_dmadev.c
+++ b/drivers/dma/hisilicon/hisi_dmadev.c
@@ -883,8 +883,7 @@ hisi_dma_check_revision(struct rte_pci_device *pci_dev, const char *name,
 	uint8_t revision;
 	int ret;
 
-	ret = rte_pci_read_config(pci_dev, &revision, 1,
-				  HISI_DMA_PCI_REVISION_ID_REG);
+	ret = rte_pci_read_config(pci_dev, &revision, 1, RTE_PCI_REVISION_ID);
 	if (ret != 1) {
 		HISI_DMA_LOG(ERR, "%s read PCI revision failed!", name);
 		return -EINVAL;
diff --git a/drivers/dma/hisilicon/hisi_dmadev.h b/drivers/dma/hisilicon/hisi_dmadev.h
index 786fe3cc0e..90301e6b00 100644
--- a/drivers/dma/hisilicon/hisi_dmadev.h
+++ b/drivers/dma/hisilicon/hisi_dmadev.h
@@ -24,7 +24,6 @@
 
 #define PCI_VENDOR_ID_HUAWEI			0x19e5
 #define HISI_DMA_DEVICE_ID			0xA122
-#define HISI_DMA_PCI_REVISION_ID_REG		0x08
 #define HISI_DMA_REVISION_HIP08B		0x21
 
 #define HISI_DMA_MAX_HW_QUEUES			4
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 2f37f5aa10..8213ff9e4b 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -4585,10 +4585,10 @@ bnxt_check_fw_reset_done(struct bnxt *bp)
 	int rc;
 
 	do {
-		rc = rte_pci_read_config(bp->pdev, &val, sizeof(val), PCI_SUBSYSTEM_ID_OFFSET);
+		rc = rte_pci_read_config(bp->pdev, &val, sizeof(val), RTE_PCI_SUBSYSTEM_ID);
 		if (rc < 0) {
 			PMD_DRV_LOG_LINE(ERR, "Failed to read PCI offset 0x%x",
-				PCI_SUBSYSTEM_ID_OFFSET);
+				RTE_PCI_SUBSYSTEM_ID);
 			return rc;
 		}
 		if (val != 0xffff)
@@ -4823,10 +4823,10 @@ void bnxt_dev_reset_and_resume(void *arg)
 	 * we can poll this config register immediately for the value to revert.
 	 */
 	if (bp->flags & BNXT_FLAG_FATAL_ERROR) {
-		rc = rte_pci_read_config(bp->pdev, &val, sizeof(val), PCI_SUBSYSTEM_ID_OFFSET);
+		rc = rte_pci_read_config(bp->pdev, &val, sizeof(val), RTE_PCI_SUBSYSTEM_ID);
 		if (rc < 0) {
 			PMD_DRV_LOG_LINE(ERR, "Failed to read PCI offset 0x%x",
-				PCI_SUBSYSTEM_ID_OFFSET);
+				RTE_PCI_SUBSYSTEM_ID);
 			return;
 		}
 		if (val == 0xffff) {
diff --git a/drivers/net/bnxt/bnxt_util.h b/drivers/net/bnxt/bnxt_util.h
index b265f5841b..416a6a2609 100644
--- a/drivers/net/bnxt/bnxt_util.h
+++ b/drivers/net/bnxt/bnxt_util.h
@@ -13,8 +13,6 @@
 #define BIT_MASK(len) (BIT(len) - 1)
 #endif /* BIT_MASK */
 
-#define PCI_SUBSYSTEM_ID_OFFSET	0x2e
-
 int bnxt_check_zero_bytes(const uint8_t *bytes, int len);
 void bnxt_eth_hw_addr_random(uint8_t *mac_addr);
 uint8_t hweight32(uint32_t word32);
diff --git a/drivers/net/cxgbe/base/adapter.h b/drivers/net/cxgbe/base/adapter.h
index d490c6f158..207f3ecb88 100644
--- a/drivers/net/cxgbe/base/adapter.h
+++ b/drivers/net/cxgbe/base/adapter.h
@@ -512,14 +512,15 @@ static inline void t4_write_reg64(struct adapter *adapter, u32 reg_addr,
 }
 
 #define PCI_CAP_ID_EXP          RTE_PCI_CAP_ID_EXP
-#define PCI_EXP_DEVCTL          0x0008  /* Device control */
-#define PCI_EXP_DEVCTL2         40      /* Device Control 2 */
-#define PCI_EXP_DEVCTL_EXT_TAG  0x0100  /* Extended Tag Field Enable */
-#define PCI_EXP_DEVCTL_PAYLOAD  0x00E0  /* Max payload */
-#define PCI_CAP_ID_VPD          0x03    /* Vital Product Data */
-#define PCI_VPD_ADDR            2       /* Address to access (15 bits!) */
-#define PCI_VPD_ADDR_F          0x8000  /* Write 0, 1 indicates completion */
-#define PCI_VPD_DATA            4       /* 32-bits of data returned here */
+#define PCI_EXP_DEVCTL          RTE_PCI_EXP_DEVCTL
+#define PCI_EXP_DEVCTL_EXT_TAG  RTE_PCI_EXP_DEVCTL_EXT_TAG
+#define PCI_EXP_DEVCTL_PAYLOAD  RTE_PCI_EXP_DEVCTL_PAYLOAD
+#define PCI_EXP_DEVCTL2         RTE_PCI_EXP_DEVCTL2
+
+#define PCI_CAP_ID_VPD          RTE_PCI_CAP_ID_VPD
+#define PCI_VPD_ADDR            RTE_PCI_VPD_ADDR
+#define PCI_VPD_ADDR_F          RTE_PCI_VPD_ADDR_F
+#define PCI_VPD_DATA            RTE_PCI_VPD_DATA
 
 /**
  * t4_os_pci_write_cfg4 - 32-bit write to PCI config space
diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c
index 25a45212be..1ad04444d0 100644
--- a/drivers/net/hns3/hns3_common.c
+++ b/drivers/net/hns3/hns3_common.c
@@ -944,9 +944,8 @@ hns3_get_pci_revision_id(struct hns3_hw *hw, uint8_t *revision_id)
 
 	eth_dev = &rte_eth_devices[hw->data->port_id];
 	pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-	ret = rte_pci_read_config(pci_dev, &revision, HNS3_PCI_REVISION_ID_LEN,
-				  HNS3_PCI_REVISION_ID);
-	if (ret != HNS3_PCI_REVISION_ID_LEN) {
+	ret = rte_pci_read_config(pci_dev, &revision, 1, RTE_PCI_REVISION_ID);
+	if (ret != 1) {
 		hns3_err(hw, "failed to read pci revision id, ret = %d", ret);
 		return -EIO;
 	}
diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h
index 7824503bb8..085a83773f 100644
--- a/drivers/net/hns3/hns3_ethdev.h
+++ b/drivers/net/hns3/hns3_ethdev.h
@@ -32,10 +32,7 @@
 #define HNS3_DEV_ID_100G_VF			0xA22E
 #define HNS3_DEV_ID_100G_RDMA_PFC_VF		0xA22F
 
-/* PCI Config offsets */
-#define HNS3_PCI_REVISION_ID			0x08
-#define HNS3_PCI_REVISION_ID_LEN		1
-
+/* Revision IDs */
 #define PCI_REVISION_ID_HIP08_B			0x21
 #define PCI_REVISION_ID_HIP09_A			0x30
 
diff --git a/drivers/net/intel/e1000/em_rxtx.c b/drivers/net/intel/e1000/em_rxtx.c
index df5fbb7823..e3d8967a5c 100644
--- a/drivers/net/intel/e1000/em_rxtx.c
+++ b/drivers/net/intel/e1000/em_rxtx.c
@@ -59,11 +59,6 @@
 #define E1000_TX_OFFLOAD_NOTSUP_MASK \
 		(RTE_MBUF_F_TX_OFFLOAD_MASK ^ E1000_TX_OFFLOAD_MASK)
 
-/* PCI offset for querying configuration status register */
-#define PCI_CFG_STATUS_REG                 0x06
-#define FLUSH_DESC_REQUIRED               0x100
-
-
 /**
  * Structure associated with each descriptor of the RX ring of a RX queue.
  */
@@ -2107,26 +2102,26 @@ em_flush_desc_rings(struct rte_eth_dev *dev)
 			fextnvm11 | E1000_FEXTNVM11_DISABLE_MULR_FIX);
 	tdlen = E1000_READ_REG(hw, E1000_TDLEN(0));
 	ret = rte_pci_read_config(pci_dev, &pci_cfg_status,
-		   sizeof(pci_cfg_status), PCI_CFG_STATUS_REG);
+		   sizeof(pci_cfg_status), RTE_PCI_STATUS);
 	if (ret < 0) {
 		PMD_DRV_LOG(ERR, "Failed to read PCI offset 0x%x",
-			    PCI_CFG_STATUS_REG);
+			    RTE_PCI_STATUS);
 		return;
 	}
 
 	/* do nothing if we're not in faulty state, or if the queue is empty */
-	if ((pci_cfg_status & FLUSH_DESC_REQUIRED) && tdlen) {
+	if ((pci_cfg_status & RTE_PCI_STATUS_PARITY) && tdlen) {
 		/* flush desc ring */
 		e1000_flush_tx_ring(dev);
 		ret = rte_pci_read_config(pci_dev, &pci_cfg_status,
-				sizeof(pci_cfg_status), PCI_CFG_STATUS_REG);
+				sizeof(pci_cfg_status), RTE_PCI_STATUS);
 		if (ret < 0) {
 			PMD_DRV_LOG(ERR, "Failed to read PCI offset 0x%x",
-					PCI_CFG_STATUS_REG);
+					RTE_PCI_STATUS);
 			return;
 		}
 
-		if (pci_cfg_status & FLUSH_DESC_REQUIRED)
+		if (pci_cfg_status & RTE_PCI_STATUS_PARITY)
 			e1000_flush_rx_ring(dev);
 	}
 }
diff --git a/drivers/raw/ntb/ntb_hw_intel.c b/drivers/raw/ntb/ntb_hw_intel.c
index 9b4465176a..956f411ea3 100644
--- a/drivers/raw/ntb/ntb_hw_intel.c
+++ b/drivers/raw/ntb/ntb_hw_intel.c
@@ -145,9 +145,8 @@ intel_ntb4_check_ppd(struct ntb_hw *hw)
 	int ret;
 
 	ret = rte_pci_read_config(hw->pci_dev, &revision_id,
-				  NTB_PCI_DEV_REVISION_ID_LEN,
-				  NTB_PCI_DEV_REVISION_ID_REG);
-	if (ret != NTB_PCI_DEV_REVISION_ID_LEN) {
+				  1, RTE_PCI_REVISION_ID);
+	if (ret != 1) {
 		NTB_LOG(ERR, "Cannot get NTB PCI Device Revision ID.");
 		return -EIO;
 	}
diff --git a/drivers/raw/ntb/ntb_hw_intel.h b/drivers/raw/ntb/ntb_hw_intel.h
index 9587104f80..e6bf4a29d5 100644
--- a/drivers/raw/ntb/ntb_hw_intel.h
+++ b/drivers/raw/ntb/ntb_hw_intel.h
@@ -9,9 +9,6 @@
 #define NTB_PCI_DEV_REVISION_ICX_MIN	0x02
 #define NTB_PCI_DEV_REVISION_ICX_MAX	0x0F
 
-#define NTB_PCI_DEV_REVISION_ID_REG	0x08
-#define NTB_PCI_DEV_REVISION_ID_LEN	1
-
 /* Ntb control and link status */
 #define NTB_CTL_CFG_LOCK		1
 #define NTB_CTL_DISABLE			2
diff --git a/lib/pci/rte_pci.h b/lib/pci/rte_pci.h
index 9a50a12142..9d04978a0f 100644
--- a/lib/pci/rte_pci.h
+++ b/lib/pci/rte_pci.h
@@ -35,7 +35,9 @@ extern "C" {
 #define RTE_PCI_DEVICE_ID	0x02	/* 16 bits */
 #define RTE_PCI_COMMAND		0x04	/* 16 bits */
 #define RTE_PCI_STATUS		0x06	/* 16 bits */
+#define RTE_PCI_REVISION_ID	0x08	/* 8 bits */
 #define RTE_PCI_BASE_ADDRESS_0	0x10	/* 32 bits */
+#define RTE_PCI_SUBSYSTEM_ID	0x2e	/* 32 bits */
 #define RTE_PCI_CAPABILITY_LIST	0x34	/* 32 bits */
 
 /* PCI Command Register (RTE_PCI_COMMAND) */
@@ -45,12 +47,14 @@ extern "C" {
 
 /* PCI Status Register (RTE_PCI_STATUS) */
 #define RTE_PCI_STATUS_CAP_LIST		0x10	/* Support Capability List */
+#define RTE_PCI_STATUS_PARITY		0x100	/* Detected parity error */
 
 /* Base addresses (RTE_PCI_BASE_ADDRESS_*) */
 #define RTE_PCI_BASE_ADDRESS_SPACE_IO	0x01
 
 /* Capability registers (RTE_PCI_CAPABILITY_LIST) */
 #define RTE_PCI_CAP_ID_PM		0x01	/* Power Management */
+#define RTE_PCI_CAP_ID_VPD		0x03	/* Vital Product Data */
 #define RTE_PCI_CAP_ID_MSI		0x05	/* Message Signalled Interrupts */
 #define RTE_PCI_CAP_ID_VNDR		0x09	/* Vendor-Specific */
 #define RTE_PCI_CAP_ID_EXP		0x10	/* PCI Express */
@@ -64,10 +68,16 @@ extern "C" {
 #define RTE_PCI_PM_CTRL_PME_ENABLE	0x0100	/* PME pin enable */
 #define RTE_PCI_PM_CTRL_PME_STATUS	0x8000	/* PME pin status */
 
+/* Vital Product Data (RTE_PCI_CAP_ID_VPD) */
+#define RTE_PCI_VPD_ADDR		2	/* Address to access (15 bits!) */
+#define RTE_PCI_VPD_ADDR_F		0x8000	/* Write 0, 1 indicates completion */
+#define RTE_PCI_VPD_DATA		4	/* 32-bits of data returned here */
+
 /* PCI Express capability registers (RTE_PCI_CAP_ID_EXP) */
 #define RTE_PCI_EXP_TYPE_RC_EC		0xa	/* Root Complex Event Collector */
 #define RTE_PCI_EXP_DEVCTL		0x08	/* Device Control */
 #define RTE_PCI_EXP_DEVCTL_PAYLOAD	0x00e0	/* Max_Payload_Size */
+#define RTE_PCI_EXP_DEVCTL_EXT_TAG	0x0100	/* Extended Tag Field Enable */
 #define RTE_PCI_EXP_DEVCTL_READRQ	0x7000	/* Max_Read_Request_Size */
 #define RTE_PCI_EXP_DEVCTL_BCR_FLR	0x8000	/* Bridge Configuration Retry / FLR */
 #define RTE_PCI_EXP_DEVSTA		0x0a	/* Device Status */
-- 
2.49.0



More information about the dev mailing list