linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RESEND PATCH v7 1/1] PCI/sysfs: Expose PCIe device serial number
  2025-08-11 17:39 [RESEND PATCH v7 0/1] " Matthew Wood
@ 2025-08-11 17:39 ` Matthew Wood
  0 siblings, 0 replies; 6+ messages in thread
From: Matthew Wood @ 2025-08-11 17:39 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: Mario Limonciello, Jonathan Cameron, Thomas Weißschuh,
	Jonathan Cameron, 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 serial_number sysfs attribute will not be visible.

Signed-off-by: Matthew Wood <thepacketgeek@gmail.com>
Reviewed-by: Mario Limonciello <superm1@kernel.org>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Reviewed-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 Documentation/ABI/testing/sysfs-bus-pci |  9 +++++++++
 drivers/pci/pci-sysfs.c                 | 27 ++++++++++++++++++++++---
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci
index 69f952fffec7..d5251f4f3659 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:		December 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..1d26e4336f1b 100644
--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -30,6 +30,7 @@
 #include <linux/msi.h>
 #include <linux/of.h>
 #include <linux/aperture.h>
+#include <linux/unaligned.h>
 #include "pci.h"
 
 #ifndef ARCH_PCI_DEV_GROUPS
@@ -239,6 +240,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;
+	u8 bytes[8];
+
+	dsn = pci_get_dsn(pci_dev);
+	if (!dsn)
+		return -EIO;
+	put_unaligned_be64(dsn, bytes);
+
+	return sysfs_emit(buf, "%8phD\n", bytes);
+}
+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 +677,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 +1767,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.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [RESEND PATCH v7 0/1] PCI/sysfs: Expose PCIe device serial number
@ 2025-08-21 23:22 Matthew Wood
  2025-08-21 23:22 ` [RESEND PATCH v7 1/1] " Matthew Wood
  0 siblings, 1 reply; 6+ messages in thread
From: Matthew Wood @ 2025-08-21 23:22 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: Mario Limonciello, 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:

    sudo cat /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
            ...

We have a specific use-case of needing to read the serial number
from an unpriviliged application; this patch exposes the serial number as a
file which means we can change the permissions from an admin context and
allow the unpriviliged userspace app to read the serial number. Otherwise
the serial number cannot be read as it requires both the admin capability
and parsing of the lspci text output which can be fragile and unreliable.


v7:
  Updated docs to change kernel introduction date to December 2025 (6.18)

Matthew Wood (1):
  PCI/sysfs: Expose PCIe device serial number

 Documentation/ABI/testing/sysfs-bus-pci |  9 +++++++++
 drivers/pci/pci-sysfs.c                 | 27 ++++++++++++++++++++++---
 2 files changed, 33 insertions(+), 3 deletions(-)

-- 
2.50.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [RESEND PATCH v7 1/1] PCI/sysfs: Expose PCIe device serial number
  2025-08-21 23:22 [RESEND PATCH v7 0/1] PCI/sysfs: Expose PCIe device serial number Matthew Wood
@ 2025-08-21 23:22 ` Matthew Wood
  2025-08-22  0:04   ` Keith Busch
                     ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Matthew Wood @ 2025-08-21 23:22 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: Mario Limonciello, Jonathan Cameron, Thomas Weißschuh,
	Jonathan Cameron, 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 serial_number sysfs attribute will not be visible.

Signed-off-by: Matthew Wood <thepacketgeek@gmail.com>
Reviewed-by: Mario Limonciello <superm1@kernel.org>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Reviewed-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 Documentation/ABI/testing/sysfs-bus-pci |  9 +++++++++
 drivers/pci/pci-sysfs.c                 | 27 ++++++++++++++++++++++---
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci
index 69f952fffec7..d5251f4f3659 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:		December 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..1d26e4336f1b 100644
--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -30,6 +30,7 @@
 #include <linux/msi.h>
 #include <linux/of.h>
 #include <linux/aperture.h>
+#include <linux/unaligned.h>
 #include "pci.h"
 
 #ifndef ARCH_PCI_DEV_GROUPS
@@ -239,6 +240,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;
+	u8 bytes[8];
+
+	dsn = pci_get_dsn(pci_dev);
+	if (!dsn)
+		return -EIO;
+	put_unaligned_be64(dsn, bytes);
+
+	return sysfs_emit(buf, "%8phD\n", bytes);
+}
+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 +677,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 +1767,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.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [RESEND PATCH v7 1/1] PCI/sysfs: Expose PCIe device serial number
  2025-08-21 23:22 ` [RESEND PATCH v7 1/1] " Matthew Wood
@ 2025-08-22  0:04   ` Keith Busch
  2025-08-27  1:34   ` Hans Zhang
  2025-08-27 19:39   ` Keith Busch
  2 siblings, 0 replies; 6+ messages in thread
