diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2017-10-11 14:46:44 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2017-10-15 15:24:55 -0400 |
commit | 83ca368b50d825c822c5b6e4a7d759b4ae570c09 (patch) | |
tree | 336642a4f1e945a257657bcc27d90d2fb11f082f /src/usr/diag | |
parent | 387febcf8190024fc6217683df889ef5dea3d23c (diff) | |
download | talos-hostboot-83ca368b50d825c822c5b6e4a7d759b4ae570c09.tar.gz talos-hostboot-83ca368b50d825c822c5b6e4a7d759b4ae570c09.zip |
PRD: Ban TPS on a rank after first mainline UE
Change-Id: I225ab5b7ba8f6d74406ded26786e926083e95f67
CQ: SW404330
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/48263
Tested-by: Jenkins Server <pfd-jenkins+hostboot@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/48345
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/usr/diag')
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfP9McaDataBundle.H | 3 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemTps.H | 8 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C | 48 |
3 files changed, 42 insertions, 17 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfP9McaDataBundle.H b/src/usr/diag/prdf/common/plat/mem/prdfP9McaDataBundle.H index 117947fe2..a43486fdf 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfP9McaDataBundle.H +++ b/src/usr/diag/prdf/common/plat/mem/prdfP9McaDataBundle.H @@ -199,6 +199,9 @@ class McaDataBundle : public DataBundle * scrubbing is resumed. */ bool iv_maskMainlineNceTce = false; + /** Map to keep track of ranks that have banned TPS. */ + std::map<MemRank, bool> iv_tpsBans; + #endif }; diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTps.H b/src/usr/diag/prdf/plat/mem/prdfMemTps.H index 6facb1877..0f5e89d18 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTps.H +++ b/src/usr/diag/prdf/plat/mem/prdfMemTps.H @@ -54,7 +54,7 @@ class TpsEvent : public TdEntry * @param i_ban True to ban all subsequent requests for TPS on this rank. */ TpsEvent<T>( ExtensibleChip * i_chip, MemRank i_rank, bool i_ban = false ) : - TdEntry(TPS_EVENT, i_chip, i_rank) + TdEntry(TPS_EVENT, i_chip, i_rank), iv_ban(i_ban) { PRDF_ASSERT( nullptr != i_chip ); PRDF_ASSERT( T == i_chip->getType() ); @@ -136,9 +136,13 @@ class TpsEvent : public TdEntry */ uint32_t analyzeCe( STEP_CODE_DATA_STRUCT & io_sc ); - #endif // __HOSTBOOT_RUNTIME + + private: // instance variables + + /** True to ban all subsequent requests for TPS on this rank. */ + bool iv_ban = false; }; } // end namespace PRDF diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C b/src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C index ec0af1409..f9e732325 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C @@ -349,6 +349,14 @@ uint32_t TpsEvent<T>::analyzeTpsPhase1_rt( STEP_CODE_DATA_STRUCT & io_sc, // At this point, we are done with the procedure. o_done = true; + // If iv_ban is true, then ban TPS on this rank. + if ( iv_ban ) + { + // It doesn't matter what we set the value to, we just need to + // make sure the rank exists in the map. + getMcaDataBundle(iv_chip)->iv_tpsBans[iv_rank] = true; + } + // Since TPS is complete, clear the CE table for this slave rank. getMcaDataBundle(iv_chip)->iv_ceTable.deactivateRank( iv_rank ); @@ -1116,25 +1124,35 @@ uint32_t TpsEvent<TYPE_MCA>::nextStep( STEP_CODE_DATA_STRUCT & io_sc, o_done = false; - switch ( iv_phase ) + do { - case TD_PHASE_0: - // Start TPS phase 1 - o_rc = startTpsPhase1_rt( io_sc ); - break; - case TD_PHASE_1: - // Analyze TPS phase 1 - o_rc = analyzeTpsPhase1_rt( io_sc, o_done ); + // Check if TPS is banned on this rank. + if ( 1 == getMcaDataBundle(iv_chip)->iv_tpsBans.count(iv_rank) ) + { + // If TPS is banned, abort the procedure. + o_done = true; break; - default: PRDF_ASSERT( false ); // invalid phase + } - } + switch ( iv_phase ) + { + case TD_PHASE_0: + // Start TPS phase 1 + o_rc = startTpsPhase1_rt( io_sc ); + break; + case TD_PHASE_1: + // Analyze TPS phase 1 + o_rc = analyzeTpsPhase1_rt( io_sc, o_done ); + break; + default: PRDF_ASSERT( false ); // invalid phase + } - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "TPS failed: 0x%08x,0x%02x", iv_chip->getHuid(), - getKey() ); - } + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "TPS failed: 0x%08x,0x%02x", iv_chip->getHuid(), + getKey() ); + } + }while(0); return o_rc; |