If we kexec into a new kernel on a machine where a PHB has been switched into CAPI mode, we need to disable CAPI mode in the new kernel before traffic begins to flow on the PHB and causes a machine checkstop.
During PHB initialisation, ask OPAL whether each PHB is in CAPI mode, and if so, do a complete reset in order to disable CAPI mode. This requires a version of skiboot that implements the OPAL_PCI_GET_PHB_CAPI_MODE call (introduced at the same time that the capability to disable CAPI mode during complete resets was introduced). Signed-off-by: Andrew Donnellan <andrew.donnel...@au1.ibm.com> --- Corresponding skiboot code: http://patchwork.ozlabs.org/patch/670782/ --- arch/powerpc/platforms/powernv/pci-ioda.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index ca5e9b5..bd76651 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -3526,6 +3526,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np, const __be32 *prop32; int len; unsigned int segno; + bool capi_mode = false; u64 phb_id; void *aux; long rc; @@ -3741,8 +3742,17 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np, * shutdown PCI devices correctly. We already got IODA table * cleaned out. So we have to issue PHB reset to stop all PCI * transactions from previous kernel. + * + * Additionally, if the PHB is in CAPI mode, we also need to + * reset it to get it out of CAPI mode. */ - if (is_kdump_kernel()) { + if (opal_check_token(OPAL_PCI_GET_PHB_CAPI_MODE) && + opal_pci_get_phb_capi_mode(phb_id) == OPAL_PHB_CAPI_MODE_CAPI) { + pr_info(" PHB in CAPI mode, reset required\n"); + capi_mode = true; + } + + if (is_kdump_kernel() || capi_mode) { pr_info(" Issue PHB reset ...\n"); pnv_eeh_phb_reset(hose, EEH_RESET_FUNDAMENTAL); pnv_eeh_phb_reset(hose, EEH_RESET_DEACTIVATE); -- git-series 0.8.10