From c7867f1449a1434338c2513c90b4a40438fa94d2 Mon Sep 17 00:00:00 2001 From: Zane Shelley Date: Thu, 17 May 2018 10:32:52 -0500 Subject: 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 Reviewed-by: Caleb N. Palmer Reviewed-by: Benjamin J. Weisenbeck Reviewed-by: Matt Derksen Reviewed-by: Brian J. Stegmiller Reviewed-by: Zane C. Shelley Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/59232 Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins --- src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.C | 11 ++++-- src/usr/diag/prdf/common/plat/mem/prdfMemCeTable.H | 5 ++- src/usr/diag/prdf/common/plat/mem/prdfMemDbUtils.H | 28 ++++++++++++++ .../diag/prdf/common/plat/mem/prdfMemRceTable.C | 14 +++++-- .../diag/prdf/common/plat/mem/prdfMemRceTable.H | 3 +- .../prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C | 45 ---------------------- src/usr/diag/prdf/plat/mem/prdfMemDsd_rt.C | 15 ++++++-- src/usr/diag/prdf/plat/mem/prdfMemTps_rt.C | 22 ++++++----- src/usr/diag/prdf/plat/mem/prdfMemVcm.H | 9 +++++ 9 files changed, 83 insertions(+), 69 deletions(-) (limited to 'src/usr') 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::addEntry( const MemAddr & i_addr, //------------------------------------------------------------------------------ template -void MemCeTable::deactivateRank( const MemRank & i_rank ) +void MemCeTable::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( 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 +void resetEccFfdc( ExtensibleChip * i_chip, const MemRank & i_rank, + AddrRangeType i_type ); + +template<> inline +void resetEccFfdc( ExtensibleChip * i_chip, + const MemRank & i_rank, + AddrRangeType i_type ) +{ + getMcaDataBundle(i_chip)->iv_ceTable.deactivateRank( i_rank, i_type ); +} + +template<> inline +void resetEccFfdc( 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::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::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( iv_chip, iv_rank, MASTER_RANK ); + } return o_rc; @@ -117,7 +125,6 @@ uint32_t DsdEvent::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::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::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( iv_chip, iv_rank ); + // Clear the ECC FFDC for this master rank. + MemDbUtils::resetEccFfdc( iv_chip, iv_rank, MASTER_RANK ); + + if ( iv_ban ) + { + // Ban TPS on this rank. + MemDbUtils::banTps( 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 #include #include #include @@ -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( iv_chip, iv_rank, MASTER_RANK ); + } + #endif + return o_rc; #undef PRDF_FUNC -- cgit v1.2.1