Commit 51204faa authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

Merge branch 'pci/misc'

- Fix whitespace issues (Li Jun)

- Fix pci_acpi_preserve_config() memory leak (Nirmoy Das)

- Add sysfs 'serial_number' file to expose the Device Serial Number
  (Matthew Wood)

* pci/misc:
  PCI/sysfs: Expose PCI device serial number
  PCI/ACPI: Fix pci_acpi_preserve_config() memory leak
parents 43c59341 cf6ee09b
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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 PCI 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.
+4 −2
Original line number Diff line number Diff line
@@ -122,6 +122,8 @@ phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle)

bool pci_acpi_preserve_config(struct pci_host_bridge *host_bridge)
{
	bool ret = false;

	if (ACPI_HANDLE(&host_bridge->dev)) {
		union acpi_object *obj;

@@ -135,11 +137,11 @@ bool pci_acpi_preserve_config(struct pci_host_bridge *host_bridge)
					      1, DSM_PCI_PRESERVE_BOOT_CONFIG,
					      NULL, ACPI_TYPE_INTEGER);
		if (obj && obj->integer.value == 0)
			return true;
			ret = true;
		ACPI_FREE(obj);
	}

	return false;
	return ret;
}

/* _HPX PCI Setting Record (Type 0); same as _HPP */
+21 −0
Original line number Diff line number Diff line
@@ -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
@@ -719,6 +720,22 @@ static ssize_t boot_vga_show(struct device *dev, struct device_attribute *attr,
}
static DEVICE_ATTR_RO(boot_vga);

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 pci_read_config(struct file *filp, struct kobject *kobj,
			       const struct bin_attribute *bin_attr, char *buf,
			       loff_t off, size_t count)
@@ -1729,6 +1746,7 @@ late_initcall(pci_sysfs_init);

static struct attribute *pci_dev_dev_attrs[] = {
	&dev_attr_boot_vga.attr,
	&dev_attr_serial_number.attr,
	NULL,
};

@@ -1741,6 +1759,9 @@ static umode_t pci_dev_attrs_are_visible(struct kobject *kobj,
	if (a == &dev_attr_boot_vga.attr && pci_is_vga(pdev))
		return a->mode;

	if (a == &dev_attr_serial_number.attr && pci_get_dsn(pdev))
		return a->mode;

	return 0;
}