| From 7c592db2c42b8dbef0f31a8daebb97ff0ed6a3ac Mon Sep 17 00:00:00 2001 |
| From: Stephen Cprek <smcprek@us.ibm.com> |
| Date: Tue, 30 Jun 2015 16:49:22 -0500 |
| Subject: [PATCH] Shutdown when deconfig outside of reconfig loop on BMC |
| systems |
| |
| Change-Id: I1faf0ab0d831a41c332993f555231a8dbecf53ef |
| CQ:SW312075 |
| --- |
| src/include/usr/initservice/initsvcreasoncodes.H | 4 +- |
| .../initservice/istepdispatcher/istepdispatcher.C | 120 ++++++++++++++++----- |
| 2 files changed, 98 insertions(+), 26 deletions(-) |
| |
| diff --git a/src/include/usr/initservice/initsvcreasoncodes.H b/src/include/usr/initservice/initsvcreasoncodes.H |
| index d11824e..e174564 100644 |
| --- a/src/include/usr/initservice/initsvcreasoncodes.H |
| +++ b/src/include/usr/initservice/initsvcreasoncodes.H |
| @@ -5,7 +5,7 @@ |
| /* */ |
| /* OpenPOWER HostBoot Project */ |
| /* */ |
| -/* Contributors Listed Below - COPYRIGHT 2011,2014 */ |
| +/* Contributors Listed Below - COPYRIGHT 2011,2015 */ |
| /* [+] International Business Machines Corp. */ |
| /* */ |
| /* */ |
| @@ -74,6 +74,8 @@ enum InitServiceReasonCode |
| //termination_rc |
| SBE_EXTRACT_RC_REQUEST_REIPL = INITSVC_COMP_ID | 0x0e, |
| RECONFIG_LOOP_TEST_RC = INITSVC_COMP_ID | 0x0f, |
| + //termination_rc |
| + SHUTDOWN_NOT_RECONFIG_LOOP = INITSVC_COMP_ID | 0x10, |
| }; |
| |
| enum InitServiceUserDetailDataSubSection |
| diff --git a/src/usr/initservice/istepdispatcher/istepdispatcher.C b/src/usr/initservice/istepdispatcher/istepdispatcher.C |
| index d3581e9..7f3c0b7 100644 |
| --- a/src/usr/initservice/istepdispatcher/istepdispatcher.C |
| +++ b/src/usr/initservice/istepdispatcher/istepdispatcher.C |
| @@ -96,6 +96,10 @@ const uint8_t OUTER_STOP_STEP = 14; |
| const uint8_t OUTER_STOP_SUBSTEP = 5; |
| const uint8_t HB_START_ISTEP = 6; |
| |
| +// @todo RTC 124679 - Remove Once BMC Monitors Shutdown Attention |
| +// Set Watchdog Timer To 15 seconds before calling doShutdown() |
| +const uint16_t SET_WD_TIMER_IN_SECS = 15; |
| + |
| /** |
| * _start() task entry procedure using the macro in taskargs.H |
| */ |
| @@ -506,14 +510,58 @@ errlHndl_t IStepDispatcher::executeAllISteps() |
| } |
| else |
| { |
| - // Reconfig loop required, but the istep is either outside |
| - // of the reconfig loop, too many reconfigs have been |
| - // attempted, in manufacturing mode, or in MPIPL. |
| - // Return an error to cause termination |
| + |
| if (!err) |
| { |
| - err = failedDueToDeconfig(istep, substep, |
| - newIstep, newSubstep); |
| + // Reconfig loop required, but the istep is either outside |
| + // of the reconfig loop, too many reconfigs have been |
| + // attempted, in manufacturing mode, or in MPIPL. |
| + // Return an error to cause termination on FSP systems |
| + if (iv_spBaseServicesEnabled) |
| + { |
| + err = failedDueToDeconfig(istep, substep, |
| + newIstep, newSubstep); |
| + } |
| + // Otherwise increment the reboot count and shutdown |
| + #ifdef CONFIG_BMC_IPMI |
| + else |
| + { |
| + uint16_t l_count = 0; |
| + SENSOR::RebootCountSensor l_sensor; |
| + |
| + // Read reboot count sensor |
| + err = l_sensor.getRebootCount(l_count); |
| + if (err) |
| + { |
| + TRACFCOMP(g_trac_initsvc, ERR_MRK"executeAllISteps: getRebootCount failed"); |
| + break; |
| + } |
| + // Increment reboot count |
| + l_count++; |
| + err = l_sensor.setRebootCount(l_count); |
| + if (err) |
| + { |
| + TRACFCOMP(g_trac_initsvc, ERR_MRK"executeAllISteps: setRebootCount to %d failed", l_count); |
| + break; |
| + } |
| + |
| + // @TODO RTC:124679 - Remove Once BMC Monitors |
| + // Shutdown Attention |
| + // Set Watchdog Timer before calling doShutdown() |
| + TRACFCOMP( g_trac_initsvc,"executeAllISteps: " |
| + "Set Watch Dog Timer To %d Seconds", |
| + SET_WD_TIMER_IN_SECS); |
| + |
| + err = IPMIWATCHDOG::setWatchDogTimer( |
| + SET_WD_TIMER_IN_SECS, // new time |
| + static_cast<uint8_t> |
| + (IPMIWATCHDOG::DO_NOT_STOP | |
| + IPMIWATCHDOG::BIOS_FRB2), // default |
| + IPMIWATCHDOG::TIMEOUT_HARD_RESET); |
| + |
| + shutdownDuringIpl(); |
| + } |
| + #endif |
| } |
| // else return the error from doIstep |
| } |
| @@ -1260,27 +1308,49 @@ void IStepDispatcher::shutdownDuringIpl() |
| { |
| TRACFCOMP(g_trac_initsvc, ENTER_MRK"IStepDispatcher::shutdownDuringIpl"); |
| |
| - // Create and commit error log for FFDC |
| - |
| - /*@ |
| - * @errortype |
| - * @reasoncode SHUTDOWN_REQUESTED_BY_FSP |
| - * @severity ERRORLOG::ERRL_SEV_INFORMATIONAL |
| - * @moduleid ISTEP_INITSVC_MOD_ID |
| - * @userdata1 Current IStep |
| - * @userdata2 Current SubStep |
| - * @devdesc Received shutdown request from FSP |
| - */ |
| - errlHndl_t err = new ERRORLOG::ErrlEntry( |
| - ERRORLOG::ERRL_SEV_INFORMATIONAL, |
| - ISTEP_INITSVC_MOD_ID, |
| - SHUTDOWN_REQUESTED_BY_FSP, |
| - this->iv_curIStep, this->iv_curSubStep); |
| + // Create and commit error log for FFDC and call doShutdown with the RC |
| + // to initiate a TI |
| + if (iv_spBaseServicesEnabled) |
| + { |
| + /*@ |
| + * @errortype |
| + * @reasoncode SHUTDOWN_REQUESTED_BY_FSP |
| + * @severity ERRORLOG::ERRL_SEV_INFORMATIONAL |
| + * @moduleid ISTEP_INITSVC_MOD_ID |
| + * @userdata1 Current IStep |
| + * @userdata2 Current SubStep |
| + * @devdesc Received shutdown request from FSP |
| + */ |
| + errlHndl_t err = new ERRORLOG::ErrlEntry( |
| + ERRORLOG::ERRL_SEV_INFORMATIONAL, |
| + ISTEP_INITSVC_MOD_ID, |
| + SHUTDOWN_REQUESTED_BY_FSP, |
| + this->iv_curIStep, this->iv_curSubStep); |
| |
| - errlCommit(err, INITSVC_COMP_ID); |
| + errlCommit(err, INITSVC_COMP_ID); |
| + INITSERVICE::doShutdown(SHUTDOWN_REQUESTED_BY_FSP); |
| + } |
| + else |
| + { |
| + /*@ |
| + * @errortype |
| + * @reasoncode SHUTDOWN_NOT_RECONFIG_LOOP |
| + * @severity ERRORLOG::ERRL_SEV_INFORMATIONAL |
| + * @moduleid ISTEP_INITSVC_MOD_ID |
| + * @userdata1 Current IStep |
| + * @userdata2 Current SubStep |
| + * @devdesc Received shutdown request due to deconfigure |
| + * outside of reconfig loop |
| + */ |
| + errlHndl_t err = new ERRORLOG::ErrlEntry( |
| + ERRORLOG::ERRL_SEV_INFORMATIONAL, |
| + ISTEP_INITSVC_MOD_ID, |
| + SHUTDOWN_NOT_RECONFIG_LOOP, |
| + this->iv_curIStep, this->iv_curSubStep); |
| |
| - // Call doShutdown with the RC to initiate a TI |
| - INITSERVICE::doShutdown(SHUTDOWN_REQUESTED_BY_FSP); |
| + errlCommit(err, INITSVC_COMP_ID); |
| + INITSERVICE::doShutdown(SHUTDOWN_NOT_RECONFIG_LOOP); |
| + } |
| |
| } |
| |
| -- |
| 1.8.2.2 |
| |