summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2018-05-17 10:32:52 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2018-05-23 15:11:38 -0400
commitc7867f1449a1434338c2513c90b4a40438fa94d2 (patch)
tree23580546c9c6c033fff6184e06eb79ace68406b6 /src/usr
parentaa0df6e89b162c23dba8ae758bbb31badf2eb1cb (diff)
downloadtalos-hostboot-c7867f1449a1434338c2513c90b4a40438fa94d2.tar.gz
talos-hostboot-c7867f1449a1434338c2513c90b4a40438fa94d2.zip
PRD: flush CE and RCE tables when a TD procedure is complete
Change-Id: I38cd427015efae87396189420c23f9549eec3db5 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/59116 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com> Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com> Reviewed-by: Matt Derksen <mderkse1@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/59232 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')
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.C11
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.H5
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemDbUtils.H28
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemRceTable.C14
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/mem/prdfMemRceTable.H3
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C45
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemDsd_rt.C15
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C22
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemVcm.H9
9 files changed, 83 insertions, 69 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.C b/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.C
index 493c45280..652f27dc6 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2013,2017 */
+/* Contributors Listed Below - COPYRIGHT 2013,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -167,15 +167,20 @@ uint32_t MemCeTable<T>::addEntry( const MemAddr & i_addr,
//------------------------------------------------------------------------------
template <TARGETING::TYPE T>
-void MemCeTable<T>::deactivateRank( const MemRank & i_rank )
+void MemCeTable<T>::deactivateRank( const MemRank & i_rank,
+ AddrRangeType i_type )
{
// NOTE: We don't want to reset the count here because it will be used for
// FFDC. Instead the count will be reset in addEntry() if the entry is
// not active.
for ( auto & entry : iv_table )
{
- if ( entry.addr.getRank() == i_rank )
+ if ( ( (SLAVE_RANK == i_type) && (entry.addr.getRank() == i_rank) ) ||
+ ( (MASTER_RANK == i_type) &&
+ (entry.addr.getRank().getMaster() == i_rank.getMaster()) ) )
+ {
entry.active = false;
+ }
}
}
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.H b/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.H
index 0f21ff457..b0fd50520 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.H
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2013,2017 */
+/* Contributors Listed Below - COPYRIGHT 2013,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -114,8 +114,9 @@ class MemCeTable
/**
* @brief Deactivates all entries covered by a rank.
* @param i_rank The target rank.
+ * @param i_type See enum AddrRangeType.
*/
- void deactivateRank( const MemRank & i_rank );
+ void deactivateRank( const MemRank & i_rank, AddrRangeType i_type );
/**
* @brief Gathers all table data to be stored in capture data.
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemDbUtils.H b/src/usr/diag/prdf/common/plat/mem/prdfMemDbUtils.H
index 9028dec8e..5bc67e60c 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemDbUtils.H
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemDbUtils.H
@@ -98,6 +98,34 @@ void addUeTableEntry<TARGETING::TYPE_MBA>( ExtensibleChip * i_chip,
getMbaDataBundle(i_chip)->iv_ueTable.addEntry( i_type, i_addr );
}
+/**
+ * @brief Generic wrapper to reset ECC FFDC for a rank.
+ * @param i_chip MCA or MBA.
+ * @param i_rank Target rank.
+ * @param i_type See enum AddrRangeType.
+ * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
+ */
+template<TARGETING::TYPE T>
+void resetEccFfdc( ExtensibleChip * i_chip, const MemRank & i_rank,
+ AddrRangeType i_type );
+
+template<> inline
+void resetEccFfdc<TARGETING::TYPE_MCA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ AddrRangeType i_type )
+{
+ getMcaDataBundle(i_chip)->iv_ceTable.deactivateRank( i_rank, i_type );
+}
+
+template<> inline
+void resetEccFfdc<TARGETING::TYPE_MBA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ AddrRangeType i_type )
+{
+ getMbaDataBundle(i_chip)->iv_ceTable.deactivateRank( i_rank, i_type );
+ getMbaDataBundle(i_chip)->iv_rceTable.flushEntry( i_rank, i_type );
+}
+
//##############################################################################
// Hostboot IPL/Runtime wrappers
//##############################################################################
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemRceTable.C b/src/usr/diag/prdf/common/plat/mem/prdfMemRceTable.C
index 9655db669..344a40722 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemRceTable.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemRceTable.C
@@ -63,11 +63,17 @@ bool MemRceTable::addEntry( const MemRank & i_rank,
//------------------------------------------------------------------------------
-void MemRceTable::flushEntry( const MemRank & i_rank )
+void MemRceTable::flushEntry( const MemRank & i_rank, AddrRangeType i_type )
{
- RceTable::iterator it = iv_table.find( i_rank );
- if ( iv_table.end() != it )
- it->second.reset();
+ for ( auto & entry : iv_table )
+ {
+ if ( ( (SLAVE_RANK == i_type) && (entry.first == i_rank) ) ||
+ ( (MASTER_RANK == i_type) &&
+ (entry.first.getMaster() == i_rank.getMaster()) ) )
+ {
+ entry.second.reset();
+ }
+ }
}
//------------------------------------------------------------------------------
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemRceTable.H b/src/usr/diag/prdf/common/plat/mem/prdfMemRceTable.H
index f475c38d4..5cebcdb68 100755
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemRceTable.H
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemRceTable.H
@@ -79,8 +79,9 @@ class MemRceTable
/**
* @brief Flush entry covered by a rank.
* @param i_rank The target rank.
+ * @param i_type See enum AddrRangeType.
*/
- void flushEntry( const MemRank & i_rank );
+ void flushEntry( const MemRank & i_rank, AddrRangeType i_type );
/**
* @brief Gathers all table data to be stored in capture data.
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C
index 313f55f9f..88fd4dc00 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C
@@ -596,51 +596,6 @@ int32_t CenMbaTdCtlr::startTpsPhase1( STEP_CODE_DATA_STRUCT & io_sc )
//------------------------------------------------------------------------------
-int32_t CenMbaTdCtlr::handleTdComplete( STEP_CODE_DATA_STRUCT & io_sc )
-{
- #define PRDF_FUNC "[CenMbaTdCtlr::handleTdComplete] "
-
- int32_t o_rc = SUCCESS;
-
- do
- {
- // A TD procedure has completed. Deactivate all entries in the CE table
- // for the rank that was just targeted. This must be done before finding
- // the next good rank so that iv_rank will contain the rank that was
- // just targeted. Also remove the entry from RCE table.
- CenMbaDataBundle * mbadb = getMbaDataBundle( iv_mbaChip );
- mbadb->iv_ceTable.deactivateRank( iv_rank );
- mbadb->iv_rceTable.flushEntry( iv_rank );
-
- // Clear out the mark, just in case. This is so we don't accidentally
- // callout this mark on another rank in an error path scenario.
- iv_mark = CenMark();
-
- // Remove TD request from the queue.
- o_rc = removeTdQueueEntry();
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "removeTdQueueEntry() failed" );
- break;
- }
-
- // Move on to the next TD procedure or restart background scrubbing.
- o_rc = startNextTd( io_sc );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "startNextTd() failed" );
- break;
- }
-
- } while (0);
-
- return o_rc;
-
- #undef PRDF_FUNC
-}
-
-//------------------------------------------------------------------------------
-
int32_t CenMbaTdCtlr::addTdQueueEntryTPS( const CenRank & i_rank,
STEP_CODE_DATA_STRUCT & io_sc,
bool i_banTps )
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemDsd_rt.C b/src/usr/diag/prdf/plat/mem/prdfMemDsd_rt.C
index 668496476..031de5507 100644
--- a/src/usr/diag/prdf/plat/mem/prdfMemDsd_rt.C
+++ b/src/usr/diag/prdf/plat/mem/prdfMemDsd_rt.C
@@ -49,6 +49,9 @@ uint32_t DsdEvent<T>::analyzePhase( STEP_CODE_DATA_STRUCT & io_sc,
uint32_t o_rc = SUCCESS;
+ // TODO: RTC 189221 remove once function is supported
+ PRDF_ERR( PRDF_FUNC "not supported yet" );
+
do
{
if ( TD_PHASE_0 == iv_phase )
@@ -69,11 +72,16 @@ uint32_t DsdEvent<T>::analyzePhase( STEP_CODE_DATA_STRUCT & io_sc,
// TODO: RTC 189221 finish supporting this function.
+ // At this point, we are done with the procedure.
+ o_done = true;
+
} while (0);
- // TODO: RTC 189221 remove once function is supported
- PRDF_ERR( PRDF_FUNC "not supported yet" );
- o_done = true; // to ensure nothing else gets executed
+ if ( (SUCCESS == o_rc) && o_done )
+ {
+ // Clear the ECC FFDC for this master rank.
+ MemDbUtils::resetEccFfdc<T>( iv_chip, iv_rank, MASTER_RANK );
+ }
return o_rc;
@@ -117,7 +125,6 @@ uint32_t DsdEvent<TYPE_MBA>::startCmd()
#undef PRDF_FUNC
}
-
//------------------------------------------------------------------------------
} // 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 526e52e00..57443c036 100644
--- a/src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C
+++ b/src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C
@@ -329,7 +329,6 @@ uint32_t TpsEvent<T>::analyzeTpsPhase1_rt( STEP_CODE_DATA_STRUCT & io_sc,
}
if ( o_done ) break;
-
// Analyze CEs
o_rc = analyzeCe( io_sc );
if ( SUCCESS != o_rc )
@@ -341,18 +340,21 @@ uint32_t TpsEvent<T>::analyzeTpsPhase1_rt( STEP_CODE_DATA_STRUCT & io_sc,
// At this point, we are done with the procedure.
o_done = true;
- // Since TPS is complete, clear the CE table for this slave rank.
- getMcaDataBundle(iv_chip)->iv_ceTable.deactivateRank( iv_rank );
-
- }while(0);
+ } while (0);
- // If iv_ban is true and this procedure is done, then ban TPS on this rank.
- if ( iv_ban && o_done )
+ if ( (SUCCESS == o_rc) && o_done )
{
- MemDbUtils::banTps<T>( iv_chip, iv_rank );
+ // Clear the ECC FFDC for this master rank.
+ MemDbUtils::resetEccFfdc<T>( iv_chip, iv_rank, MASTER_RANK );
+
+ if ( iv_ban )
+ {
+ // Ban TPS on this rank.
+ MemDbUtils::banTps<T>( iv_chip, iv_rank );
- // Permanently mask mainline NCEs and TCEs.
- getMcaDataBundle(iv_chip)->iv_maskMainlineNceTce = true;
+ // Permanently mask mainline NCEs and TCEs.
+ getMcaDataBundle(iv_chip)->iv_maskMainlineNceTce = true;
+ }
}
return o_rc;
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemVcm.H b/src/usr/diag/prdf/plat/mem/prdfMemVcm.H
index 28f347030..ccfa4475c 100644
--- a/src/usr/diag/prdf/plat/mem/prdfMemVcm.H
+++ b/src/usr/diag/prdf/plat/mem/prdfMemVcm.H
@@ -29,6 +29,7 @@
#define __prdfMemVcm_H
// Platform includes
+#include <prdfMemDbUtils.H>
#include <prdfMemEccAnalysis.H>
#include <prdfMemMark.H>
#include <prdfMemScrubUtils.H>
@@ -233,6 +234,14 @@ class VcmEvent : public TdEntry
} while (0);
+ #ifdef __HOSTBOOT_RUNTIME
+ if ( (SUCCESS == o_rc) && o_done )
+ {
+ // Clear the ECC FFDC for this master rank.
+ MemDbUtils::resetEccFfdc<T>( iv_chip, iv_rank, MASTER_RANK );
+ }
+ #endif
+
return o_rc;
#undef PRDF_FUNC
OpenPOWER on IntegriCloud