All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junfeng Guo <junfeng.guo@intel.com>
To: jingjing.wu@intel.com
Cc: dev@dpdk.org, omkar.maslekar@intel.com,
	Junfeng Guo <junfeng.guo@intel.com>
Subject: [RFC v1] raw/ntb: add support for 6th Gen Intel Xeon
Date: Fri,  8 Dec 2023 16:07:59 +0800	[thread overview]
Message-ID: <20231208080759.3484405-1-junfeng.guo@intel.com> (raw)
In-Reply-To: <20230915070816.893282-1-junfeng.guo@intel.com>

Add support for the 6th Gen Intel Xeon Scalable processors. Note that NTB
devices within the 6th Gen Intel Xeon compliant to PCIe 5.0 spec.

Signed-off-by: Junfeng Guo <junfeng.guo@intel.com>
---
Depends-on: series-30460 \
	("raw/ntb: refactor to support NTB on 5th Gen Intel Xeon")
---
 doc/guides/rawdevs/ntb.rst     |  1 +
 drivers/raw/ntb/ntb.c          |  2 ++
 drivers/raw/ntb/ntb.h          |  1 +
 drivers/raw/ntb/ntb_hw_intel.c | 66 +++++++++++++++++-----------------
 drivers/raw/ntb/ntb_hw_intel.h | 40 ++++++++++++---------
 usertools/dpdk-devbind.py      |  2 +-
 6 files changed, 61 insertions(+), 51 deletions(-)

diff --git a/doc/guides/rawdevs/ntb.rst b/doc/guides/rawdevs/ntb.rst
index ee452af4fd..e663b7a088 100644
--- a/doc/guides/rawdevs/ntb.rst
+++ b/doc/guides/rawdevs/ntb.rst
@@ -153,6 +153,7 @@ Limitation
 
 This PMD is only supported on Intel Xeon Platforms:
 
+- 6th Generation Intel® Xeon® Scalable Processors. (NTB GEN5 device id: 0x0DB4)
 - 5th Generation Intel® Xeon® Scalable Processors. (NTB GEN4 device id: 0x347E)
 - 4th Generation Intel® Xeon® Scalable Processors. (NTB GEN4 device id: 0x347E)
 - 3rd Generation Intel® Xeon® Scalable Processors. (NTB GEN4 device id: 0x347E)
diff --git a/drivers/raw/ntb/ntb.c b/drivers/raw/ntb/ntb.c
index 2a163eff60..f1e48b877d 100644
--- a/drivers/raw/ntb/ntb.c
+++ b/drivers/raw/ntb/ntb.c
@@ -26,6 +26,7 @@
 static const struct rte_pci_id pci_id_ntb_map[] = {
 	{ RTE_PCI_DEVICE(NTB_INTEL_VENDOR_ID, NTB_INTEL_DEV_ID_B2B_GEN3) },
 	{ RTE_PCI_DEVICE(NTB_INTEL_VENDOR_ID, NTB_INTEL_DEV_ID_B2B_GEN4) },
+	{ RTE_PCI_DEVICE(NTB_INTEL_VENDOR_ID, NTB_INTEL_DEV_ID_B2B_GEN5) },
 	{ .vendor_id = 0, /* sentinel */ },
 };
 
