summaryrefslogtreecommitdiffstats
path: root/src/usr/isteps
diff options
context:
space:
mode:
authorDan Crowell <dcrowell@us.ibm.com>2018-08-30 12:19:21 -0500
committerWilliam G. Hoffa <wghoffa@us.ibm.com>2018-09-19 09:50:03 -0500
commit4e4dbf34cd08855833bce3b3f3519761a839d6db (patch)
tree499b10ff16300a90d21b7aa7615b4b252c33b72f /src/usr/isteps
parent639b6728bfdb38ab07b0044fba9ea30d30ea381c (diff)
downloadtalos-hostboot-4e4dbf34cd08855833bce3b3f3519761a839d6db.tar.gz
talos-hostboot-4e4dbf34cd08855833bce3b3f3519761a839d6db.zip
Forcibly clear all previous wakeups when the PM Complex starts
The power management logic was designed with the assumption that the external callers would manage the state machine such that the order of operations is always: load->start->reset->load->start->reset->etc. However, we have discovered edge cases where a reset can happen before the first load or after a previous reset. In either case we will end up with our wakeup counter being off by one and thus never releasing wakeup. The solution is to add logic to the start path that will explicitly clear the counter out completely, regardless of its current value. This will ensure that wakeup is released once the complex is alive. Change-Id: Ifb436335090ff910b9ee0f083d9a550b81833287 CQ: SW442639 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/65518 Reviewed-by: Matt Derksen <mderkse1@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Diffstat (limited to 'src/usr/isteps')
-rw-r--r--src/usr/isteps/pm/runtime/makefile2
-rw-r--r--src/usr/isteps/pm/runtime/rt_pm.C22
2 files changed, 19 insertions, 5 deletions
diff --git a/src/usr/isteps/pm/runtime/makefile b/src/usr/isteps/pm/runtime/makefile
index 2a98e0064..ecffa4f37 100644
--- a/src/usr/isteps/pm/runtime/makefile
+++ b/src/usr/isteps/pm/runtime/makefile
@@ -31,8 +31,6 @@ VPATH += ../
MODULE = pm_rt
-EXTRAINCDIR += ${ROOTPATH}/src/usr/scom/
-
## Objects unique to HBRT
OBJS += rt_pm.o
diff --git a/src/usr/isteps/pm/runtime/rt_pm.C b/src/usr/isteps/pm/runtime/rt_pm.C
index a3087e504..ef861563d 100644
--- a/src/usr/isteps/pm/runtime/rt_pm.C
+++ b/src/usr/isteps/pm/runtime/rt_pm.C
@@ -48,7 +48,7 @@
#include <targeting/common/targetservice.H>
#include <scom/scomif.H>
-#include "handleSpecialWakeup.H"
+#include <scom/wakeup.H>
using namespace TARGETING;
using namespace RUNTIME;
@@ -240,6 +240,21 @@ namespace RTPM
break;
}
+ // The PM Complex is now live, ensure that there are no
+ // lingering special wakeups enabled
+ l_err = WAKEUP::handleSpecialWakeup( proc_target,
+ WAKEUP::FORCE_DISABLE );
+ if( l_err )
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "Error disabling wakeup on %.8X",
+ TARGETING::get_huid(proc_target) );
+ //Just commit the log as informational and keep going
+ l_err->setSev(ERRL_SEV_INFORMATIONAL);
+ l_err->collectTrace(ISTEP_COMP_NAME,1024);
+ errlCommit( l_err, RUNTIME_COMP_ID );
+ l_err = nullptr;
+ }
} while(0);
if ( l_err )
@@ -252,6 +267,7 @@ namespace RTPM
}
+
/**
* @brief Reset OCC/HCODE on the specified chip
* @param[in] i_chip Processor Chip ID
@@ -366,7 +382,7 @@ namespace RTPM
}
// Enable special wakeup
- l_err = handleSpecialWakeup(i_target,true);
+ l_err = handleSpecialWakeup(i_target,WAKEUP::ENABLE);
if(l_err)
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
@@ -485,7 +501,7 @@ namespace RTPM
} // END else if (g_hostInterfaces->firmware_request != nullptr)
// Disable special wakeup
- l_err = handleSpecialWakeup(i_target,false);
+ l_err = handleSpecialWakeup(i_target,WAKEUP::DISABLE);
if(l_err)
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
OpenPOWER on IntegriCloud