aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJiri Slaby <jslaby@suse.cz>2011-02-28 04:45:10 -0500
committerJesse Barnes <jbarnes@virtuousgeek.org>2011-03-04 13:42:32 -0500
commit87e3dc3855430bd254370afc79f2ed92250f5b7c (patch)
tree86a7ce46f158706e1505d36e8aabd33e8b890b85 /drivers
parent47e9037ac16637cd7f12b8790ea7ce6680e42168 (diff)
PCI: do not create quirk I/O regions below PCIBIOS_MIN_IO for ICH
Some broken BIOSes on ICH4 chipset report an ACPI region which is in conflict with legacy IDE ports when ACPI is disabled. Even though the regions overlap, IDE ports are working correctly (we cannot find out the decoding rules on chipsets). So the only problem is the reported region itself, if we don't reserve the region in the quirk everything works as expected. This patch avoids reserving any quirk regions below PCIBIOS_MIN_IO which is 0x1000. Some regions might be (and are by a fast google query) below this border, but the only difference is that they won't be reserved anymore. They should still work though the same as before. The conflicts look like (1f.0 is bridge, 1f.1 is IDE ctrl): pci 0000:00:1f.1: address space collision: [io 0x0170-0x0177] conflicts with 0000:00:1f.0 [io 0x0100-0x017f] At 0x0100 a 128 bytes long ACPI region is reported in the quirk for ICH4. ata_piix then fails to find disks because the IDE legacy ports are zeroed: ata_piix 0000:00:1f.1: device not available (can't reserve [io 0x0000-0x0007]) References: https://bugzilla.novell.com/show_bug.cgi?id=558740 Signed-off-by: Jiri Slaby <jslaby@suse.cz> Cc: Bjorn Helgaas <bjorn.helgaas@hp.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: Thomas Renninger <trenn@suse.de> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/pci/quirks.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 9e23912c97ac..bd80f6378463 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -554,18 +554,30 @@ static void __devinit quirk_ich4_lpc_acpi(struct pci_dev *dev)
554 u32 region; 554 u32 region;
555 u8 enable; 555 u8 enable;
556 556
557 /*
558 * The check for PCIBIOS_MIN_IO is to ensure we won't create a conflict
559 * with low legacy (and fixed) ports. We don't know the decoding
560 * priority and can't tell whether the legacy device or the one created
561 * here is really at that address. This happens on boards with broken
562 * BIOSes.
563 */
564
557 pci_read_config_byte(dev, ICH_ACPI_CNTL, &enable); 565 pci_read_config_byte(dev, ICH_ACPI_CNTL, &enable);
558 if (enable & ICH4_ACPI_EN) { 566 if (enable & ICH4_ACPI_EN) {
559 pci_read_config_dword(dev, ICH_PMBASE, &region); 567 pci_read_config_dword(dev, ICH_PMBASE, &region);
560 quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES, 568 region &= PCI_BASE_ADDRESS_IO_MASK;
561 "ICH4 ACPI/GPIO/TCO"); 569 if (region >= PCIBIOS_MIN_IO)
570 quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES,
571 "ICH4 ACPI/GPIO/TCO");
562 } 572 }
563 573
564 pci_read_config_byte(dev, ICH4_GPIO_CNTL, &enable); 574 pci_read_config_byte(dev, ICH4_GPIO_CNTL, &enable);
565 if (enable & ICH4_GPIO_EN) { 575 if (enable & ICH4_GPIO_EN) {
566 pci_read_config_dword(dev, ICH4_GPIOBASE, &region); 576 pci_read_config_dword(dev, ICH4_GPIOBASE, &region);
567 quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES + 1, 577 region &= PCI_BASE_ADDRESS_IO_MASK;
568 "ICH4 GPIO"); 578 if (region >= PCIBIOS_MIN_IO)
579 quirk_io_region(dev, region, 64,
580 PCI_BRIDGE_RESOURCES + 1, "ICH4 GPIO");
569 } 581 }
570} 582}
571DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, quirk_ich4_lpc_acpi); 583DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, quirk_ich4_lpc_acpi);
@@ -587,15 +599,19 @@ static void __devinit ich6_lpc_acpi_gpio(struct pci_dev *dev)
587 pci_read_config_byte(dev, ICH_ACPI_CNTL, &enable); 599 pci_read_config_byte(dev, ICH_ACPI_CNTL, &enable);
588 if (enable & ICH6_ACPI_EN) { 600 if (enable & ICH6_ACPI_EN) {
589 pci_read_config_dword(dev, ICH_PMBASE, &region); 601 pci_read_config_dword(dev, ICH_PMBASE, &region);
590 quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES, 602 region &= PCI_BASE_ADDRESS_IO_MASK;
591 "ICH6 ACPI/GPIO/TCO"); 603 if (region >= PCIBIOS_MIN_IO)
604 quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES,
605 "ICH6 ACPI/GPIO/TCO");
592 } 606 }
593 607
594 pci_read_config_byte(dev, ICH6_GPIO_CNTL, &enable); 608 pci_read_config_byte(dev, ICH6_GPIO_CNTL, &enable);
595 if (enable & ICH4_GPIO_EN) { 609 if (enable & ICH4_GPIO_EN) {
596 pci_read_config_dword(dev, ICH6_GPIOBASE, &region); 610 pci_read_config_dword(dev, ICH6_GPIOBASE, &region);
597 quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES + 1, 611 region &= PCI_BASE_ADDRESS_IO_MASK;
598 "ICH6 GPIO"); 612 if (region >= PCIBIOS_MIN_IO)
613 quirk_io_region(dev, region, 64,
614 PCI_BRIDGE_RESOURCES + 1, "ICH6 GPIO");
599 } 615 }
600} 616}
601 617