summaryrefslogtreecommitdiffstats
path: root/src/usr/diag
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2017-10-11 14:46:44 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2017-10-15 15:24:55 -0400
commit83ca368b50d825c822c5b6e4a7d759b4ae570c09 (patch)
tree336642a4f1e945a257657bcc27d90d2fb11f082f /src/usr/diag
parent387febcf8190024fc6217683df889ef5dea3d23c (diff)
downloadtalos-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.H3
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTps.H8
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C48
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;
OpenPOWER on IntegriCloud