summaryrefslogtreecommitdiffstats
path: root/src/usr/scom
diff options
context:
space:
mode:
authorDan Crowell <dcrowell@us.ibm.com>2018-09-14 10:06:12 -0500
committerWilliam G. Hoffa <wghoffa@us.ibm.com>2018-09-19 19:15:22 -0500
commit94c4cbbc02e3f6de45cfd1eb5a3196072135d374 (patch)
treeb3fb57956266002f95184fa3134c6d625457dee5 /src/usr/scom
parent716f5fdcab1d28c9bbc1d3b8767c781d403a7ff2 (diff)
downloadtalos-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.C21
-rw-r--r--src/usr/scom/scomtrans.C7
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
OpenPOWER on IntegriCloud