@@ -1380,6 +1381,7 @@ ntb_init_hw(struct rte_rawdev *dev, struct rte_pci_device *pci_dev)
 	switch (pci_dev->id.device_id) {
 	case NTB_INTEL_DEV_ID_B2B_GEN3:
 	case NTB_INTEL_DEV_ID_B2B_GEN4:
+	case NTB_INTEL_DEV_ID_B2B_GEN5:
 		hw->ntb_ops = &intel_ntb_ops;
 		break;
 	default:
diff --git a/drivers/raw/ntb/ntb.h b/drivers/raw/ntb/ntb.h
index d2e6d566ed..adbc164b48 100644
--- a/drivers/raw/ntb/ntb.h
+++ b/drivers/raw/ntb/ntb.h
@@ -19,6 +19,7 @@ extern int ntb_logtype;
 /* Device IDs */
 #define NTB_INTEL_DEV_ID_B2B_GEN3   0x201C
 #define NTB_INTEL_DEV_ID_B2B_GEN4   0x347E
+#define NTB_INTEL_DEV_ID_B2B_GEN5   0x0DB4
 
 /* Reserved to app to use. */
 #define NTB_SPAD_USER               "spad_user_"
diff --git a/drivers/raw/ntb/ntb_hw_intel.c b/drivers/raw/ntb/ntb_hw_intel.c
index 3e2094437f..76dce5e95f 100644
--- a/drivers/raw/ntb/ntb_hw_intel.c
+++ b/drivers/raw/ntb/ntb_hw_intel.c
@@ -98,7 +98,7 @@ intel_ntb4_check_ppd_for_ICX(struct ntb_hw *hw, uint32_t reg_val)
 }
 
 static int
-intel_ntb4_check_ppd(struct ntb_hw *hw)
+intel_ntb4_5_check_ppd(struct ntb_hw *hw)
 {
 	uint8_t revision_id;
 	uint32_t reg_val;
@@ -112,7 +112,7 @@ intel_ntb4_check_ppd(struct ntb_hw *hw)
 		return -EIO;
 	}
 