From: Keith Busch @ 2025-08-22  0:04 UTC (permalink / raw)
  To: Matthew Wood
  Cc: Bjorn Helgaas, Mario Limonciello, Jonathan Cameron,
	Thomas Weißschuh, linux-kernel, linux-pci

On Thu, Aug 21, 2025 at 04:22:38PM -0700, 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 serial_number sysfs attribute will not be visible.

Looks good to me.

Reviewed-by: Keith Busch <kbusch@kernel.org>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RESEND PATCH v7 1/1] PCI/sysfs: Expose PCIe device serial number
  2025-08-21 23:22 ` [RESEND PATCH v7 1/1] " Matthew Wood
  2025-08-22  0:04   ` Keith Busch
@ 2025-08-27  1:34   ` Hans Zhang
  2025-08-27 19:39   ` Keith Busch
  2 siblings, 0 replies; 6+ messages in thread
From: Hans Zhang @ 2025-08-27  1:34 UTC (permalink / raw)
  To: Matthew Wood, Bjorn Helgaas
  Cc: Mario Limonciello, Jonathan Cameron, Thomas Weißschuh,
	linux-kernel, linux-pci



On 2025/8/22 07:22, Matthew Wood wrote:
> EXTERNAL EMAIL
> 
> 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 serial_number sysfs attribute will not be visible.
> 
> Signed-off-by: Matthew Wood <thepacketgeek@gmail.com>
> Reviewed-by: Mario Limonciello <superm1@kernel.org>
> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
> Reviewed-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>

Tested-by: Hans Zhang <hans.zhang@cixtech.com>

Best regards,
Hans

> ---
>   Documentation/ABI/testing/sysfs-bus-pci |  9 +++++++++
>   drivers/pci/pci-sysfs.c                 | 27 ++++++++++++++++++++++---
>   2 files changed, 33 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci
> index 69f952fffec7..d5251f4f3659 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:          December 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..1d26e4336f1b 100644
> --- a/drivers/pci/pci-sysfs.c
> +++ b/drivers/pci/pci-sysfs.c
> @@ -30,6 +30,7 @@
>   #include <linux/msi.h>
>   #include <linux/of.h>
>   #include <linux/aperture.h>
> +#include <linux/unaligned.h>
>   #include "pci.h"
> 
>   #ifndef ARCH_PCI_DEV_GROUPS
> @@ -239,6 +240,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;
> +       u8 bytes[8];
> +
> +       dsn = pci_get_dsn(pci_dev);
> +       if (!dsn)
> +               return -EIO;
> +       put_unaligned_be64(dsn, bytes);
> +
> +       return sysfs_emit(buf, "%8phD\n", bytes);
> +}
> +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 +677,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 +1767,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.1
> 
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RESEND PATCH v7 1/1] PCI/sysfs: Expose PCIe device serial number
  2025-08-21 23:22 ` [RESEND PATCH v7 1/1] " Matthew Wood
  2025-08-22  0:04   ` Keith Busch
  2025-08-27  1:34   ` Hans Zhang
@ 2025-08-27 19:39   ` Keith Busch
  2 siblings, 0 replies; 6+ messages in thread
From: Keith Busch @ 2025-08-27 19:39 UTC (permalink / raw)
  To: Matthew Wood
  Cc: Bjorn Helgaas, Mario Limonciello, Jonathan Cameron,
	Thomas Weißschuh, linux-kernel, linux-pci

Hi Bjorn,

Can we get a ruling on this one? It's pretty straight forward
implementation exposing a useful attribute. This patch has got a good
amount of reviews and tests. Any objections?

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-08-27 19:39 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-21 23:22 [RESEND PATCH v7 0/1] PCI/sysfs: Expose PCIe device serial number Matthew Wood
2025-08-21 23:22 ` [RESEND PATCH v7 1/1] " Matthew Wood
2025-08-22  0:04   ` Keith Busch
2025-08-27  1:34   ` Hans Zhang
2025-08-27 19:39   ` Keith Busch
  -- strict thread matches above, loose matches on Subject: below --
2025-08-11 17:39 [RESEND PATCH v7 0/1] " Matthew Wood
2025-08-11 17:39 ` [RESEND PATCH v7 1/1] " 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).