Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 4 Sep 2025 02:45:33 GMT
From:      Jake Freeland <jfree@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 9404c479946c - main - pci_user: Report NUMA domain
Message-ID:  <202509040245.5842jXvV085511@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by jfree:

URL: https://cgit.FreeBSD.org/src/commit/?id=9404c479946c00b6ac94253d2037c47251dc606c

commit 9404c479946c00b6ac94253d2037c47251dc606c
Author:     Jake Freeland <jfree@FreeBSD.org>
AuthorDate: 2025-09-04 02:42:23 +0000
Commit:     Jake Freeland <jfree@FreeBSD.org>
CommitDate: 2025-09-04 02:42:23 +0000

    pci_user: Report NUMA domain
    
    A PCI device's NUMA domain is now accessible via the pd_numa_domain
    member of struct pci_conf when using the PCIOCGETCONF ioctl.
    
    A new ioctl number has been assigned to PCIOCGETCONF to preserve
    compatibility with binaries compiled on FreeBSD versions 7 through 14.
    Such binaries can continue to use the PCIOCGETCONF ioctl number
    that they were compiled with and experience no ABI repercussions.
    
    Reviewed by:    imp, markj
    Differential Revision:  https://reviews.freebsd.org/D44289
---
 share/man/man4/pci.4   |   4 +-
 sys/dev/pci/pci_user.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++-
 sys/sys/pciio.h        |   3 +-
 3 files changed, 116 insertions(+), 4 deletions(-)

diff --git a/share/man/man4/pci.4 b/share/man/man4/pci.4
index 91fbb557f644..5237b6bc7adc 100644
--- a/share/man/man4/pci.4
+++ b/share/man/man4/pci.4
@@ -22,7 +22,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd April 2, 2025
+.Dd August 20, 2025
 .Dt PCI 4
 .Os
 .Sh NAME
@@ -235,6 +235,8 @@ revision ID.
 Driver name.
 .It pd_unit
 Driver unit number.
+.It pd_numa_domain
+Driver NUMA domain.
 .El
 .It offset
 The offset is passed in by the user to tell the kernel where it should
