linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] x86, pci: Fix all early PCI scans to check the vendor ID first
@ 2012-08-08 22:17 Andi Kleen
  2012-08-09 22:34 ` Betty Dall
  0 siblings, 1 reply; 10+ messages in thread
From: Andi Kleen @ 2012-08-08 22:17 UTC (permalink / raw)
  To: x86; +Cc: linux-kernel, Andi Kleen

From: Andi Kleen <ak@linux.intel.com>

According to the Intel PCI experts it's not safe to check any
other field than vendor ID for 0xffff when doing PCI scans
to see if the device exists.

Several of the early PCI scans violated this. I changed
them all to always check the vendor ID first.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
---
 arch/x86/kernel/aperture_64.c        |    5 +++++
 arch/x86/kernel/early-quirks.c       |    3 +++
 arch/x86/kernel/pci-calgary_64.c     |    8 ++++++--
 arch/x86/pci/early.c                 |    3 +++
 drivers/firewire/init_ohci1394_dma.c |    3 +++
 5 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c
index d5fd66f..e1ca7cd 100644
--- a/arch/x86/kernel/aperture_64.c
+++ b/arch/x86/kernel/aperture_64.c
@@ -206,6 +206,11 @@ static u32 __init search_agp_bridge(u32 *order, int *valid_agp)
 			for (func = 0; func < 8; func++) {
 				u32 class, cap;
 				u8 type;
+
+				if (read_pci_config_16(bus, slot, func, PCI_VENDOR_ID) 
+				    == 0xffff)
+					continue;
+
 				class = read_pci_config(bus, slot, func,
 							PCI_CLASS_REVISION);
 				if (class == 0xffffffff)
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
index 3755ef4..f76b930 100644
--- a/arch/x86/kernel/early-quirks.c
+++ b/arch/x86/kernel/early-quirks.c
@@ -250,6 +250,9 @@ static int __init check_dev_quirk(int num, int slot, int func)
 
 	vendor = read_pci_config_16(num, slot, func, PCI_VENDOR_ID);
 
+	if (vendor == 0xffff)
+		return -1;
+
 	device = read_pci_config_16(num, slot, func, PCI_DEVICE_ID);
 
 	for (i = 0; early_qrk[i].f != NULL; i++) {
diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c
index 299d493..05798a0 100644
--- a/arch/x86/kernel/pci-calgary_64.c
+++ b/arch/x86/kernel/pci-calgary_64.c
@@ -1324,8 +1324,9 @@ static void __init get_tce_space_from_tar(void)
 		unsigned short pci_device;
 		u32 val;
 
-		val = read_pci_config(bus, 0, 0, 0);
-		pci_device = (val & 0xFFFF0000) >> 16;
+		if (read_pci_config_16(bus, 0, 0, PCI_VENDOR_ID) == 0xffff)
+			continue;
+		pci_device = read_pci_config_16(bus, 0, 0, PCI_DEVICE_ID);
 
 		if (!is_cal_pci_dev(pci_device))
 			continue;
@@ -1426,6 +1427,9 @@ int __init detect_calgary(void)
 		unsigned short pci_device;
 		u32 val;
 
+		if (read_pci_config_16(bus, 0, 0, PCI_VENDOR_ID) == 0xffff)
+			continue;
+
 		val = read_pci_config(bus, 0, 0, 0);
 		pci_device = (val & 0xFFFF0000) >> 16;
 
diff --git a/arch/x86/pci/early.c b/arch/x86/pci/early.c
index d1067d5..4fb6847 100644
--- a/arch/x86/pci/early.c
+++ b/arch/x86/pci/early.c
@@ -91,6 +91,9 @@ void early_dump_pci_devices(void)
 				u32 class;
 				u8 type;
 
+				if (read_pci_config_16(bus, slot, func, PCI_VENDOR_ID) == 0xffff)
+					continue;
+
 				class = read_pci_config(bus, slot, func,
 							PCI_CLASS_REVISION);
 				if (class == 0xffffffff)
diff --git a/drivers/firewire/init_ohci1394_dma.c b/drivers/firewire/init_ohci1394_dma.c
index a9a347a..dd3bd84 100644
--- a/drivers/firewire/init_ohci1394_dma.c
+++ b/drivers/firewire/init_ohci1394_dma.c
@@ -279,6 +279,9 @@ void __init init_ohci1394_dma_on_all_controllers(void)
 	for (num = 0; num < 32; num++) {
 		for (slot = 0; slot < 32; slot++) {
 			for (func = 0; func < 8; func++) {
+				if (read_pci_config_16(num, slot, func, PCI_VENDOR_ID) == 0xffff)
+					continue;
+
 				class = read_pci_config(num, slot, func,
 							PCI_CLASS_REVISION);
 				if (class == 0xffffffff)
-- 
1.7.7.6


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

end of thread, other threads:[~2012-08-13 22:02 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-08 22:17 [PATCH] x86, pci: Fix all early PCI scans to check the vendor ID first Andi Kleen
2012-08-09 22:34 ` Betty Dall
2012-08-09 23:41   ` Andi Kleen
2012-08-10 23:57   ` H. Peter Anvin
2012-08-11 10:43     ` Andi Kleen
2012-08-13 21:58       ` Betty Dall
2012-08-13 22:01         ` H. Peter Anvin
2012-08-13  3:23     ` Khalid Aziz
2012-08-13  3:24       ` H. Peter Anvin
2012-08-13  4:15       ` Andi Kleen

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).