From: Jan Beulich Fix http://bugzilla.kernel.org/show_bug.cgi?id=8187 The change to force legacy mode IDE channels' resources to fixed non-zero values confuses (at least some versions of) X, because the values reported by the kernel and those readable from PCI config space aren't consistent anymore. Therefore, this patch arranges for the respective BARs to also get updated if possible. [akpm@linux-foundation.org: Just remove that chunk] Signed-off-by: Jan Beulich Cc: Kristofer T. Karas" Cc: Bartlomiej Zolnierkiewicz Cc: Alan Cox Cc: Natalie Protasevich Cc: Greg KH Cc: Gabriel C Signed-off-by: Andrew Morton --- drivers/pci/probe.c | 40 +++++++++++++++++++++++++++------------- 1 files changed, 27 insertions(+), 13 deletions(-) diff -puN drivers/pci/probe.c~pci-align-bar-settings-for-legacy-mode-ide drivers/pci/probe.c --- a/drivers/pci/probe.c~pci-align-bar-settings-for-legacy-mode-ide +++ a/drivers/pci/probe.c @@ -741,7 +741,29 @@ static void pci_read_irq(struct pci_dev dev->irq = irq; } -#define LEGACY_IO_RESOURCE (IORESOURCE_IO | IORESOURCE_PCI_FIXED) +static void change_legacy_io_resource(struct pci_dev * dev, unsigned index, + resource_size_t start, resource_size_t end) +{ + resource_size_t base = start & PCI_BASE_ADDRESS_IO_MASK; + resource_size_t len = (end | ~PCI_BASE_ADDRESS_IO_MASK) - base + 1; + + if (pci_resource_len(dev, index) != len) { + printk(KERN_WARNING "%s: cannot adjust BAR%u (size %Lx)\n", + pci_name(dev), index, + (unsigned long long)pci_resource_len(dev, index)); + } else { + printk(KERN_INFO "%s: trying to change BAR%u from %Lx to %Lx\n", + pci_name(dev), index, + (unsigned long long)pci_resource_start(dev, index), + (unsigned long long)base); + pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + index * 4, + base); + } + pci_resource_start(dev, index) = start; + pci_resource_end(dev, index) = end; + pci_resource_flags(dev, index) = IORESOURCE_IO|IORESOURCE_PCI_FIXED| + PCI_BASE_ADDRESS_SPACE_IO; +} /** * pci_setup_device - fill in class and map information of a device @@ -795,20 +817,12 @@ static int pci_setup_device(struct pci_d u8 progif; pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); if ((progif & 1) == 0) { - dev->resource[0].start = 0x1F0; - dev->resource[0].end = 0x1F7; - dev->resource[0].flags = LEGACY_IO_RESOURCE; - dev->resource[1].start = 0x3F6; - dev->resource[1].end = 0x3F6; - dev->resource[1].flags = LEGACY_IO_RESOURCE; + change_legacy_io_resource(dev, 0, 0x1F0, 0x1F7); + change_legacy_io_resource(dev, 1, 0x3F6, 0x3F6); } if ((progif & 4) == 0) { - dev->resource[2].start = 0x170; - dev->resource[2].end = 0x177; - dev->resource[2].flags = LEGACY_IO_RESOURCE; - dev->resource[3].start = 0x376; - dev->resource[3].end = 0x376; - dev->resource[3].flags = LEGACY_IO_RESOURCE; + change_legacy_io_resource(dev, 2, 0x170, 0x177); + change_legacy_io_resource(dev, 3, 0x376, 0x376); } } break; _