diff --git a/sys/dev/pci/pci_user.c b/sys/dev/pci/pci_user.c
index f68b5b7e71ff..5090ecb3dd7c 100644
--- a/sys/dev/pci/pci_user.c
+++ b/sys/dev/pci/pci_user.c
@@ -79,6 +79,7 @@ struct pci_conf32 {
 	u_int8_t	pc_revid;	/* chip revision ID */
 	char		pd_name[PCI_MAXNAMELEN + 1];  /* device name */
 	u_int32_t	pd_unit;	/* device unit number */
+	int		pd_numa_domain;	/* device NUMA domain */
 };
 
 struct pci_match_conf32 {
@@ -502,11 +503,58 @@ pci_conf_match_freebsd6_32(struct pci_match_conf_freebsd6_32 *matches, int num_m
 #endif	/* COMPAT_FREEBSD32 */
 #endif	/* !PRE7_COMPAT */
 
+#ifdef COMPAT_FREEBSD14
+struct pci_conf_freebsd14 {
+	struct pcisel	pc_sel;		/* domain+bus+slot+function */
+	u_int8_t	pc_hdr;		/* PCI header type */
+	u_int16_t	pc_subvendor;	/* card vendor ID */
+	u_int16_t	pc_subdevice;	/* card device ID, assigned by
+					   card vendor */
+	u_int16_t	pc_vendor;	/* chip vendor ID */
+	u_int16_t	pc_device;	/* chip device ID, assigned by
+					   chip vendor */
+	u_int8_t	pc_class;	/* chip PCI class */
+	u_int8_t	pc_subclass;	/* chip PCI subclass */
+	u_int8_t	pc_progif;	/* chip PCI programming interface */
+	u_int8_t	pc_revid;	/* chip revision ID */
+	char		pd_name[PCI_MAXNAMELEN + 1];  /* device name */
+	u_long		pd_unit;	/* device unit number */
+};
+#define	PCIOCGETCONF_FREEBSD14		_IOWR('p', 5, struct pci_conf_io)
+
+#ifdef COMPAT_FREEBSD32
+struct pci_conf_freebsd14_32 {
+	struct pcisel	pc_sel;		/* domain+bus+slot+function */
+	u_int8_t	pc_hdr;		/* PCI header type */
+	u_int16_t	pc_subvendor;	/* card vendor ID */
+	u_int16_t	pc_subdevice;	/* card device ID, assigned by
+					   card vendor */
+	u_int16_t	pc_vendor;	/* chip vendor ID */
+	u_int16_t	pc_device;	/* chip device ID, assigned by
+					   chip vendor */
+	u_int8_t	pc_class;	/* chip PCI class */
+	u_int8_t	pc_subclass;	/* chip PCI subclass */
+	u_int8_t	pc_progif;	/* chip PCI programming interface */
+	u_int8_t	pc_revid;	/* chip revision ID */
+	char		pd_name[PCI_MAXNAMELEN + 1];  /* device name */
+	u_int32_t	pd_unit;	/* device unit number */
+};
+#define	PCIOCGETCONF_FREEBSD14_32	\
+    _IOC_NEWTYPE(PCIOCGETCONF_FREEBSD14, struct pci_conf_io32)
+#endif /* COMPAT_FREEBSD32 */
+#endif /* COMPAT_FREEBSD14 */
+
 union pci_conf_union {
 	struct pci_conf			pc;
 #ifdef COMPAT_FREEBSD32
 	struct pci_conf32		pc32;
 #endif
+#ifdef COMPAT_FREEBSD14
+	struct pci_conf_freebsd14	pc14;
+#ifdef COMPAT_FREEBSD32
+	struct pci_conf_freebsd14_32	pc14_32;
+#endif
+#endif
 #ifdef PRE7_COMPAT
 	struct pci_conf_freebsd6	pco;
 #ifdef COMPAT_FREEBSD32
@@ -522,10 +570,16 @@ pci_conf_match(u_long cmd, struct pci_match_conf *matches, int num_matches,
 
 	switch (cmd) {
 	case PCIOCGETCONF:
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14:
+#endif
 		return (pci_conf_match_native(
 		    (struct pci_match_conf *)matches, num_matches, match_buf));
 #ifdef COMPAT_FREEBSD32
 	case PCIOCGETCONF32:
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14_32:
+#endif
 		return (pci_conf_match32((struct pci_match_conf32 *)matches,
 		    num_matches, match_buf));
 #endif
@@ -645,9 +699,15 @@ pci_match_conf_size(u_long cmd)
 
 	switch (cmd) {
 	case PCIOCGETCONF:
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14:
+#endif
 		return (sizeof(struct pci_match_conf));
 #ifdef COMPAT_FREEBSD32
 	case PCIOCGETCONF32:
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14_32:
+#endif
 		return (sizeof(struct pci_match_conf32));
 #endif
 #ifdef PRE7_COMPAT
@@ -675,6 +735,14 @@ pci_conf_size(u_long cmd)
 	case PCIOCGETCONF32:
 		return (sizeof(struct pci_conf32));
 #endif
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14:
+		return (sizeof(struct pci_conf_freebsd14));
+#ifdef COMPAT_FREEBSD32
+	case PCIOCGETCONF_FREEBSD14_32:
+		return (sizeof(struct pci_conf_freebsd14_32));
+#endif
+#endif
 #ifdef PRE7_COMPAT
 	case PCIOCGETCONF_FREEBSD6:
 		return (sizeof(struct pci_conf_freebsd6));
@@ -698,6 +766,9 @@ pci_conf_io_init(struct pci_conf_io *cio, caddr_t data, u_long cmd)
 
 	switch (cmd) {
 	case PCIOCGETCONF:
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14:
+#endif
 #ifdef PRE7_COMPAT
 	case PCIOCGETCONF_FREEBSD6:
 #endif
@@ -706,6 +777,9 @@ pci_conf_io_init(struct pci_conf_io *cio, caddr_t data, u_long cmd)
 
 #ifdef COMPAT_FREEBSD32
 	case PCIOCGETCONF32:
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14_32:
+#endif
 #ifdef PRE7_COMPAT
 	case PCIOCGETCONF_FREEBSD6_32:
 #endif
@@ -739,6 +813,9 @@ pci_conf_io_update_data(const struct pci_conf_io *cio, caddr_t data,
 
 	switch (cmd) {
 	case PCIOCGETCONF:
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14:
+#endif
 #ifdef PRE7_COMPAT
 	case PCIOCGETCONF_FREEBSD6:
 #endif
@@ -751,6 +828,9 @@ pci_conf_io_update_data(const struct pci_conf_io *cio, caddr_t data,
 
 #ifdef COMPAT_FREEBSD32
 	case PCIOCGETCONF32:
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14_32:
+#endif
 #ifdef PRE7_COMPAT
 	case PCIOCGETCONF_FREEBSD6_32:
 #endif
@@ -781,8 +861,17 @@ pci_conf_for_copyout(const struct pci_conf *pcp, union pci_conf_union *pcup,
 		pcup->pc = *pcp;
 		return;
 
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14:
+		memcpy(&pcup->pc14, pcp, sizeof(pcup->pc14));
+		return;
+#endif
+
 #ifdef COMPAT_FREEBSD32
 	case PCIOCGETCONF32:
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14_32:
+#endif
 		pcup->pc32.pc_sel = pcp->pc_sel;
 		pcup->pc32.pc_hdr = pcp->pc_hdr;
 		pcup->pc32.pc_subvendor = pcp->pc_subvendor;
@@ -796,8 +885,10 @@ pci_conf_for_copyout(const struct pci_conf *pcp, union pci_conf_union *pcup,
 		strlcpy(pcup->pc32.pd_name, pcp->pd_name,
 		    sizeof(pcup->pc32.pd_name));
 		pcup->pc32.pd_unit = (uint32_t)pcp->pd_unit;
+		if (cmd == PCIOCGETCONF32)
+			pcup->pc32.pd_numa_domain = pcp->pd_numa_domain;
 		return;
-#endif
+#endif /* COMPAT_FREEBSD32 */
 
 #ifdef PRE7_COMPAT
 #ifdef COMPAT_FREEBSD32
@@ -1024,7 +1115,7 @@ pci_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *t
 	struct pci_map *pm;
 	struct pci_bar_mmap *pbm;
 	size_t confsz, iolen;
-	int error, ionum, i, num_patterns;
+	int domain, error, ionum, i, num_patterns;
 	union pci_conf_union pcu;
 #ifdef PRE7_COMPAT
 	struct pci_io iodata;
@@ -1044,6 +1135,12 @@ pci_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *t
 #ifdef COMPAT_FREEBSD32
 		case PCIOCGETCONF32:
 #endif
+#ifdef COMPAT_FREEBSD14
+		case PCIOCGETCONF_FREEBSD14:
+#ifdef COMPAT_FREEBSD32
+		case PCIOCGETCONF_FREEBSD14_32:
+#endif
+#endif
 #ifdef PRE7_COMPAT
 		case PCIOCGETCONF_FREEBSD6:
 #ifdef COMPAT_FREEBSD32
@@ -1069,6 +1166,12 @@ pci_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *t
 #ifdef COMPAT_FREEBSD32
 	case PCIOCGETCONF32:
 #endif
+#ifdef COMPAT_FREEBSD14
+	case PCIOCGETCONF_FREEBSD14:
+#ifdef COMPAT_FREEBSD32
+	case PCIOCGETCONF_FREEBSD14_32:
+#endif
+#endif
 #ifdef PRE7_COMPAT
 	case PCIOCGETCONF_FREEBSD6:
 #ifdef COMPAT_FREEBSD32
@@ -1201,6 +1304,12 @@ pci_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *t
 				dinfo->conf.pd_unit = 0;
 			}
 
+			if (dinfo->cfg.dev != NULL &&
+			    bus_get_domain(dinfo->cfg.dev, &domain) == 0)
+				dinfo->conf.pd_numa_domain = domain;
+			else
+				dinfo->conf.pd_numa_domain = 0;
+
 			if (pattern_buf == NULL ||
 			    pci_conf_match(cmd, pattern_buf, num_patterns,
 			    &dinfo->conf) == 0) {
diff --git a/sys/sys/pciio.h b/sys/sys/pciio.h
index 6467e82b1b3d..351397ab9d9b 100644
--- a/sys/sys/pciio.h
+++ b/sys/sys/pciio.h
@@ -77,6 +77,7 @@ struct pci_conf {
 	u_int8_t	pc_revid;	/* chip revision ID */
 	char		pd_name[PCI_MAXNAMELEN + 1];  /* device name */
 	u_long		pd_unit;	/* device unit number */
+	int		pd_numa_domain;	/* device NUMA domain */
 };
 
 struct pci_match_conf {
@@ -165,7 +166,6 @@ struct pci_bar_ioreq {
 #define	PCIIO_BAR_MMAP_RW	0x04
 #define	PCIIO_BAR_MMAP_ACTIVATE	0x08
 
-#define	PCIOCGETCONF	_IOWR('p', 5, struct pci_conf_io)
 #define	PCIOCREAD	_IOWR('p', 2, struct pci_io)
 #define	PCIOCWRITE	_IOWR('p', 3, struct pci_io)
 #define	PCIOCATTACHED	_IOWR('p', 4, struct pci_io)
@@ -173,5 +173,6 @@ struct pci_bar_ioreq {
 #define	PCIOCLISTVPD	_IOWR('p', 7, struct pci_list_vpd_io)
 #define	PCIOCBARMMAP	_IOWR('p', 8, struct pci_bar_mmap)
 #define	PCIOCBARIO	_IOWR('p', 9, struct pci_bar_ioreq)
+#define	PCIOCGETCONF	_IOWR('p', 10, struct pci_conf_io)
 
 #endif /* !_SYS_PCIIO_H_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202509040245.5842jXvV085511>