summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2017-11-30 15:57:55 -0600
committerZane C. Shelley <zshelle@us.ibm.com>2017-12-11 17:21:53 -0500
commitb0255985c87e86701d53d850d7c51e93eaaee783 (patch)
treecbbd06054b71307a1275283599e9eb76139cd2a8 /src
parent9b826df04888393a5417b9a790ad748f0462dca9 (diff)
downloadtalos-hostboot-b0255985c87e86701d53d850d7c51e93eaaee783.tar.gz
talos-hostboot-b0255985c87e86701d53d850d7c51e93eaaee783.zip
PRD: Make sure IUE bit is set after threshold
Change-Id: I2d30ad4a093105a8e4efadf033900d4c92642e79 CQ: SW409822 Backport: release-op910 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/50365 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com> Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/50679 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/50676 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C99
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.H15
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C26
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfP9Mca.C8
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfP9Mcbist.C9
5 files changed, 107 insertions, 50 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C
index bdd2fbc7c..e9f6d59db 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.C
@@ -226,10 +226,9 @@ uint32_t maskMemPort<TYPE_MCA>( ExtensibleChip * i_chip )
#ifdef __HOSTBOOT_RUNTIME
template<>
-uint32_t iuePortFail<TYPE_MCA>( ExtensibleChip * i_chip,
- STEP_CODE_DATA_STRUCT & io_sc )
+uint32_t triggerPortFail<TYPE_MCA>( ExtensibleChip * i_chip )
{
- #define PRDF_FUNC "[MemEcc::iuePortFail<TYPE_MCA>] "
+ #define PRDF_FUNC "[MemEcc::triggerPortFail<TYPE_MCA>] "
PRDF_ASSERT( nullptr != i_chip );
PRDF_ASSERT( TYPE_MCA == i_chip->getType() );
@@ -238,48 +237,44 @@ uint32_t iuePortFail<TYPE_MCA>( ExtensibleChip * i_chip,
McaDataBundle * db = getMcaDataBundle( i_chip );
- // Loop through all our thresholds
- for ( auto & th : db->iv_iueTh )
+ do
{
- // If threshold reached
- if ( th.second.thReached(io_sc) )
+ // trigger a port fail
+ // set FARB0[59] - MBA_FARB0Q_CFG_INJECT_PARITY_ERR_CONSTANT and
+ // FARB0[40] - MBA_FARB0Q_CFG_INJECT_PARITY_ERR_ADDR5
+ SCAN_COMM_REGISTER_CLASS * farb0 = i_chip->getRegister("FARB0");
+
+ o_rc = farb0->Read();
+ if ( SUCCESS != o_rc )
{
- // trigger a port fail
- // set FARB0[59] - MBA_FARB0Q_CFG_INJECT_PARITY_ERR_CONSTANT and
- // FARB0[40] - MBA_FARB0Q_CFG_INJECT_PARITY_ERR_ADDR5
- SCAN_COMM_REGISTER_CLASS * farb0 = i_chip->getRegister("FARB0");
+ PRDF_ERR( PRDF_FUNC "Read() FARB0 failed: i_chip=0x%08x",
+ i_chip->getHuid() );
+ break;
+ }
- o_rc = farb0->Read();
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "Read() FARB0 failed: i_chip=0x%08x",
- i_chip->getHuid() );
- continue;
- }
+ farb0->SetBit(59);
+ farb0->SetBit(40);
- farb0->SetBit(59);
- farb0->SetBit(40);
+ o_rc = farb0->Write();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "Write() FARB0 failed: i_chip=0x%08x",
+ i_chip->getHuid() );
+ break;
+ }
- o_rc = farb0->Write();
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "Write() FARB0 failed: i_chip=0x%08x",
- i_chip->getHuid() );
- continue;
- }
+ // reset thresholds to prevent issuing multiple port failures on
+ // the same port
+ for ( auto & resetTh : db->iv_iueTh )
+ {
+ resetTh.second.reset();
+ }
- // reset thresholds to prevent issuing multiple port failures on
- // the same port
- for ( auto & resetTh : db->iv_iueTh )
- {
- resetTh.second.reset();
- }
+ db->iv_iuePortFail = true;
- db->iv_iuePortFail = true;
+ break;
+ }while(0);
- break;
- }
- }
return o_rc;
@@ -292,6 +287,36 @@ uint32_t iuePortFail<TYPE_MCA>( ExtensibleChip * i_chip,
#ifdef __HOSTBOOT_MODULE
+template<>
+bool queryIueTh<TYPE_MCA>( ExtensibleChip * i_chip,
+ STEP_CODE_DATA_STRUCT & io_sc )
+{
+ PRDF_ASSERT( nullptr != i_chip );
+ PRDF_ASSERT( TYPE_MCA == i_chip->getType() );
+
+ bool iueAtTh = false;
+
+ McaDataBundle * db = getMcaDataBundle( i_chip );
+
+ // Loop through all our thresholds
+ for ( auto & th : db->iv_iueTh )
+ {
+ // If threshold reached
+ if ( th.second.thReached(io_sc) )
+ {
+ iueAtTh = true;
+ }
+ }
+
+ return iueAtTh;
+}
+
+#endif
+
+//------------------------------------------------------------------------------
+
+#ifdef __HOSTBOOT_MODULE
+
template<TARGETING::TYPE T, typename D>
uint32_t addVcmEvent( ExtensibleChip * i_chip, const MemRank & i_rank,
const MemMark & i_mark, STEP_CODE_DATA_STRUCT & io_sc,
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.H b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.H
index 5a48cf951..5988e2478 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.H
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.H
@@ -181,19 +181,28 @@ uint32_t analyzeImpe( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc );
#ifdef __HOSTBOOT_RUNTIME
/**
- * @brief Will trigger a port fail if the number of IUEs is over threshold.
+ * @brief Will trigger a port fail.
* @param i_chip MCA chip
- * @param io_sc The step code data struct.
* @return Non-SUCCESS if an internal function fails, SUCCESS otherwise
*/
template<TARGETING::TYPE T>
-uint32_t iuePortFail( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc );
+uint32_t triggerPortFail( ExtensibleChip * i_chip );
#endif // __HOSTBOOT_RUNTIME
#ifdef __HOSTBOOT_MODULE
/**
+ * @brief Will query the data bundle and return if the IUE threshold has been
+ * reached.
+ * @param i_chip MCA chip
+ * @param io_sc The step code data struct.
+ * @return True if IUE threshold is reached, false if not.
+ */
+template<TARGETING::TYPE T>
+bool queryIueTh( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc );
+
+/**
* @brief Will mask off an entire memory port. At runtime will issue dynamic
* memory deallocation of the port.
* @param i_chip MCA chip
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C b/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C
index 59deae32c..bb1e88d3f 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C
@@ -216,13 +216,22 @@ PRDF_PLUGIN_DEFINE( p9_mca, AnalyzeFetchUe );
* @brief MCAECCFIR[17] - Mainline read IUE.
* @param i_chip MCA chip.
* @param io_sc The step code data struct.
- * @return SUCCESS
+ * @return PRD_NO_CLEAR_FIR_BITS if IUE threshold is reached, else SUCCESS.
*/
int32_t AnalyzeMainlineIue( ExtensibleChip * i_chip,
STEP_CODE_DATA_STRUCT & io_sc )
{
+ int32_t rc = SUCCESS;
MemEcc::analyzeMainlineIue<TYPE_MCA, McaDataBundle *>( i_chip, io_sc );
- return SUCCESS; // nothing to return to rule code
+
+ #ifdef __HOSTBOOT_MODULE
+
+ if ( MemEcc::queryIueTh<TYPE_MCA>(i_chip, io_sc) )
+ rc = PRD_NO_CLEAR_FIR_BITS;
+
+ #endif
+
+ return rc; // nothing to return to rule code
}
PRDF_PLUGIN_DEFINE( p9_mca, AnalyzeMainlineIue );
@@ -232,13 +241,22 @@ PRDF_PLUGIN_DEFINE( p9_mca, AnalyzeMainlineIue );
* @brief MCAECCFIR[37] - Maint IUE.
* @param i_chip MCA chip.
* @param io_sc The step code data struct.
- * @return SUCCESS
+ * @return PRD_NO_CLEAR_FIR_BITS if IUE threshold is reached, else SUCCESS.
*/
int32_t AnalyzeMaintIue( ExtensibleChip * i_chip,
STEP_CODE_DATA_STRUCT & io_sc )
{
+ int32_t rc = SUCCESS;
MemEcc::analyzeMaintIue<TYPE_MCA, McaDataBundle *>( i_chip, io_sc );
- return SUCCESS; // nothing to return to rule code
+
+ #ifdef __HOSTBOOT_MODULE
+
+ if ( MemEcc::queryIueTh<TYPE_MCA>(i_chip, io_sc) )
+ rc = PRD_NO_CLEAR_FIR_BITS;
+
+ #endif
+
+ return rc; // nothing to return to rule code
}
PRDF_PLUGIN_DEFINE( p9_mca, AnalyzeMaintIue );
diff --git a/src/usr/diag/prdf/plat/mem/prdfP9Mca.C b/src/usr/diag/prdf/plat/mem/prdfP9Mca.C
index 47df66743..0aca5b6f5 100644
--- a/src/usr/diag/prdf/plat/mem/prdfP9Mca.C
+++ b/src/usr/diag/prdf/plat/mem/prdfP9Mca.C
@@ -74,9 +74,13 @@ int32_t PostAnalysis( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc )
// right away. Since PRD is running in the hypervisor, it is possible we
// may not get the error log. To better our chances, we trigger the port
// fail here after the error log has been committed.
- if ( SUCCESS != MemEcc::iuePortFail<TYPE_MCA>(i_chip, io_sc) )
+ if ( MemEcc::queryIueTh<TYPE_MCA>(i_chip, io_sc) )
{
- PRDF_ERR( PRDF_FUNC "iuePortFail(0x%08x) failed", i_chip->getHuid() );
+ if ( SUCCESS != MemEcc::triggerPortFail<TYPE_MCA>(i_chip) )
+ {
+ PRDF_ERR( PRDF_FUNC "triggerPortFail(0x%08x) failed",
+ i_chip->getHuid() );
+ }
}
#endif // __HOSTBOOT_RUNTIME
diff --git a/src/usr/diag/prdf/plat/mem/prdfP9Mcbist.C b/src/usr/diag/prdf/plat/mem/prdfP9Mcbist.C
index 1b017194c..0af204dd2 100644
--- a/src/usr/diag/prdf/plat/mem/prdfP9Mcbist.C
+++ b/src/usr/diag/prdf/plat/mem/prdfP9Mcbist.C
@@ -110,12 +110,13 @@ int32_t PostAnalysis( ExtensibleChip * i_mcbChip,
}
// if there's an IUE and we've reached threshold trigger a port fail
- if ( eccAttns & MAINT_IUE )
+ if ( (eccAttns & MAINT_IUE) &&
+ MemEcc::queryIueTh<TYPE_MCA>(mca, io_sc) )
{
- if ( SUCCESS != MemEcc::iuePortFail<TYPE_MCA>(mca, io_sc) )
+ if ( SUCCESS != MemEcc::triggerPortFail<TYPE_MCA>(mca) )
{
- PRDF_ERR( PRDF_FUNC "iuePortFail(0x%08x) failed",
- i_mcbChip->getHuid() );
+ PRDF_ERR( PRDF_FUNC "triggerPortFail(0x%08x) failed",
+ mca->getHuid() );
}
}
}
OpenPOWER on IntegriCloud