When we move PCI devices, we currently allocate space bottom-up, i.e., we look at PCI bus resources in the order we found them, we look at gaps between child resources bottom-up, and we align the new space at the bottom of an available region. On x86, we move PCI devices more than we used to because we now pay attention to the PCI host bridge windows from ACPI. For example, when we find a device that's outside all the known host bridge windows, we try to move it into a window, and we look for space starting at the bottom. Windows does similar device moves, but it looks for space top-down rather than bottom-up. Since most machines are better-tested with Windows than Linux, this difference means that Linux is more likely to trip over BIOS bugs in the PCI host bridge window descriptions than Windows is. We've had several reports of Dell machines where the BIOS leaves the AHCI controller outside the host bridge windows (BIOS bug #1), *and* the lowest host bridge window includes an area that doesn't actually reach PCI (BIOS bug #2). The result is that Windows (which moves AHCI to the top of a window) works fine, while Linux (which moves AHCI to the bottom, buggy, area) doesn't work. These patches change Linux to allocate space more like Windows does: 1) The x86 pcibios_align_resource() will choose space from the end of an available area, not the beginning. 2) In the generic allocate_resource() path, we'll look for space between existing children from the top, not from the bottom. 3) When pci_bus_alloc_resource() looks for available space, it will start from the highest window, not the first one we found. This series fixes a 2.6.34 regression that prevents many Dell Precision workstations from booting: https://bugzilla.kernel.org/show_bug.cgi?id=16228 Changes from v1 to v2: - Moved check for allocating before the available area from pcibios_align_resource() to find_resource(). Better to do it after the alignment callback is done, and make it generic. - Fixed pcibios_align_resource() alignment. If we start from the end of the available area, we must align *downward*, not upward. - Fixed pcibios_align_resource() ISA alias avoidance. Again, since the starting point is the end of the area, we must align downward when we avoid aliased areas. --- Bjorn Helgaas (4): resources: ensure alignment callback doesn't allocate below available start x86/PCI: allocate space from the end of a region, not the beginning resources: allocate space within a region from the top down PCI: allocate bus resources from the top down arch/x86/pci/i386.c | 18 ++++++++++++----- drivers/pci/bus.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++----- kernel/resource.c | 50 +++++++++++++++++++++++++++++++----------------- 3 files changed, 92 insertions(+), 29 deletions(-) -- 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