summaryrefslogtreecommitdiffstats
path: root/src/usr/errl/runtime
diff options
context:
space:
mode:
authorBrian Horton <brianh@linux.ibm.com>2015-06-02 10:13:20 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2015-09-03 14:33:02 -0500
commit06e40c4aa3efe6f006dc7971ad58f08f42117ea3 (patch)
treee7bcc5a38340a630c17126bc3782064e2c0b9274 /src/usr/errl/runtime
parent4ae690e4eeb9297ed59ff932cc4184d23896234d (diff)
downloadtalos-hostboot-06e40c4aa3efe6f006dc7971ad58f08f42117ea3.tar.gz
talos-hostboot-06e40c4aa3efe6f006dc7971ad58f08f42117ea3.zip
add support to write errlog to PNOR during runtime
Change-Id: Ia2b211d8ebf489e92f2bc3d281d92175a6b61f30 Depends-On: I170d6586062b6e4684a55782df83a1b19ed7d937 Depends-On: Id8c44b0dcdb5714c163ac6485a53216786f9fbcf Depends-On: I626bce5c8c0c8b7d0a44408280de178c7a86a83f RTC: 123419 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/18233 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Reviewed-by: STEPHEN M. CPREK <smcprek@us.ibm.com> Tested-by: Jenkins OP HW Reviewed-by: WILLIAM G. HOFFA <wghoffa@us.ibm.com> Tested-by: FSP CI Jenkins Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/errl/runtime')
-rw-r--r--src/usr/errl/runtime/rt_errlmanager.C171
1 files changed, 86 insertions, 85 deletions
diff --git a/src/usr/errl/runtime/rt_errlmanager.C b/src/usr/errl/runtime/rt_errlmanager.C
index ff668a7c4..f75844172 100644
--- a/src/usr/errl/runtime/rt_errlmanager.C
+++ b/src/usr/errl/runtime/rt_errlmanager.C
@@ -33,6 +33,7 @@
#include <string.h>
#include <runtime/interface.h>
#include <targeting/common/targetservice.H>
+#include <pnor/pnorif.H>
namespace ERRORLOG
{
@@ -61,21 +62,27 @@ bool rt_processCallout(errlHndl_t &io_errl,
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
-ErrlManager::ErrlManager()
- :
+ErrlManager::ErrlManager() :
iv_currLogId(0),
iv_pStorage(NULL),
iv_hwasProcessCalloutFn(NULL),
- iv_msgQ(NULL)
+ iv_pnorAddr(NULL),
+ iv_maxErrlInPnor(0),
+ iv_pnorOpenSlot(0),
+ iv_isSpBaseServices(false),
+#ifdef CONFIG_BMC_IPMI
+ iv_isIpmiEnabled(true)
+#else
+ iv_isIpmiEnabled(false)
+#endif
{
- TRACFCOMP( g_trac_errl, ENTER_MRK "ErrlManager::ErrlManager constructor" );
-
+ TRACFCOMP( g_trac_errl, ENTER_MRK "ErrlManager::ErrlManager constructor." );
iv_hwasProcessCalloutFn = rt_processCallout;
+ // determine starting PLID value
TARGETING::Target * sys = NULL;
TARGETING::targetService().getTopLevelTarget( sys );
-
if(sys)
{
iv_currLogId = sys->getAttr<TARGETING::ATTR_HOSTSVC_PLID>();
@@ -90,10 +97,34 @@ ErrlManager::ErrlManager()
}
else
{
- iv_currLogId = 0x9fbad000;
+ iv_currLogId = 0x89bad000;
TRACFCOMP( g_trac_errl, ERR_MRK"HOSTSVC_PLID not available" );
}
+#if 1
+// TODO: RTC 131067
+// for now do this. but the real code should be the #else below.
+#ifdef CONFIG_BMC_IPMI
+ // setup so that we can write the error log to PNOR
+ setupPnorInfo();
+#endif
+#else
+ // check if there's an FSP. if not, then we write to PNOR
+ TARGETING::SpFunctions spfn;
+ if (!(sys &&
+ sys->tryGetAttr<TARGETING::ATTR_SP_FUNCTIONS>(spfn) &&
+ spfn.baseServices))
+ {
+ iv_isSpBaseServices = false;
+ TRACFCOMP( g_trac_errl, INFO_MRK"no baseServices, setting up to save to pnor" );
+ setupPnorInfo();
+ }
+ else
+ {
+ iv_isSpBaseServices = true;
+ }
+#endif
+
TRACFCOMP( g_trac_errl, EXIT_MRK "ErrlManager::ErrlManager constructor." );
}
@@ -102,44 +133,60 @@ ErrlManager::ErrlManager()
ErrlManager::~ErrlManager()
{
TRACFCOMP( g_trac_errl, INFO_MRK"ErrlManager::ErrlManager destructor" );
+#if 1
+// TODO: RTC 131067
+// for now do this. but the real code should be the #else below.
+#ifdef CONFIG_BMC_IPMI
+ // if we saved to PNOR, we need to flush
+ TRACFCOMP( g_trac_errl, INFO_MRK"flushing pnor" );
+ PNOR::flush(PNOR::HB_ERRLOGS);
+#endif
+#else
+ if (!iv_isSpBaseServices)
+ {
+ // if we saved to PNOR, we need to flush
+ TRACFCOMP( g_trac_errl, INFO_MRK"no baseServices, flushing pnor" );
+ PNOR::flush(PNOR::HB_ERRLOGS);
+ }
+#endif
}
///////////////////////////////////////////////////////////////////////////////
-// ErrlManager::msgQueueInit()
-///////////////////////////////////////////////////////////////////////////////
-void ErrlManager::msgQueueInit ( void )
-{
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// ErrlManager::startup()
-///////////////////////////////////////////////////////////////////////////////
-void * ErrlManager::startup ( void* i_self )
-{
- return NULL;
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// ErrlManager::errlogMsgHndlr()
-///////////////////////////////////////////////////////////////////////////////
-void ErrlManager::errlogMsgHndlr ( void )
-{
- // Not used in HB_RUNTIME
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
// ErrlManager::sendMboxMsg()
///////////////////////////////////////////////////////////////////////////////
void ErrlManager::sendMboxMsg ( errlHndl_t& io_err )
{
- TRACFCOMP( g_trac_errl, ENTER_MRK"ErrlManager::sendToHypervisor" );
do
{
+#if 1
+// TODO: RTC 131067
+// for now do this. but the real code should be the #else below.
+#ifdef CONFIG_BMC_IPMI
+ bool l_savedToPnor = saveErrLogToPnor(io_err);
+ if (!l_savedToPnor)
+ {
+ TRACFCOMP( g_trac_errl, ENTER_MRK"saveErrLogToPnor didn't save 0x%X",
+ io_err->eid());
+ }
+#endif
+#else
+ if (!iv_isSpBaseServices)
+ {
+ // save to PNOR
+ TRACFCOMP( g_trac_errl, INFO_MRK"no baseServices, saving to pnor" );
+ bool l_savedToPnor = saveErrLogToPnor(io_err);
+ if (!l_savedToPnor)
+ {
+ TRACFCOMP( g_trac_errl, ENTER_MRK"saveErrLogToPnor didn't save 0x%X",
+ io_err->eid());
+ }
+ }
+#endif
+
#ifdef CONFIG_BMC_IPMI
TRACFCOMP(g_trac_errl,INFO_MRK"Send msg to BMC for errlogId [0x%08x]",
io_err->plid() );
+
// convert to SEL/eSEL and send to BMC over IPMI
sendErrLogToBmc(io_err);
#else
@@ -225,64 +272,12 @@ void ErrlManager::commitErrLog(errlHndl_t& io_err, compId_t i_committerComp )
}
///////////////////////////////////////////////////////////////////////////////
-// ErrlManager::saveErrLogEntry()
-///////////////////////////////////////////////////////////////////////////////
-void ErrlManager::saveErrLogEntry( errlHndl_t& io_err )
-{
- return;
-}
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Atomically increment log id and return it.
-uint32_t ErrlManager::getUniqueErrId()
-{
- return (__sync_add_and_fetch(&iv_currLogId, 1));
-}
-
-///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void ErrlManager::setHwasProcessCalloutFn(HWAS::processCalloutFn i_fn)
{
ERRORLOG::theErrlManager::instance().iv_hwasProcessCalloutFn = i_fn;
}
-///////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////
-// Global function (not a method on an object) to commit the error log.
-void errlCommit(errlHndl_t& io_err, compId_t i_committerComp )
-{
- ERRORLOG::theErrlManager::instance().commitErrLog(io_err, i_committerComp );
- return;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////
-// Global function (not a method on an object) to get the hidden logs flag.
-uint8_t getHiddenLogsEnable( )
-{
- return ERRORLOG::theErrlManager::instance().iv_hiddenErrLogsEnable;
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// ErrlManager::sendErrlogToMessageQueue()
-///////////////////////////////////////////////////////////////////////////////
-void ErrlManager::sendErrlogToMessageQueue ( errlHndl_t& io_err,
- compId_t i_committerComp )
-{
- return;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// ErrlManager::errlogShutdown()
-///////////////////////////////////////////////////////////////////////////////
-void ErrlManager::errlogShutdown(void)
-{
- return;
-}
-
// Runtime processCallout
bool rt_processCallout(errlHndl_t &io_errl,
uint8_t * i_pData,
@@ -309,4 +304,10 @@ bool rt_processCallout(errlHndl_t &io_errl,
return true;
}
+void ErrlManager::errlAckErrorlog(uint32_t i_eid)
+{
+ ERRORLOG::theErrlManager::instance().ackErrLogInPnor(i_eid);
+ return;
+}
+
} // End namespace
OpenPOWER on IntegriCloud