From 83ca368b50d825c822c5b6e4a7d759b4ae570c09 Mon Sep 17 00:00:00 2001 From: Caleb Palmer Date: Wed, 11 Oct 2017 14:46:44 -0500 Subject: [PATCH] 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 Reviewed-by: Brian J. Stegmiller Reviewed-by: Zane C. Shelley Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/48345 Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins --- .../common/plat/mem/prdfP9McaDataBundle.H | 3 ++ src/usr/diag/prdf/plat/mem/prdfMemTps.H | 8 +++- 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 117947fe216..a43486fdfc2 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 iv_tpsBans; + #endif }; diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTps.H b/src/usr/diag/prdf/plat/mem/prdfMemTps.H index 6facb1877f2..0f5e89d18f3 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( 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 ec0af140975..f9e732325c8 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::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::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;