diff options
author | Dan Crowell <dcrowell@us.ibm.com> | 2018-09-14 10:06:12 -0500 |
---|---|---|
committer | William G. Hoffa <wghoffa@us.ibm.com> | 2018-09-19 19:15:22 -0500 |
commit | 94c4cbbc02e3f6de45cfd1eb5a3196072135d374 (patch) | |
tree | b3fb57956266002f95184fa3134c6d625457dee5 /src/usr/scom | |
parent | 716f5fdcab1d28c9bbc1d3b8767c781d403a7ff2 (diff) | |
download | talos-hostboot-94c4cbbc02e3f6de45cfd1eb5a3196072135d374.tar.gz talos-hostboot-94c4cbbc02e3f6de45cfd1eb5a3196072135d374.zip |
Ignore wakeup failures on checkstopped cores
If a core (unit)checkstops, PHYP no longer allows wakeup operations
to take place. However, HBRT has generic logic that always does a
wakeup before doing any ec/ex/eq scom at runtime. Since PRD needs
to do those scoms to analyze the checkstop we have a problem.
The change here is for HBRT to handle a new return code from PHYP
that indicates this situation. This RC will be treated as a
success, thus allowing the subsequent scom operation to pass.
Change-Id: I4ac62129399db50f48c938b649994423c99622a5
CQ: SW444076
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/66143
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Matt Derksen <mderkse1@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Diffstat (limited to 'src/usr/scom')
-rw-r--r-- | src/usr/scom/handleSpecialWakeup.C | 21 | ||||
-rw-r--r-- | src/usr/scom/scomtrans.C | 7 |
2 files changed, 20 insertions, 8 deletions
diff --git a/src/usr/scom/handleSpecialWakeup.C b/src/usr/scom/handleSpecialWakeup.C index 11fbb94b1..87a775440 100644 --- a/src/usr/scom/handleSpecialWakeup.C +++ b/src/usr/scom/handleSpecialWakeup.C @@ -113,8 +113,8 @@ errlHndl_t callWakeupHyp(TARGETING::Target* i_target, if( (g_hostInterfaces == NULL) || (g_hostInterfaces->wakeup == NULL) ) { - TRACFCOMP( g_trac_scom, - ERR_MRK"Hypervisor wakeup interface not linked"); + TRACFCOMP( g_trac_scom,ERR_MRK + "callWakeupHyp> Hypervisor wakeup interface not linked"); /*@ * @errortype @@ -210,10 +210,19 @@ errlHndl_t callWakeupHyp(TARGETING::Target* i_target, // Do the special wakeup int l_rc = g_hostInterfaces->wakeup(rtTargetId,mode); - if(l_rc) + // Check for the specific case where PHYP has detected a core + // checkstop and will fail no matter what + if( HBRT_RC_WAKEUP_INVALID_ON_CORE_XSTOP == l_rc ) + { + TRACFCOMP( g_trac_scom,ERR_MRK + "callWakeupHyp> Wakeup on %.8X failed due to core checkstop", + TARGETING::get_huid(i_target) ); + } + // Any other failure is valid + else if(l_rc) { TRACFCOMP( g_trac_scom,ERR_MRK - "Hypervisor wakeup failed. " + "callWakeupHyp> Hypervisor wakeup failed. " "rc 0x%X target_huid 0x%llX rt_target_id 0x%llX mode %d", l_rc, get_huid(*pCore_it), rtTargetId, mode ); @@ -295,7 +304,7 @@ errlHndl_t callWakeupHwp(TARGETING::Target* i_target, if((l_count==0) && (i_enable==WAKEUP::DISABLE)) { TRACFCOMP( g_trac_scom,ERR_MRK - "Disabling special wakeup on target with SPCWKUP_COUNT=0"); + "callWakeupHwp> Disabling special wakeup on target with SPCWKUP_COUNT=0"); /*@ * @errortype @@ -413,7 +422,7 @@ errlHndl_t callWakeupHwp(TARGETING::Target* i_target, if(l_errl) { TRACFCOMP( g_trac_scom, - "p9_cpu_special_wakeup ERROR :" + "callWakeupHwp> p9_cpu_special_wakeup ERROR :" " Returning errorlog, reason=0x%x", l_errl->reasonCode() ); diff --git a/src/usr/scom/scomtrans.C b/src/usr/scom/scomtrans.C index f100a5e3c..c2db14ff3 100644 --- a/src/usr/scom/scomtrans.C +++ b/src/usr/scom/scomtrans.C @@ -209,6 +209,11 @@ errlHndl_t startScomProcess(DeviceFW::OperationType i_opType, g_wakeupInProgress = true; l_err = WAKEUP::handleSpecialWakeup(i_target,WAKEUP::ENABLE); + + // always clear the global flag, even on error, otherwise we'll + // never call wakeup again even for different targets + g_wakeupInProgress = false; + if(l_err) { TRACFCOMP(g_trac_scom, "startScomProcess: " @@ -220,8 +225,6 @@ errlHndl_t startScomProcess(DeviceFW::OperationType i_opType, l_err->collectTrace(SCOM_COMP_NAME,1024); break; } - - g_wakeupInProgress = false; } #endif |