PCI: Create revision file in sysfs
authorEmil Velikov <emil.velikov@collabora.com>
Mon, 21 Nov 2016 22:24:49 +0000 (16:24 -0600)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 21 Nov 2016 22:25:32 +0000 (16:25 -0600)
Currently the revision isn't available via sysfs/libudev thus if one wants
to know the value one needs to read through the config file, which can be
quite time-consuming because it wakes/powers up the device.

There are at least two userspace components which could make use the new
file: libpciaccess and libdrm.  The former wakes up _every_ PCI device,
which can be observed via glxinfo when using Mesa 10.0+ drivers.  The
latter, in association with Mesa 13.0, can lead to 2-3 second delays while
starting firefox, thunderbird or chromium.

Link: https://bugs.freedesktop.org/show_bug.cgi?id=98502
Tested-by: Mauro Santos <registo.mailling@gmail.com>
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch
CC: Greg KH <gregkh@linuxfoundation.org>
Documentation/ABI/testing/sysfs-bus-pci
Documentation/filesystems/sysfs-pci.txt
drivers/pci/pci-sysfs.c

index b3bc50f650ee49ee97a748442afee11502cb7ada..5a1732b787071ce1495982f125759f15926e581f 100644 (file)
@@ -294,3 +294,10 @@ Description:
                a firmware bug to the system vendor.  Writing to this file
                taints the kernel with TAINT_FIRMWARE_WORKAROUND, which
                reduces the supportability of your system.
+
+What:          /sys/bus/pci/devices/.../revision
+Date:          November 2016
+Contact:       Emil Velikov <emil.l.velikov@gmail.com>
+Description:
+               This file contains the revision field of the the PCI device.
+               The value comes from device config space. The file is read only.
index 74eaac26f8b8c3c4f45b083fe5ffc1b76f5589dd..6ea1ceda6f5235ea18458b7aa70f1fe51866fcf5 100644 (file)
@@ -17,6 +17,7 @@ that support it.  For example, a given bus might look like this:
      |   |-- resource0
      |   |-- resource1
      |   |-- resource2
+     |   |-- revision
      |   |-- rom
      |   |-- subsystem_device
      |   |-- subsystem_vendor
@@ -41,6 +42,7 @@ files, each with their own function.
        resource                   PCI resource host addresses (ascii, ro)
        resource0..N       PCI resource N, if present (binary, mmap, rw[1])
        resource0_wc..N_wc  PCI WC map resource N, if prefetchable (binary, mmap)
+       revision                   PCI revision (ascii, ro)
        rom                PCI ROM resource, if present (binary, ro)
        subsystem_device           PCI subsystem device (ascii, ro)
        subsystem_vendor           PCI subsystem vendor (ascii, ro)
index bcd10c795284cff70a58e73aac8ce2810da6831e..066628776e1be62ec4fdfb2692bd15dbee7ab761 100644 (file)
@@ -50,6 +50,7 @@ pci_config_attr(vendor, "0x%04x\n");
 pci_config_attr(device, "0x%04x\n");
 pci_config_attr(subsystem_vendor, "0x%04x\n");
 pci_config_attr(subsystem_device, "0x%04x\n");
+pci_config_attr(revision, "0x%02x\n");
 pci_config_attr(class, "0x%06x\n");
 pci_config_attr(irq, "%u\n");
 
@@ -568,6 +569,7 @@ static struct attribute *pci_dev_attrs[] = {
        &dev_attr_device.attr,
        &dev_attr_subsystem_vendor.attr,
        &dev_attr_subsystem_device.attr,
+       &dev_attr_revision.attr,
        &dev_attr_class.attr,
        &dev_attr_irq.attr,
        &dev_attr_local_cpus.attr,