git: 3a9565c2a8e4 - main - bnxt_re: Add support to display board_id in ibv_devinfo output

From: Sumit Saxena <ssaxena_at_FreeBSD.org>
Date: Tue, 27 Jan 2026 12:16:26 UTC
The branch main has been updated by ssaxena:

URL: https://cgit.FreeBSD.org/src/commit/?id=3a9565c2a8e4f1b3da698bf6a8af5889dc4fefbd

commit 3a9565c2a8e4f1b3da698bf6a8af5889dc4fefbd
Author:     Sreekanth Reddy <sreekanth.reddy@broadcom.com>
AuthorDate: 2026-01-23 16:38:02 +0000
Commit:     Sumit Saxena <ssaxena@FreeBSD.org>
CommitDate: 2026-01-27 12:13:09 +0000

    bnxt_re: Add support to display board_id in ibv_devinfo output
    
    Added support to display board_id in ibv_devinfo output.
    ibv_devinfo util reads the board_id from below sysctl
    attribute, so added this sysctl attribute.
    
    sys.class.infiniband.bnxt_reX.board_id
    
    Reviewed by: ssaxena
    Differential Revision: https://reviews.freebsd.org/D54524
    MFC after: 3 days
---
 sys/dev/bnxt/bnxt_en/bnxt.h     |  1 +
 sys/dev/bnxt/bnxt_en/bnxt_ulp.c |  1 +
 sys/dev/bnxt/bnxt_en/bnxt_ulp.h |  2 ++
 sys/dev/bnxt/bnxt_en/if_bnxt.c  |  7 +++++++
 sys/dev/bnxt/bnxt_re/main.c     | 21 ++++++++++++++++++++-
 5 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/sys/dev/bnxt/bnxt_en/bnxt.h b/sys/dev/bnxt/bnxt_en/bnxt.h
index 5556914fb61e..64482a656e9d 100644
--- a/sys/dev/bnxt/bnxt_en/bnxt.h
+++ b/sys/dev/bnxt/bnxt_en/bnxt.h
@@ -1340,6 +1340,7 @@ struct bnxt_softc {
 	unsigned long		fw_reset_timestamp;
 
 	struct bnxt_fw_health	*fw_health;
+	char			board_partno[64];
 };
 
 struct bnxt_filter_info {
diff --git a/sys/dev/bnxt/bnxt_en/bnxt_ulp.c b/sys/dev/bnxt/bnxt_en/bnxt_ulp.c
index 677c9c99b74e..c6d862a36a9a 100644
--- a/sys/dev/bnxt/bnxt_en/bnxt_ulp.c
+++ b/sys/dev/bnxt/bnxt_en/bnxt_ulp.c
@@ -463,6 +463,7 @@ static inline void bnxt_set_edev_info(struct bnxt_en_dev *edev, struct bnxt_soft
 	edev->hwrm_bar = bp->hwrm_bar;
 	edev->port_partition_type = bp->port_partition_type;
 	edev->ulp_version = BNXT_ULP_VERSION;
+	memcpy(edev->board_part_number, bp->board_partno, BNXT_VPD_PN_FLD_LEN - 1);
 }
 
 int bnxt_rdma_aux_device_del(struct bnxt_softc *softc)
diff --git a/sys/dev/bnxt/bnxt_en/bnxt_ulp.h b/sys/dev/bnxt/bnxt_en/bnxt_ulp.h
index 7d7ecbd2f536..53bb51b07135 100644
--- a/sys/dev/bnxt/bnxt_en/bnxt_ulp.h
+++ b/sys/dev/bnxt/bnxt_en/bnxt_ulp.h
@@ -127,6 +127,8 @@ struct bnxt_en_dev {
 	struct bnxt_bar_info		hwrm_bar;
 	u32				espeed;
 	uint8_t				lanes;
+	#define BNXT_VPD_PN_FLD_LEN     32
+        char                            board_part_number[BNXT_VPD_PN_FLD_LEN];
 };
 
 struct bnxt_en_ops {
diff --git a/sys/dev/bnxt/bnxt_en/if_bnxt.c b/sys/dev/bnxt/bnxt_en/if_bnxt.c
index 94775457b7e3..dea6fd68181e 100644
--- a/sys/dev/bnxt/bnxt_en/if_bnxt.c
+++ b/sys/dev/bnxt/bnxt_en/if_bnxt.c
@@ -2674,6 +2674,13 @@ bnxt_attach_pre(if_ctx_t ctx)
 	softc->state_bv = bit_alloc(BNXT_STATE_MAX, M_DEVBUF,
 			M_WAITOK|M_ZERO);
 
+	if (BNXT_PF(softc)) {
+		const char *part_num;
+
+		if (pci_get_vpd_readonly(softc->dev, "PN", &part_num) == 0)
+			snprintf(softc->board_partno, sizeof(softc->board_partno), "%s", part_num);
+	}
+
 	return (rc);
 
 failed:
diff --git a/sys/dev/bnxt/bnxt_re/main.c b/sys/dev/bnxt/bnxt_re/main.c
index eb21c770ca5f..dc68854157a0 100644
--- a/sys/dev/bnxt/bnxt_re/main.c
+++ b/sys/dev/bnxt/bnxt_re/main.c
@@ -2031,11 +2031,30 @@ static ssize_t show_hca(struct device *device, struct device_attribute *attr,
 	return scnprintf(buf, PAGE_SIZE, "%s\n", rdev->ibdev.node_desc);
 }
 
+static ssize_t show_board_id(struct device *device, struct device_attribute *attr,
+				char *buf)
+{
+	struct bnxt_re_dev *rdev = to_bnxt_re_dev(device, ibdev.dev);
+	char buffer[BNXT_VPD_PN_FLD_LEN] = {};
+
+	if (!rdev->is_virtfn)
+		memcpy(buffer, rdev->en_dev->board_part_number,
+			BNXT_VPD_PN_FLD_LEN - 1);
+	else
+		scnprintf(buffer, BNXT_VPD_PN_FLD_LEN,
+			"0x%x-VF", rdev->en_dev->pdev->device);
+
+	return scnprintf(buf, PAGE_SIZE, "%s\n", buffer);
+}
+
 static DEVICE_ATTR(hw_rev, 0444, show_rev, NULL);
 static DEVICE_ATTR(hca_type, 0444, show_hca, NULL);
+static DEVICE_ATTR(board_id, 0444, show_board_id, NULL);
+
 static struct device_attribute *bnxt_re_attributes[] = {
 	&dev_attr_hw_rev,
-	&dev_attr_hca_type
+	&dev_attr_hca_type,
+	&dev_attr_board_id
 };
 
 int ib_register_device_compat(struct bnxt_re_dev *rdev)