• Oliver O'Halloran's avatar
    powerpc/powernv/pci: Re-work bus PE configuration · dc3d8f85
    Oliver O'Halloran authored
    For normal PHBs IODA PEs are handled on a per-bus basis so all the devices
    on that bus will share a PE. Which PE specificly is determined by the location
    of the MMIO BARs for the devices on the bus so we can't actually configure the
    bus PEs until after MMIO resources are allocated. As a result PEs are currently
    configured by pcibios_setup_bridge(), which is called just before the bridge
    windows are programmed into the bus' parent bridge. Configuring the bus PE here
    causes a few problems:
    
    1. The root bus doesn't have a parent bridge so setting up the PE for the root
       bus requires some hacks.
    
    2. The PELT-V isn't setup correctly because pnv_ioda_set_peltv() assumes that
       PEs will be configured in root-to-leaf order. This assumption is broken
       because resource assignment is performed depth-first so the leaf bridges
       are setup before their parents are. The hack mentioned in 1) results in
       the "correct" PELT-V for busses immediately below the root port, but not
       for devices below a switch.
    
    3. It's possible to break the sysfs PCI rescan feature by removing all
       the devices on a bus. When the last device is removed from a PE its
       will be de-configured. Rescanning the devices on a bus does not cause
       the bridge to be reconfigured rendering the devices on that bus
       unusable.
    
    We can address most of these problems by moving the PE setup out of
    pcibios_setup_bridge() and into pcibios_bus_add_device(). This fixes 1)
    and 2) because pcibios_bus_add_device() is called on each device in
    root-to-leaf order so PEs for parent buses will always be configured
    before their children. It also fixes 3) by ensuring the PE is
    configured before initialising DMA for the device. In the event the PE
    was de-configured due to removing all the devices in that PE it will
    now be reconfigured when a new device is added since there's no
    dependecy on the bridge_setup() hook being called.
    Signed-off-by: default avatarOliver O'Halloran <oohall@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20200417073508.30356-3-oohall@gmail.com
    dc3d8f85
pci-ioda.c 105 KB