diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2017-11-30 15:57:55 -0600 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2017-12-11 17:21:53 -0500 |
commit | b0255985c87e86701d53d850d7c51e93eaaee783 (patch) | |
tree | cbbd06054b71307a1275283599e9eb76139cd2a8 /src | |
parent | 9b826df04888393a5417b9a790ad748f0462dca9 (diff) | |
download | talos-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.C | 99 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemEccAnalysis.H | 15 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C | 26 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfP9Mca.C | 8 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfP9Mcbist.C | 9 |
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() ); } } } |