* [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 related [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;
as well as URLs for NNTP newsgroup(s).