forked from mirrors/linux
		
	PCI: Create revision file in sysfs
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>
This commit is contained in:
		
							parent
							
								
									1001354ca3
								
							
						
					
					
						commit
						702ed3be1b
					
				
					 3 changed files with 11 additions and 0 deletions
				
			
		| 
						 | 
					@ -294,3 +294,10 @@ Description:
 | 
				
			||||||
		a firmware bug to the system vendor.  Writing to this file
 | 
							a firmware bug to the system vendor.  Writing to this file
 | 
				
			||||||
		taints the kernel with TAINT_FIRMWARE_WORKAROUND, which
 | 
							taints the kernel with TAINT_FIRMWARE_WORKAROUND, which
 | 
				
			||||||
		reduces the supportability of your system.
 | 
							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.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,7 @@ that support it.  For example, a given bus might look like this:
 | 
				
			||||||
     |   |-- resource0
 | 
					     |   |-- resource0
 | 
				
			||||||
     |   |-- resource1
 | 
					     |   |-- resource1
 | 
				
			||||||
     |   |-- resource2
 | 
					     |   |-- resource2
 | 
				
			||||||
 | 
					     |   |-- revision
 | 
				
			||||||
     |   |-- rom
 | 
					     |   |-- rom
 | 
				
			||||||
     |   |-- subsystem_device
 | 
					     |   |-- subsystem_device
 | 
				
			||||||
     |   |-- subsystem_vendor
 | 
					     |   |-- subsystem_vendor
 | 
				
			||||||
| 
						 | 
					@ -41,6 +42,7 @@ files, each with their own function.
 | 
				
			||||||
       resource		   PCI resource host addresses (ascii, ro)
 | 
					       resource		   PCI resource host addresses (ascii, ro)
 | 
				
			||||||
       resource0..N	   PCI resource N, if present (binary, mmap, rw[1])
 | 
					       resource0..N	   PCI resource N, if present (binary, mmap, rw[1])
 | 
				
			||||||
       resource0_wc..N_wc  PCI WC map resource N, if prefetchable (binary, mmap)
 | 
					       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)
 | 
					       rom		   PCI ROM resource, if present (binary, ro)
 | 
				
			||||||
       subsystem_device	   PCI subsystem device (ascii, ro)
 | 
					       subsystem_device	   PCI subsystem device (ascii, ro)
 | 
				
			||||||
       subsystem_vendor	   PCI subsystem vendor (ascii, ro)
 | 
					       subsystem_vendor	   PCI subsystem vendor (ascii, ro)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,6 +50,7 @@ pci_config_attr(vendor, "0x%04x\n");
 | 
				
			||||||
pci_config_attr(device, "0x%04x\n");
 | 
					pci_config_attr(device, "0x%04x\n");
 | 
				
			||||||
pci_config_attr(subsystem_vendor, "0x%04x\n");
 | 
					pci_config_attr(subsystem_vendor, "0x%04x\n");
 | 
				
			||||||
pci_config_attr(subsystem_device, "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(class, "0x%06x\n");
 | 
				
			||||||
pci_config_attr(irq, "%u\n");
 | 
					pci_config_attr(irq, "%u\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -568,6 +569,7 @@ static struct attribute *pci_dev_attrs[] = {
 | 
				
			||||||
	&dev_attr_device.attr,
 | 
						&dev_attr_device.attr,
 | 
				
			||||||
	&dev_attr_subsystem_vendor.attr,
 | 
						&dev_attr_subsystem_vendor.attr,
 | 
				
			||||||
	&dev_attr_subsystem_device.attr,
 | 
						&dev_attr_subsystem_device.attr,
 | 
				
			||||||
 | 
						&dev_attr_revision.attr,
 | 
				
			||||||
	&dev_attr_class.attr,
 | 
						&dev_attr_class.attr,
 | 
				
			||||||
	&dev_attr_irq.attr,
 | 
						&dev_attr_irq.attr,
 | 
				
			||||||
	&dev_attr_local_cpus.attr,
 | 
						&dev_attr_local_cpus.attr,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue