summaryrefslogtreecommitdiffstats
path: root/src/usr/htmgt/htmgt_occ.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/htmgt/htmgt_occ.C')
-rw-r--r--src/usr/htmgt/htmgt_occ.C120
1 files changed, 81 insertions, 39 deletions
diff --git a/src/usr/htmgt/htmgt_occ.C b/src/usr/htmgt/htmgt_occ.C
index 237df3e16..8a539f446 100644
--- a/src/usr/htmgt/htmgt_occ.C
+++ b/src/usr/htmgt/htmgt_occ.C
@@ -185,10 +185,14 @@ namespace HTMGT
uint8_t cmdData[2];
cmdData[0] = OCC_RESET_CMD_VERSION;
+ TMGT_INF("resetPrep: OCC%d (failed=%c, reset count=%d)",
+ iv_instance, iv_failed?'y':'n', iv_resetCount);
if(iv_failed)
{
cmdData[1] = OCC_RESET_FAIL_THIS_OCC;
++iv_resetCount;
+ TMGT_INF("resetPrep: OCC%d failed, incrementing reset count to %d",
+ iv_instance, iv_resetCount);
if(iv_resetCount > OCC_RESET_COUNT_THRESHOLD)
{
atThreshold = true;
@@ -221,13 +225,28 @@ namespace HTMGT
return atThreshold;
}
+
+ void Occ::postResetClear()
+ {
+ iv_state = OCC_STATE_UNKNOWN;
+ iv_commEstablished = false;
+ iv_needsReset = false;
+ iv_failed = false;
+ iv_lastPollValid = false;
+ iv_resetReason = OCC_RESET_REASON_NONE;
+ }
+
+
+
/////////////////////////////////////////////////////////////////
+ uint32_t OccManager::cv_safeReturnCode = 0;
+ uint32_t OccManager::cv_safeOccInstance = 0;
+
OccManager::OccManager()
- :iv_configDataBuilt(false),
- iv_occMaster(NULL),
+ :iv_occMaster(NULL),
iv_state(OCC_STATE_UNKNOWN),
iv_targetState(OCC_STATE_ACTIVE)
{
@@ -297,7 +316,7 @@ namespace HTMGT
((*proc)->getAttr<TARGETING::ATTR_HOMER_VIRT_ADDR>());
const uint8_t * homerPhys = (uint8_t*)
((*proc)->getAttr<TARGETING::ATTR_HOMER_PHYS_ADDR>());
- TMGT_INF("buildOccs: homer = 0x%08X (virt) / 0x%08X (phys)"
+ TMGT_INF("buildOccs: homer = 0x%08llX (virt) / 0x%08llX (phys)"
" for Proc%d", homer, homerPhys, instance);
#ifdef SIMICS_TESTING
// Starting of OCCs is not supported in SIMICS, so fake out
@@ -413,6 +432,18 @@ namespace HTMGT
// requests a new state, so we can update target here.
iv_targetState = requestedState;
+ _buildOccs(); // if not already built.
+
+ // Send poll cmd to confirm comm has been established.
+ // Flush old errors to ensure any new errors will be collected
+ l_err = _sendOccPoll(true, NULL);
+ if (l_err)
+ {
+ TMGT_ERR("_setOccState: Poll OCCs failed.");
+ // Proceed with reset even if failed
+ ERRORLOG::errlCommit(l_err, HTMGT_COMP_ID);
+ }
+
if (NULL != iv_occMaster)
{
TMGT_INF("_setOccState(state=0x%02X)", requestedState);
@@ -502,18 +533,15 @@ namespace HTMGT
TMGT_INF("_setOccState: All OCCs have reached state 0x%02X",
requestedState);
-#ifndef __HOSTBOOT_RUNTIME
if (OCC_STATE_ACTIVE == requestedState)
{
- CONSOLE::displayf(HTMGT_COMP_NAME,
- "OCCs are now running in ACTIVE state");
+ TMGT_CONSOLE("OCCs are now running in ACTIVE state");
}
else
{
- CONSOLE::displayf(HTMGT_COMP_NAME,
- "OCCs are now running in OBSERVATION state");
+ TMGT_CONSOLE("OCCs are now running in OBSERVATION "
+ "state");
}
-#endif
}
}
@@ -609,11 +637,11 @@ namespace HTMGT
occ != iv_occArray.end();
++occ)
{
- (*occ)->failed(false);
+ // After OCCs have been reset, clear flags
+ (*occ)->postResetClear();
}
TMGT_INF("Calling HBOCC::activateOCCs");
-
err = HBOCC::activateOCCs();
if(err)
{
@@ -654,6 +682,9 @@ namespace HTMGT
{
sys->setAttr<TARGETING::ATTR_HTMGT_SAFEMODE>(safeMode);
}
+
+ TMGT_ERR("_resetOccs: Safe Mode RC: 0x%04X (OCC%d)",
+ cv_safeReturnCode, cv_safeOccInstance);
}
return err;
@@ -740,6 +771,36 @@ namespace HTMGT
}
+ void OccManager::_updateSafeModeReason(uint32_t i_src,
+ uint32_t i_instance)
+ {
+ if (cv_safeReturnCode == 0)
+ {
+ // Only update safe mode reason for the first failure
+ cv_safeReturnCode = i_src;
+ cv_safeOccInstance = i_instance;
+ }
+ }
+
+
+ bool OccManager::_occNeedsReset()
+ {
+ bool needsReset = false;
+
+ for (std::vector<Occ*>::iterator pOcc = iv_occArray.begin();
+ pOcc < iv_occArray.end();
+ pOcc++)
+ {
+ if ((*pOcc)->needsReset())
+ {
+ needsReset = true;
+ break;
+ }
+ }
+
+ return needsReset;
+ }
+
uint8_t OccManager::getNumOccs()
{
@@ -788,36 +849,17 @@ namespace HTMGT
return Singleton<OccManager>::instance()._waitForOccCheckpoint();
}
-
-#if 0
- // TODO: RTC 115296
- void update_occ_data()
+ void OccManager::updateSafeModeReason(uint32_t i_src,
+ uint32_t i_instance)
{
- if (occMgr::instance().getNumOccs() > 0)
- {
- // TBD: define as one block of data or in each OCC target?
-
- uint32_t dataSize = occMgr::instance().getNumOccs() *
- sizeof(occInstance);
- if (dataSize > 256)
- {
- TMGT_ERR("update_occ_data: data exceeds attr size, truncating");
- dataSize = 256;
- }
- // Update OCC_CONTROL_DATA Attribute
- bool success = ->trySetAttr<ATTR_OCC_CONTROL_DATA>(dataSize, G_occ);
- if (false == success)
- {
- TMGT_ERR("update_occ_data: failed to update OCC_CONTROL_DATA");
- }
- }
- else
- {
- TMGT_INF("update_occ_data: No OCC data to update");
- }
- } // end update_occ_data()
-#endif
+ return Singleton<OccManager>::instance().
+ _updateSafeModeReason(i_src, i_instance);
+ }
+ bool OccManager::occNeedsReset()
+ {
+ return Singleton<OccManager>::instance()._occNeedsReset();
+ }
} // end namespace
OpenPOWER on IntegriCloud