18 Dec, 2010

3 commits

  • This prevents allocation of the last 2MB before 4GB.

    The experiment described here shows Windows 7 ignoring the last 1MB:
    https://bugzilla.kernel.org/show_bug.cgi?id=23542#c27

    This patch ignores the top 2MB instead of just 1MB because H. Peter Anvin
    says "There will be ROM at the top of the 32-bit address space; it's a fact
    of the architecture, and on at least older systems it was common to have a
    shadow 1 MiB below."

    Acked-by: H. Peter Anvin
    Signed-off-by: Bjorn Helgaas
    Signed-off-by: Jesse Barnes

    Bjorn Helgaas
     
  • When we allocate address space, e.g., to assign it to a PCI device, don't
    allocate anything mentioned in the BIOS E820 memory map.

    On recent machines (2008 and newer), we assign PCI resources from the
    windows described by the ACPI PCI host bridge _CRS. On many Dell
    machines, these windows overlap some E820 reserved areas, e.g.,

    BIOS-e820: 00000000bfe4dc00 - 00000000c0000000 (reserved)
    pci_root PNP0A03:00: host bridge window [mem 0xbff00000-0xdfffffff]

    If we put devices at 0xbff00000, they don't work, probably because
    that's really RAM, not I/O memory. This patch prevents that by removing
    the 0xbfe4dc00-0xbfffffff area from the "available" resource.

    I'm not very happy with this solution because Windows solves the problem
    differently (it seems to ignore E820 reserved areas and it allocates
    top-down instead of bottom-up; details at comment 45 of the bugzilla
    below). That means we're vulnerable to BIOS defects that Windows would not
    trip over. For example, if BIOS described a device in ACPI but didn't
    mention it in E820, Windows would work fine but Linux would fail.

    Reference: https://bugzilla.kernel.org/show_bug.cgi?id=16228
    Acked-by: H. Peter Anvin
    Signed-off-by: Bjorn Helgaas
    Signed-off-by: Jesse Barnes

    Bjorn Helgaas
     
  • This implements arch_remove_reservations() so allocate_resource() can
    avoid any arch-specific reserved areas. This currently just avoids the
    BIOS area (the first 1MB), but could be used for E820 reserved areas if
    that turns out to be necessary.

    We previously avoided this area in pcibios_align_resource(). This patch
    moves the test from that PCI-specific path to a generic path, so *all*
    resource allocations will avoid this area.

    Acked-by: H. Peter Anvin
    Signed-off-by: Bjorn Helgaas
    Signed-off-by: Jesse Barnes

    Bjorn Helgaas