• Oliver O'Halloran's avatar
    powerpc/pseries/eeh: Rework device EEH PE determination · 98ba956f
    Oliver O'Halloran authored
    The process Linux uses for determining if a device supports EEH or not
    appears to be at odds with what PAPR says the OS should be doing. The
    current flow is something like:
    
    1. Assume pe_config_addr is equal the the device's config_addr.
    2. Attempt to enable EEH on that PE
    3. Verify EEH was enabled (POWER4 bug workaround)
    4. Try find the pe_config_addr using the ibm,get-config-addr-info2 RTAS
       call.
    5. If that fails walk the pci_dn tree upwards trying to find a parent
       device with EEH support. If we find one then add the device to that PE.
    
    The first major problem with this process is that we need the PE config
    address in step 2) since its needs to be passed to the ibm,set-eeh-option
    RTAS call when enabling EEH for th PE. We hack around this requirement in
    by making the assumption in 1) and delay finding the actual PE address
    until 4). This is fine if:
    
    a) The PCI device is the 0th function, and
    b) The device is on the PE's root bus.
    
    Granted, the current sequence does appear to work on most systems even when
    these conditions are false. At a guess PowerVM's RTAS has workarounds to
    accommodate Linux's quirks or the RTAS call to enable EEH is treated as
    no-op on most platforms since EEH is usually enabled by default. However,
    what is currently implemented is a bit sketch and is downright confusing
    since it doesn't match up with what what PAPR suggests we should be doing.
    
    This patch re-works how we handle EEH init so that we find the PE config
    address using the ibm,get-config-addr-info2 RTAS call first, then use the
    found address to finish the EEH init process. It also drops the Power4
    workaround since as of commit 471d7ff8 ("powerpc/64s: Remove POWER4
    support") the kernel does not support running on a Power4 CPU so there's
    no need to support the Power4 platform's quirks either. With the patch
    applied the sequence is now:
    
    1. Find the pe_config_addr from the device using the RTAS call.
    2. Enable the PE.
    3. Insert the edev into the tree and create an eeh_pe if needed.
    
    The other change made here is ignoring unsupported devices entirely.
    Currently the device's BARs are saved to the eeh_dev even if the device is
    not part of an EEH PE. Not being part of a PE means that an EEH recovery
    pass will never see that device so the saving the BARs is pointless.
    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/20200918093050.37344-7-oohall@gmail.com
    98ba956f
eeh_pseries.c 24 KB