Skip to content
  • Yinghai Lu's avatar
    PCI: make re-allocation try harder by reassigning ranges higher in the heirarchy · 19aa7ee4
    Yinghai Lu authored
    
    
    On a system with devices that support SRIOV connected to a pcie switch
    to pcie root port:
    
     +-[0000:80]-+-00.0-[81-8f]--
     |           +-01.0-[90-9f]--
     |           +-02.0-[a0-af]----00.0-[a1-a3]--+-02.0-[a2]--+-00.0 Oracle Corporation Device 207a
     |           |                               \-03.0-[a3]--+-00.0 Oracle Corporation Device 207a
     |           +-02.2-[b0-bf]----00.0-[b1-b3]--+-02.0-[b2]--+-00.0 Oracle Corporation Device 207a
     |           |                               \-03.0-[b3]--+-00.0 Oracle Corporation Device 207a
    
    When the BIOS does not assign resources for SRIOV BARs, kernel pci
    reallocation only goes up one bridge and then gives up, failing to to
    get resources for all sSRIOV BARs, even though the range is large enough
    in the peer root bus.
    
    Specifically, only the bridge at the a1:02.0 level has its resources
    cleared and reallocated.  The kernel does not go up to clear the bridge
    at the 80:02.0 level.
    
    To make it go to upper levels, during retry, we need to treat "good to have"
    resources as "must have".
    
    Only on the last try will we treat good to have resources as optional.
    At that time, parent bridge resources will already have been released so
    we'll have a chance to get everything assigned with must_have plus
    good_to_have for all child devices.
    
    Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
    Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    19aa7ee4