-	reg_val = rte_read32(hw->hw_addr + XEON_NTB4_PPD1_OFFSET);
+	reg_val = rte_read32(hw->hw_addr + XEON_NTB4_5_PPD1_OFFSET);
 
 	/* Distinguish HW platform (3rd Gen Xeon) via PCI Revision ID */
 	if (revision_id <= NTB_PCI_DEV_REVISION_ICX_MAX &&
@@ -120,8 +120,8 @@ intel_ntb4_check_ppd(struct ntb_hw *hw)
 		return intel_ntb4_check_ppd_for_ICX(hw, reg_val);
 
 	/* Check connection topo type. Only support B2B. */
-	switch (reg_val & XEON_NTB4_PPD_CONN_MASK) {
-	case XEON_NTB4_PPD_CONN_B2B:
+	switch (reg_val & XEON_NTB4_5_PPD_CONN_MASK) {
+	case XEON_NTB4_5_PPD_CONN_B2B:
 		NTB_LOG(INFO, "Topo B2B (back to back) is using.");
 		break;
 	default:
@@ -130,12 +130,12 @@ intel_ntb4_check_ppd(struct ntb_hw *hw)
 	}
 
 	/* Check device config status. */
-	switch (reg_val & XEON_NTB4_PPD_DEV_MASK) {
-	case XEON_NTB4_PPD_DEV_DSD:
+	switch (reg_val & XEON_NTB4_5_PPD_DEV_MASK) {
+	case XEON_NTB4_5_PPD_DEV_DSD:
 		NTB_LOG(INFO, "DSD, Downstream Device.");
 		hw->topo = NTB_TOPO_B2B_DSD;
 		break;
-	case XEON_NTB4_PPD_DEV_USD:
+	case XEON_NTB4_5_PPD_DEV_USD:
 		NTB_LOG(INFO, "USD, Upstream device.");
 		hw->topo = NTB_TOPO_B2B_USD;
 		break;
@@ -161,9 +161,9 @@ intel_ntb_dev_init(const struct rte_rawdev *dev)
 	if (is_gen3_ntb(hw->pci_dev))
 		/* PPD is in config space for NTB Gen3 */
 		ret = intel_ntb3_check_ppd(hw);
-	else if (is_gen4_ntb(hw->pci_dev))
-		/* PPD is in MMIO for NTB Gen4 */
-		ret = intel_ntb4_check_ppd(hw);
+	else if (is_gen4_ntb(hw->pci_dev) || is_gen5_ntb(hw->pci_dev))
+		/* PPD is in MMIO for NTB Gen4/5 */
+		ret = intel_ntb4_5_check_ppd(hw);
 	else {
 		NTB_LOG(ERR, "Cannot init device for unsupported device.");
 		return -ENOTSUP;
@@ -264,9 +264,9 @@ intel_ntb_mw_set_trans(const struct rte_rawdev *dev, int mw_idx,
 		base &= ~0xf;
 		limit = base + size;
 		rte_write64(limit, limit_addr);
-	} else if (is_gen4_ntb(hw->pci_dev)) {
+	} else if (is_gen4_ntb(hw->pci_dev) || is_gen5_ntb(hw->pci_dev)) {
 		/* Set translate base address index register */
-		xlat_off = XEON_NTB4_IM1XBASEIDX_OFFSET +
+		xlat_off = XEON_NTB4_5_IM1XBASEIDX_OFFSET +
 			   mw_idx * XEON_XBASEIDX_INTERVAL;
 		xlat_addr = hw->hw_addr + xlat_off;
 		rte_write16(rte_log2_u64(size), xlat_addr);
@@ -321,8 +321,8 @@ intel_ntb_get_link_status(const struct rte_rawdev *dev)
 			NTB_LOG(ERR, "Unable to get link status.");
 			return -EIO;
 		}
-	} else if (is_gen4_ntb(hw->pci_dev)) {
-		reg_off = XEON_NTB4_LINK_STATUS_OFFSET;
+	} else if (is_gen4_ntb(hw->pci_dev) || is_gen5_ntb(hw->pci_dev)) {
+		reg_off = XEON_NTB4_5_LINK_STATUS_OFFSET;
 		reg_val = rte_read16(hw->hw_addr + reg_off);
 	} else {
 		NTB_LOG(ERR, "Cannot get link status for unsupported device.");
@@ -368,7 +368,7 @@ intel_ntb_gen3_set_link(const struct ntb_hw *hw, bool up)
 }
 
 static int
-intel_ntb_gen4_set_link(const struct ntb_hw *hw, bool up)
+intel_ntb_gen4_5_set_link(const struct ntb_hw *hw, bool up)
 {
 	uint32_t ntb_ctrl, ppd0;
 	uint16_t link_ctrl;
@@ -380,20 +380,20 @@ intel_ntb_gen4_set_link(const struct ntb_hw *hw, bool up)
 		ntb_ctrl |= NTB_CTL_P2S_BAR4_SNOOP | NTB_CTL_S2P_BAR4_SNOOP;
 		rte_write32(ntb_ctrl, reg_addr);
 
-		reg_addr = hw->hw_addr + XEON_NTB4_LINK_CTRL_OFFSET;
+		reg_addr = hw->hw_addr + XEON_NTB4_5_LINK_CTRL_OFFSET;
 		link_ctrl = rte_read16(reg_addr);
-		link_ctrl &= ~XEON_NTB4_LINK_CTRL_LINK_DIS;
+		link_ctrl &= ~XEON_NTB4_5_LINK_CTRL_LINK_DIS;
 		rte_write16(link_ctrl, reg_addr);
 
 		/* start link training */
-		reg_addr = hw->hw_addr + XEON_NTB4_PPD0_OFFSET;
+		reg_addr = hw->hw_addr + XEON_NTB4_5_PPD0_OFFSET;
 		ppd0 = rte_read32(reg_addr);
-		ppd0 |= XEON_NTB4_PPD_LINKTRN;
+		ppd0 |= XEON_NTB4_5_PPD_LINKTRN;
 		rte_write32(ppd0, reg_addr);
 
 		/* make sure link training has started */
 		ppd0 = rte_read32(reg_addr);
-		if (!(ppd0 & XEON_NTB4_PPD_LINKTRN)) {
+		if (!(ppd0 & XEON_NTB4_5_PPD_LINKTRN)) {
 			NTB_LOG(ERR, "Link is not training.");
 			return -EINVAL;
 		}
@@ -404,9 +404,9 @@ intel_ntb_gen4_set_link(const struct ntb_hw *hw, bool up)
 		ntb_ctrl &= ~(NTB_CTL_P2S_BAR4_SNOOP | NTB_CTL_S2P_BAR4_SNOOP);
 		rte_write32(ntb_ctrl, reg_addr);
 
-		reg_addr = hw->hw_addr + XEON_NTB4_LINK_CTRL_OFFSET;
+		reg_addr = hw->hw_addr + XEON_NTB4_5_LINK_CTRL_OFFSET;
 		link_ctrl = rte_read16(reg_addr);
-		link_ctrl |= XEON_NTB4_LINK_CTRL_LINK_DIS;
+		link_ctrl |= XEON_NTB4_5_LINK_CTRL_LINK_DIS;
 		rte_write16(link_ctrl, reg_addr);
 	}
 
@@ -421,8 +421,8 @@ intel_ntb_set_link(const struct rte_rawdev *dev, bool up)
 
 	if (is_gen3_ntb(hw->pci_dev))
 		ret = intel_ntb_gen3_set_link(hw, up);
-	else if (is_gen4_ntb(hw->pci_dev))
-		ret = intel_ntb_gen4_set_link(hw, up);
+	else if (is_gen4_ntb(hw->pci_dev) || is_gen5_ntb(hw->pci_dev))
+		ret = intel_ntb_gen4_5_set_link(hw, up);
 	else {
 		NTB_LOG(ERR, "Cannot set link for unsupported device.");
 		ret = -ENOTSUP;
@@ -447,8 +447,8 @@ intel_ntb_spad_read(const struct rte_rawdev *dev, int spad, bool peer)
 	if (is_gen3_ntb(hw->pci_dev))
 		reg_off = peer ? XEON_NTB3_B2B_SPAD_OFFSET :
 				XEON_IM_SPAD_OFFSET;
-	else if (is_gen4_ntb(hw->pci_dev))
-		reg_off = peer ? XEON_NTB4_B2B_SPAD_OFFSET :
+	else if (is_gen4_ntb(hw->pci_dev) || is_gen5_ntb(hw->pci_dev))
+		reg_off = peer ? XEON_NTB4_5_B2B_SPAD_OFFSET :
 				XEON_IM_SPAD_OFFSET;
 	else {
 		NTB_LOG(ERR, "Cannot read spad for unsupported device.");
@@ -477,8 +477,8 @@ intel_ntb_spad_write(const struct rte_rawdev *dev, int spad,
 	if (is_gen3_ntb(hw->pci_dev))
 		reg_off = peer ? XEON_NTB3_B2B_SPAD_OFFSET :
 				XEON_IM_SPAD_OFFSET;
-	else if (is_gen4_ntb(hw->pci_dev))
-		reg_off = peer ? XEON_NTB4_B2B_SPAD_OFFSET :
+	else if (is_gen4_ntb(hw->pci_dev) || is_gen5_ntb(hw->pci_dev))
+		reg_off = peer ? XEON_NTB4_5_B2B_SPAD_OFFSET :
 				XEON_IM_SPAD_OFFSET;
 	else {
 		NTB_LOG(ERR, "Cannot write spad for unsupported device.");
@@ -516,9 +516,9 @@ intel_ntb_db_clear(const struct rte_rawdev *dev, uint64_t db_bits)
 	db_off = XEON_IM_INT_STATUS_OFFSET;
 	db_addr = hw->hw_addr + db_off;
 
-	if (is_gen4_ntb(hw->pci_dev))
-		rte_write16(XEON_NTB4_SLOTSTS_DLLSCS,
-			    hw->hw_addr + XEON_NTB4_SLOTSTS);
+	if (is_gen4_ntb(hw->pci_dev) || is_gen5_ntb(hw->pci_dev))
+		rte_write16(XEON_NTB4_5_SLOTSTS_DLLSCS,
+			    hw->hw_addr + XEON_NTB4_5_SLOTSTS);
 	rte_write64(db_bits, db_addr);
 
 	return 0;
@@ -578,8 +578,8 @@ intel_ntb_vector_bind(const struct rte_rawdev *dev, uint8_t intr, uint8_t msix)
 	/* Bind intr source to msix vector */
 	if (is_gen3_ntb(hw->pci_dev))
 		reg_off = XEON_NTB3_INTVEC_OFFSET;
-	else if (is_gen4_ntb(hw->pci_dev))
-		reg_off = XEON_NTB4_INTVEC_OFFSET;
+	else if (is_gen4_ntb(hw->pci_dev) || is_gen5_ntb(hw->pci_dev))
+		reg_off = XEON_NTB4_5_INTVEC_OFFSET;
 	else {
 		NTB_LOG(ERR, "Cannot bind vectors for unsupported device.");
 		return -ENOTSUP;
diff --git a/drivers/raw/ntb/ntb_hw_intel.h b/drivers/raw/ntb/ntb_hw_intel.h
index 5a45785b57..404dfcf2fc 100644
--- a/drivers/raw/ntb/ntb_hw_intel.h
+++ b/drivers/raw/ntb/ntb_hw_intel.h
@@ -42,11 +42,11 @@
 #define XEON_CORERRSTS_OFFSET		0x0158
 #define XEON_NTB3_LINK_STATUS_OFFSET	0x01a2
 /* Link status and PPD are in MMIO but not config space for Gen4/5 NTB */
-#define XEON_NTB4_PPD0_OFFSET		0xb0d4
-#define XEON_NTB4_PPD1_OFFSET		0xb4c0
-#define XEON_NTB4_LINK_CTRL_OFFSET	0xb050
-#define XEON_NTB4_LINK_STATUS_OFFSET	0xb052
-#define XEON_NTB4_LINK_CTRL_LINK_DIS	0x0010
+#define XEON_NTB4_5_PPD0_OFFSET		0xb0d4
+#define XEON_NTB4_5_PPD1_OFFSET		0xb4c0
+#define XEON_NTB4_5_LINK_CTRL_OFFSET	0xb050
+#define XEON_NTB4_5_LINK_STATUS_OFFSET	0xb052
+#define XEON_NTB4_5_LINK_CTRL_LINK_DIS	0x0010
 
 
 #define XEON_NTBCNTL_OFFSET		0x0000
@@ -56,16 +56,16 @@
 #define XEON_IMBAR2XBASE_OFFSET		0x0020		/* SBAR4XLAT */
 #define XEON_IMBAR2XLMT_OFFSET		0x0028		/* SBAR4LMT */
 #define XEON_XBASEIDX_INTERVAL		0x0002
-#define XEON_NTB4_IM1XBASEIDX_OFFSET	0x0074
-#define XEON_NTB4_IM2XBASEIDX_OFFSET	0x0076
+#define XEON_NTB4_5_IM1XBASEIDX_OFFSET	0x0074
+#define XEON_NTB4_5_IM2XBASEIDX_OFFSET	0x0076
 #define XEON_IM_INT_STATUS_OFFSET	0x0040
 #define XEON_IM_INT_DISABLE_OFFSET	0x0048
 #define XEON_IM_SPAD_OFFSET		0x0080		/* SPAD */
 #define XEON_NTB3_B2B_SPAD_OFFSET	0x0180		/* NTB GEN3 B2B SPAD */
-#define XEON_NTB4_B2B_SPAD_OFFSET	0x8080		/* NTB GEN4/5 B2B SPAD */
+#define XEON_NTB4_5_B2B_SPAD_OFFSET	0x8080		/* NTB GEN4/5 B2B SPAD */
 #define XEON_USMEMMISS_OFFSET		0x0070
 #define XEON_NTB3_INTVEC_OFFSET		0x00d0
-#define XEON_NTB4_INTVEC_OFFSET		0x0050
+#define XEON_NTB4_5_INTVEC_OFFSET	0x0050
 #define XEON_IM_DOORBELL_OFFSET		0x0100		/* SDOORBELL0 */
 #define XEON_EMBAR0XBASE_OFFSET		0x4008		/* B2B_XLAT */
 #define XEON_EMBAR1XBASE_OFFSET		0x4010		/* PBAR2XLAT */
@@ -95,15 +95,15 @@
 #define XEON_GEN3_NTB4_PPD_DEV_DSD	0x1000
 #define XEON_GEN3_NTB4_PPD_DEV_USD	0x0000
 
-#define XEON_NTB4_PPD_CONN_MASK		0x0700
-#define XEON_NTB4_PPD_CONN_B2B		0x0200
-#define XEON_NTB4_PPD_DEV_MASK		0x4000
-#define XEON_NTB4_PPD_DEV_DSD		0x4000
-#define XEON_NTB4_PPD_DEV_USD		0x0000
+#define XEON_NTB4_5_PPD_CONN_MASK	0x0700
+#define XEON_NTB4_5_PPD_CONN_B2B	0x0200
+#define XEON_NTB4_5_PPD_DEV_MASK	0x4000
+#define XEON_NTB4_5_PPD_DEV_DSD		0x4000
+#define XEON_NTB4_5_PPD_DEV_USD		0x0000
 
-#define XEON_NTB4_PPD_LINKTRN		0x0008
-#define XEON_NTB4_SLOTSTS		0xb05a
-#define XEON_NTB4_SLOTSTS_DLLSCS	0x100
+#define XEON_NTB4_5_PPD_LINKTRN		0x0008
+#define XEON_NTB4_5_SLOTSTS		0xb05a
+#define XEON_NTB4_5_SLOTSTS_DLLSCS	0x100
 
 #define XEON_MW_COUNT			2
 
@@ -129,4 +129,10 @@ is_gen4_ntb(const struct rte_pci_device *pci_dev)
 	return pci_dev->id.device_id == NTB_INTEL_DEV_ID_B2B_GEN4;
 }
 
+static inline bool
+is_gen5_ntb(const struct rte_pci_device *pci_dev)
+{
+	return pci_dev->id.device_id == NTB_INTEL_DEV_ID_B2B_GEN5;
+}
+
 #endif /* _NTB_HW_INTEL_H_ */
diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py
index 230c81c5f3..6cfe2aa7ed 100755
--- a/usertools/dpdk-devbind.py
+++ b/usertools/dpdk-devbind.py
@@ -60,7 +60,7 @@
                   'SVendor': None, 'SDevice': None}
 intel_idxd_spr = {'Class': '08', 'Vendor': '8086', 'Device': '0b25',
                   'SVendor': None, 'SDevice': None}
-intel_ntb = {'Class': '06', 'Vendor': '8086', 'Device': '201c,347e',
+intel_ntb = {'Class': '06', 'Vendor': '8086', 'Device': '201c,347e,0db4',
              'SVendor': None, 'SDevice': None}
 
 cnxk_sso = {'Class': '08', 'Vendor': '177d', 'Device': 'a0f9,a0fa',
-- 
2.34.1


  parent reply	other threads:[~2023-12-08  8:10 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-15  7:08 [PATCH] raw/ntb: add support for 5th and 6th Gen Intel Xeon Junfeng Guo
2023-09-15  9:14 ` Wu, Jingjing
2023-09-18  2:25   ` Guo, Junfeng
2023-12-08  8:07 ` Junfeng Guo [this message]
2024-10-07 20:14   ` [RFC v1] raw/ntb: add support for " Stephen Hemminger

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=20231208080759.3484405-1-junfeng.guo@intel.com \
    --to=junfeng.guo@intel.com \
    --cc=dev@dpdk.org \
    --cc=jingjing.wu@intel.com \
    --cc=omkar.maslekar@intel.com \
    /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.