• Yinghai Lu's avatar
    PCI: Enforce bus address limits in resource allocation · f75b99d5
    Yinghai Lu authored
    When allocating space for 32-bit BARs, we previously limited RESOURCE
    addresses so they would fit in 32 bits.  However, the BUS address need not
    be the same as the resource address, and it's the bus address that must fit
    in the 32-bit BAR.
    
    This patch adds:
    
      - pci_clip_resource_to_region(), which clips a resource so it contains
        only the range that maps to the specified bus address region, e.g., to
        clip a resource to 32-bit bus addresses, and
    
      - pci_bus_alloc_from_region(), which allocates space for a resource from
        the specified bus address region,
    
    and changes pci_bus_alloc_resource() to allocate space for 64-bit BARs from
    the entire bus address region, and space for 32-bit BARs from only the bus
    address region below 4GB.
    
    If we had this window:
    
      pci_root HWP0002:0a: host bridge window [mem 0xf0180000000-0xf01fedfffff] (bus address [0x80000000-0xfedfffff])
    
    we previously could not put a 32-bit BAR there, because the CPU addresses
    don't fit in 32 bits.  This patch fixes this, so we can use this space for
    32-bit BARs.
    
    It's also possible (though unlikely) to have resources with 32-bit CPU
    addresses but bus addresses above 4GB.  In this case the previous code
    would allocate space that a 32-bit BAR could not map.
    
    Remove PCIBIOS_MAX_MEM_32, which is no longer used.
    
    [bhelgaas: reworked starting from http://lkml.kernel.org/r/1386658484-15774-3-git-send-email-yinghai@kernel.org]
    Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    f75b99d5
bus.c 8.41 KB