* [PATCH v4 0/1] PCI/sysfs: Expose PCIe device serial number
@ 2025-07-17 16:22 Matthew Wood
2025-07-17 16:22 ` [PATCH v4 1/1] " Matthew Wood
0 siblings, 1 reply; 4+ messages in thread
From: Matthew Wood @ 2025-07-17 16:22 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Jonathan Cameron, Thomas Weißschuh, linux-pci, linux-kernel
Add a single sysfs read-only, admin-only interface for reading PCIe device
serial numbers from userspace, using the same hexadecimal 1-byte dashed
formatting as lspci serial number capability output:
more /sys/devices/pci0000:c0/0000:c0:01.1/0000:c1:00.0/0000:c2:1f.0/0000:ef:00.0/serial_number
00-80-ee-00-00-00-41-80
If a device doesn't support the serial number capability, the
serial_number sysfs attribute will not be visible.
Comparing serial number format to lspci output:
sudo lspci -vvv -s ef:00.0
ef:00.0 Serial Attached SCSI controller: Broadcom / LSI PCIe Switch management endpoint (rev b0)
Subsystem: Broadcom / LSI Device 0144
...
Capabilities: [100 v1] Device Serial Number 00-80-ee-00-00-00-41-80
...
This PCIe device sysfs attribute eliminates the need for parsing lspci
output (e.g. regexp) for userspace applications that utilize serial
numbers.
Matthew Wood (1):
PCI/sysfs: Expose PCIe device serial number
Documentation/ABI/testing/sysfs-bus-pci | 9 +++++++++
drivers/pci/pci-sysfs.c | 26 ++++++++++++++++++++++---
2 files changed, 32 insertions(+), 3 deletions(-)
--
2.50.0
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH v4 1/1] PCI/sysfs: Expose PCIe device serial number 2025-07-17 16:22 [PATCH v4 0/1] PCI/sysfs: Expose PCIe device serial number Matthew Wood @ 2025-07-17 16:22 ` Matthew Wood 2025-07-17 16:29 ` Mario Limonciello 0 siblings, 1 reply; 4+ messages in thread From: Matthew Wood @ 2025-07-17 16:22 UTC (permalink / raw) To: Bjorn Helgaas Cc: Mario Limonciello, Jonathan Cameron, Thomas Weißschuh, linux-kernel, linux-pci Add a single sysfs read-only interface for reading PCIe device serial numbers from userspace in a programmatic way. This device attribute uses the same hexadecimal 1-byte dashed formatting as lspci serial number capability output. If a device doesn't support the serial number capability, the device_serial_number sysfs attribute will not be visible. Signed-off-by: Matthew Wood <thepacketgeek@gmail.com> --- Documentation/ABI/testing/sysfs-bus-pci | 9 +++++++++ drivers/pci/pci-sysfs.c | 26 ++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci index 69f952fffec7..4da41471cc6b 100644 --- a/Documentation/ABI/testing/sysfs-bus-pci +++ b/Documentation/ABI/testing/sysfs-bus-pci @@ -612,3 +612,12 @@ Description: # ls doe_features 0001:01 0001:02 doe_discovery + +What: /sys/bus/pci/devices/.../serial_number +Date: July 2025 +Contact: Matthew Wood <thepacketgeek@gmail.com> +Description: + This is visible only for PCIe devices that support the serial + number extended capability. The file is read only and due to + the possible sensitivity of accessible serial numbers, admin + only. diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 268c69daa4d5..bc0e0add15d1 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -239,6 +239,22 @@ static ssize_t current_link_width_show(struct device *dev, } static DEVICE_ATTR_RO(current_link_width); +static ssize_t serial_number_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct pci_dev *pci_dev = to_pci_dev(dev); + u64 dsn; + + dsn = pci_get_dsn(pci_dev); + if (!dsn) + return -EIO; + + return sysfs_emit(buf, "%02llx-%02llx-%02llx-%02llx-%02llx-%02llx-%02llx-%02llx\n", + dsn >> 56, (dsn >> 48) & 0xff, (dsn >> 40) & 0xff, (dsn >> 32) & 0xff, + (dsn >> 24) & 0xff, (dsn >> 16) & 0xff, (dsn >> 8) & 0xff, dsn & 0xff); +} +static DEVICE_ATTR_ADMIN_RO(serial_number); + static ssize_t secondary_bus_number_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -660,6 +676,7 @@ static struct attribute *pcie_dev_attrs[] = { &dev_attr_current_link_width.attr, &dev_attr_max_link_width.attr, &dev_attr_max_link_speed.attr, + &dev_attr_serial_number.attr, NULL, }; @@ -1749,10 +1766,13 @@ static umode_t pcie_dev_attrs_are_visible(struct kobject *kobj, struct device *dev = kobj_to_dev(kobj); struct pci_dev *pdev = to_pci_dev(dev); - if (pci_is_pcie(pdev)) - return a->mode; + if (!pci_is_pcie(pdev)) + return 0; - return 0; + if (a == &dev_attr_serial_number.attr && !pci_get_dsn(pdev)) + return 0; + + return a->mode; } static const struct attribute_group pci_dev_group = { -- 2.50.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v4 1/1] PCI/sysfs: Expose PCIe device serial number 2025-07-17 16:22 ` [PATCH v4 1/1] " Matthew Wood @ 2025-07-17 16:29 ` Mario Limonciello 2025-07-17 16:33 ` Matthew Wood 0 siblings, 1 reply; 4+ messages in thread From: Mario Limonciello @ 2025-07-17 16:29 UTC (permalink / raw) To: Matthew Wood, Bjorn Helgaas Cc: Jonathan Cameron, Thomas Weißschuh, linux-kernel, linux-pci On 7/17/25 11:22 AM, Matthew Wood wrote: > Add a single sysfs read-only interface for reading PCIe device serial > numbers from userspace in a programmatic way. This device attribute > uses the same hexadecimal 1-byte dashed formatting as lspci serial number > capability output. If a device doesn't support the serial number > capability, the device_serial_number sysfs attribute will not be visible. You didn't update the commit message here for 'serial_number'. > > Signed-off-by: Matthew Wood <thepacketgeek@gmail.com> With the commit and below comment fixed you can add this to your next spin. Reviewed-by: Mario Limonciello <superm1@kernel.org> > --- > Documentation/ABI/testing/sysfs-bus-pci | 9 +++++++++ > drivers/pci/pci-sysfs.c | 26 ++++++++++++++++++++++--- > 2 files changed, 32 insertions(+), 3 deletions(-) > > diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci > index 69f952fffec7..4da41471cc6b 100644 > --- a/Documentation/ABI/testing/sysfs-bus-pci > +++ b/Documentation/ABI/testing/sysfs-bus-pci > @@ -612,3 +612,12 @@ Description: > > # ls doe_features > 0001:01 0001:02 doe_discovery > + > +What: /sys/bus/pci/devices/.../serial_number > +Date: July 2025 IIRC this should be the date that this is first introduced into the kernel. So if this is 6.17 material it should be October 2025 and if it's 6.18 material it should be December 2025. It's getting close to the merge window so I'm not sure right now which Bjorn would prefer. I would say make it October 2025 and if it slips it just gets updated for the next spin. > +Contact: Matthew Wood <thepacketgeek@gmail.com> > +Description: > + This is visible only for PCIe devices that support the serial > + number extended capability. The file is read only and due to > + the possible sensitivity of accessible serial numbers, admin > + only. > diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c > index 268c69daa4d5..bc0e0add15d1 100644 > --- a/drivers/pci/pci-sysfs.c > +++ b/drivers/pci/pci-sysfs.c > @@ -239,6 +239,22 @@ static ssize_t current_link_width_show(struct device *dev, > } > static DEVICE_ATTR_RO(current_link_width); > > +static ssize_t serial_number_show(struct device *dev, > + struct device_attribute *attr, char *buf) > +{ > + struct pci_dev *pci_dev = to_pci_dev(dev); > + u64 dsn; > + > + dsn = pci_get_dsn(pci_dev); > + if (!dsn) > + return -EIO; > + > + return sysfs_emit(buf, "%02llx-%02llx-%02llx-%02llx-%02llx-%02llx-%02llx-%02llx\n", > + dsn >> 56, (dsn >> 48) & 0xff, (dsn >> 40) & 0xff, (dsn >> 32) & 0xff, > + (dsn >> 24) & 0xff, (dsn >> 16) & 0xff, (dsn >> 8) & 0xff, dsn & 0xff); > +} > +static DEVICE_ATTR_ADMIN_RO(serial_number); > + > static ssize_t secondary_bus_number_show(struct device *dev, > struct device_attribute *attr, > char *buf) > @@ -660,6 +676,7 @@ static struct attribute *pcie_dev_attrs[] = { > &dev_attr_current_link_width.attr, > &dev_attr_max_link_width.attr, > &dev_attr_max_link_speed.attr, > + &dev_attr_serial_number.attr, > NULL, > }; > > @@ -1749,10 +1766,13 @@ static umode_t pcie_dev_attrs_are_visible(struct kobject *kobj, > struct device *dev = kobj_to_dev(kobj); > struct pci_dev *pdev = to_pci_dev(dev); > > - if (pci_is_pcie(pdev)) > - return a->mode; > + if (!pci_is_pcie(pdev)) > + return 0; > > - return 0; > + if (a == &dev_attr_serial_number.attr && !pci_get_dsn(pdev)) > + return 0; > + > + return a->mode; > } > > static const struct attribute_group pci_dev_group = { ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v4 1/1] PCI/sysfs: Expose PCIe device serial number 2025-07-17 16:29 ` Mario Limonciello @ 2025-07-17 16:33 ` Matthew Wood 0 siblings, 0 replies; 4+ messages in thread From: Matthew Wood @ 2025-07-17 16:33 UTC (permalink / raw) To: Mario Limonciello Cc: Bjorn Helgaas, Jonathan Cameron, Thomas Weißschuh, linux-kernel, linux-pci On Thu, Jul 17, 2025 at 9:29 AM Mario Limonciello <superm1@kernel.org> wrote: > > On 7/17/25 11:22 AM, Matthew Wood wrote: > > Add a single sysfs read-only interface for reading PCIe device serial > > numbers from userspace in a programmatic way. This device attribute > > uses the same hexadecimal 1-byte dashed formatting as lspci serial number > > capability output. If a device doesn't support the serial number > > capability, the device_serial_number sysfs attribute will not be visible. > > You didn't update the commit message here for 'serial_number'. > > > > > Signed-off-by: Matthew Wood <thepacketgeek@gmail.com> > > With the commit and below comment fixed you can add this to your next spin. Thank you Mario, I'll send out another v5 soon with these changes. > > Reviewed-by: Mario Limonciello <superm1@kernel.org> > > > --- > > Documentation/ABI/testing/sysfs-bus-pci | 9 +++++++++ > > drivers/pci/pci-sysfs.c | 26 ++++++++++++++++++++++--- > > 2 files changed, 32 insertions(+), 3 deletions(-) > > > > diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci > > index 69f952fffec7..4da41471cc6b 100644 > > --- a/Documentation/ABI/testing/sysfs-bus-pci > > +++ b/Documentation/ABI/testing/sysfs-bus-pci > > @@ -612,3 +612,12 @@ Description: > > > > # ls doe_features > > 0001:01 0001:02 doe_discovery > > + > > +What: /sys/bus/pci/devices/.../serial_number > > +Date: July 2025 > IIRC this should be the date that this is first introduced into the > kernel. So if this is 6.17 material it should be October 2025 and if > it's 6.18 material it should be December 2025. > > It's getting close to the merge window so I'm not sure right now which > Bjorn would prefer. > > I would say make it October 2025 and if it slips it just gets updated > for the next spin. > > > +Contact: Matthew Wood <thepacketgeek@gmail.com> > > +Description: > > + This is visible only for PCIe devices that support the serial > > + number extended capability. The file is read only and due to > > + the possible sensitivity of accessible serial numbers, admin > > + only. > > diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c > > index 268c69daa4d5..bc0e0add15d1 100644 > > --- a/drivers/pci/pci-sysfs.c > > +++ b/drivers/pci/pci-sysfs.c > > @@ -239,6 +239,22 @@ static ssize_t current_link_width_show(struct device *dev, > > } > > static DEVICE_ATTR_RO(current_link_width); > > > > +static ssize_t serial_number_show(struct device *dev, > > + struct device_attribute *attr, char *buf) > > +{ > > + struct pci_dev *pci_dev = to_pci_dev(dev); > > + u64 dsn; > > + > > + dsn = pci_get_dsn(pci_dev); > > + if (!dsn) > > + return -EIO; > > + > > + return sysfs_emit(buf, "%02llx-%02llx-%02llx-%02llx-%02llx-%02llx-%02llx-%02llx\n", > > + dsn >> 56, (dsn >> 48) & 0xff, (dsn >> 40) & 0xff, (dsn >> 32) & 0xff, > > + (dsn >> 24) & 0xff, (dsn >> 16) & 0xff, (dsn >> 8) & 0xff, dsn & 0xff); > > +} > > +static DEVICE_ATTR_ADMIN_RO(serial_number); > > + > > static ssize_t secondary_bus_number_show(struct device *dev, > > struct device_attribute *attr, > > char *buf) > > @@ -660,6 +676,7 @@ static struct attribute *pcie_dev_attrs[] = { > > &dev_attr_current_link_width.attr, > > &dev_attr_max_link_width.attr, > > &dev_attr_max_link_speed.attr, > > + &dev_attr_serial_number.attr, > > NULL, > > }; > > > > @@ -1749,10 +1766,13 @@ static umode_t pcie_dev_attrs_are_visible(struct kobject *kobj, > > struct device *dev = kobj_to_dev(kobj); > > struct pci_dev *pdev = to_pci_dev(dev); > > > > - if (pci_is_pcie(pdev)) > > - return a->mode; > > + if (!pci_is_pcie(pdev)) > > + return 0; > > > > - return 0; > > + if (a == &dev_attr_serial_number.attr && !pci_get_dsn(pdev)) > > + return 0; > > + > > + return a->mode; > > } > > > > static const struct attribute_group pci_dev_group = { > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-07-17 16:33 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-07-17 16:22 [PATCH v4 0/1] PCI/sysfs: Expose PCIe device serial number Matthew Wood 2025-07-17 16:22 ` [PATCH v4 1/1] " Matthew Wood 2025-07-17 16:29 ` Mario Limonciello 2025-07-17 16:33 ` Matthew Wood
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®