[PATCH 1/3] PCI/x86: make early dump handle multi-function devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The early "dump PCI config space" code skips many multi-function devices.
This patch fixes that, so it dumps all devices in PCI domain 0.

We should not skip the rest of the device if CLASS_REVISION is 0xffffffff.
Often multi-function devices have gaps in the function ID space, e.g.,
1c.0 and 1c.2 exist but 1c.1 doesn't.  The CLASS_REVISION of the non-
existent 1c.1 function will appear to be 0xffffffff.

We should only look at the HEADER_TYPE of function zero.  Often the
"multi-function" is set in function zero, but not in other functions.

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@xxxxxx>
---
 arch/x86/pci/early.c |   17 +++++++++--------
 1 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/arch/x86/pci/early.c b/arch/x86/pci/early.c
index f6adf2c..db7def6 100644
--- a/arch/x86/pci/early.c
+++ b/arch/x86/pci/early.c
@@ -96,18 +96,19 @@ void early_dump_pci_devices(void)
 			for (func = 0; func < 8; func++) {
 				u32 class;
 				u8 type;
+
 				class = read_pci_config(bus, slot, func,
 							PCI_CLASS_REVISION);
-				if (class == 0xffffffff)
-					break;
-
-				early_dump_pci_device(bus, slot, func);
+				if (class != 0xffffffff)
+					early_dump_pci_device(bus, slot, func);
 
-				/* No multi-function device? */
-				type = read_pci_config_byte(bus, slot, func,
+				if (func == 0) {
+					type = read_pci_config_byte(bus, slot,
+								    func,
 							       PCI_HEADER_TYPE);
-				if (!(type & 0x80))
-					break;
+					if (!(type & 0x80))
+						break;
+				}
 			}
 		}
 	}

--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux