diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2016-11-02 14:49:21 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2016-11-10 11:13:15 -0500 |
commit | 6f748dedb37487fec125e21ce463958e9aef646c (patch) | |
tree | 8312e0a36943fee6ca7923727ddbc04870d30bc1 /src/usr/diag/prdf/plat | |
parent | bfa11bef304b6a3ac4dc05f9b41b218210a1d0ca (diff) | |
download | talos-hostboot-6f748dedb37487fec125e21ce463958e9aef646c.tar.gz talos-hostboot-6f748dedb37487fec125e21ce463958e9aef646c.zip |
PRD: update startBgScrub() to clear counters and attentions before starting
Change-Id: I03026afdedfb7d3e2a97bf7d6ace8be809922479
RTC: 164215
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/32311
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com>
Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/32442
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/usr/diag/prdf/plat')
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemBgScrub.H | 27 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H | 46 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C | 2 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices.C | 88 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices.H | 5 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices_rt.C | 24 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices_rt.H | 4 |
7 files changed, 125 insertions, 71 deletions
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemBgScrub.H b/src/usr/diag/prdf/plat/mem/prdfMemBgScrub.H index 19f4781ed..302eacf77 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemBgScrub.H +++ b/src/usr/diag/prdf/plat/mem/prdfMemBgScrub.H @@ -65,31 +65,6 @@ uint32_t startInitialBgScrub( ExtensibleChip * i_chip ) do { - // Cleanup hardware before starting the maintenance command. - o_rc = clearCmdCompleteAttn<T>( i_chip ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "clearCmdCompleteAttn<T>(0x%08x) failed", - i_chip->getHuid() ); - break; - } - - o_rc = clearEccCounters<T>( i_chip ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "clearEccCounters<T>(0x%08x) failed", - i_chip->getHuid() ); - break; - } - - o_rc = clearEccFirs<T>( i_chip ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "clearEccFirs<T>(0x%08x) failed", - i_chip->getHuid() ); - break; - } - // Get the first configured rank. std::vector<MemRank> ranklist; PlatServices::getMasterRanks<T>( i_chip->getTrgt(), ranklist ); @@ -97,7 +72,7 @@ uint32_t startInitialBgScrub( ExtensibleChip * i_chip ) MemRank rank = ranklist.front(); // Start background scrubbing. - o_rc = PlatServices::startBgScrub<T>( i_chip->getTrgt(), rank ); + o_rc = PlatServices::startBgScrub<T>( i_chip, rank ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "startBgScrub(0x%08x,%d) failed", diff --git a/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H b/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H index 93172b0e5..6f2302d1c 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H +++ b/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H @@ -61,6 +61,52 @@ uint32_t clearEccCounters( ExtensibleChip * i_chip ); template<TARGETING::TYPE T> uint32_t clearEccFirs( ExtensibleChip * i_chip ); +/** + * @brief Wrapper function that calls clearEccCounters(), clearEccFirs() and + * clearCmdCompleteAttn(). + * @param i_chip MBA, MCA, or MCBIST. + * @return Non-SUCCESS on SCOM failures, SUCCESS otherwise. + */ +template<TARGETING::TYPE T> +uint32_t prepareNextCmd( ExtensibleChip * i_chip ) +{ + #define PRDF_FUNC "[prepareNextCmd] " + + uint32_t o_rc = SUCCESS; + + do + { + o_rc = clearEccCounters<T>( i_chip ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "clearEccCounters<T>(0x%08x) failed", + i_chip->getHuid() ); + break; + } + + o_rc = clearEccFirs<T>( i_chip ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "clearEccFirs<T>(0x%08x) failed", + i_chip->getHuid() ); + break; + } + + o_rc = clearCmdCompleteAttn<T>( i_chip ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "clearCmdCompleteAttn<T>(0x%08x) failed", + i_chip->getHuid() ); + break; + } + + } while (0); + + return o_rc; + + #undef PRDF_FUNC +} + /** @brief Contains all supported ECC attentions. Each enum is used in a mask, * so the value of each enum must be unique and disjoint. */ enum MaintEccAttns diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C index 764bcd905..ec5b48c8b 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C @@ -133,7 +133,7 @@ uint32_t MemTdCtlr<T,D>::handleTdEvent( STEP_CODE_DATA_STRUCT & io_sc, if ( nullptr != iv_curProcedure ) break; // Stop background scrubbing. - o_rc = PlatServices::stopBgScrub<T>( iv_chip->getTrgt() ); + o_rc = PlatServices::stopBgScrub<T>( iv_chip ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "stopBgScrub<T>(0x%08x) failed", diff --git a/src/usr/diag/prdf/plat/prdfPlatServices.C b/src/usr/diag/prdf/plat/prdfPlatServices.C index 4e842fe35..3bc2aef31 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices.C +++ b/src/usr/diag/prdf/plat/prdfPlatServices.C @@ -38,6 +38,8 @@ #include <prdfTrace.H> #include <prdfAssert.h> +#include <prdfMemScrubUtils.H> + #include <iipServiceDataCollector.h> #include <UtilHash.H> @@ -293,22 +295,22 @@ TARGETING::TargetHandle_t getActiveRefClk(TARGETING::TargetHandle_t //############################################################################## template<> -uint32_t startBgScrub<TYPE_MCA>( TargetHandle_t i_trgt, const MemRank & i_rank ) +uint32_t startBgScrub<TYPE_MCA>( ExtensibleChip * i_mcaChip, + const MemRank & i_rank ) { #define PRDF_FUNC "[PlatServices::startBgScrub<TYPE_MCA>] " - PRDF_ASSERT( nullptr != i_trgt ); - PRDF_ASSERT( TYPE_MCA == getTargetType(i_trgt) ); - - uint32_t rc = SUCCESS; + PRDF_ASSERT( nullptr != i_mcaChip ); + PRDF_ASSERT( TYPE_MCA == i_mcaChip->getType() ); - TargetHandle_t mcbTrgt = getConnectedParent( i_trgt, TYPE_MCBIST ); - PRDF_ASSERT( nullptr != mcbTrgt ); + uint32_t o_rc = SUCCESS; - uint32_t port = getTargetPosition(i_trgt) % MAX_MCA_PER_MCBIST; - - fapi2::Target<fapi2::TARGET_TYPE_MCBIST> fapiTrgt ( mcbTrgt ); + // Get the MCBIST fapi target + ExtensibleChip * mcbChip = getConnectedParent( i_mcaChip, TYPE_MCBIST ); + PRDF_ASSERT( nullptr != mcbChip ); + fapi2::Target<fapi2::TARGET_TYPE_MCBIST> fapiTrgt ( mcbChip->getTrgt() ); + // Get the stop conditions. mss::mcbist::stop_conditions stopCond; stopCond.set_thresh_nce_int(1) .set_thresh_nce_soft(1) @@ -318,9 +320,12 @@ uint32_t startBgScrub<TYPE_MCA>( TargetHandle_t i_trgt, const MemRank & i_rank ) .set_pause_on_aue(mss::ON) .set_nce_hard_symbol_count_enable(mss::ON); + // Get the scrub speed. mss::mcbist::speed scrubSpeed = enableFastBgScrub() ? mss::mcbist::LUDICROUS : mss::mcbist::BG_SCRUB; + // Get the first address of the given rank. + uint32_t port = i_mcaChip->getPos() % MAX_MCA_PER_MCBIST; mss::mcbist::address saddr, eaddr; mss::mcbist::address::get_srank_range( port, i_rank.getDimmSlct(), @@ -329,18 +334,34 @@ uint32_t startBgScrub<TYPE_MCA>( TargetHandle_t i_trgt, const MemRank & i_rank ) saddr, eaddr ); - fapi2::ReturnCode fapi_rc = memdiags::background_scrub( fapiTrgt, stopCond, - scrubSpeed, saddr ); - - errlHndl_t errl = fapi2::rcToErrl( fapi_rc ); - if ( nullptr != errl ) + do { - PRDF_ERR( PRDF_FUNC "memdiags::stop(0x%08x) failed", getHuid(i_trgt) ); - PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); - rc = FAIL; - } + // Clear all of the counters and maintenance ECC attentions. + o_rc = prepareNextCmd<TYPE_MCBIST>( mcbChip ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "prepareNextCmd(0x%08x) failed", + mcbChip->getHuid() ); + break; + } - return rc; + // Start the background scrub command. + fapi2::ReturnCode fapi_rc = memdiags::background_scrub( fapiTrgt, + stopCond, + scrubSpeed, + saddr ); + errlHndl_t errl = fapi2::rcToErrl( fapi_rc ); + if ( nullptr != errl ) + { + PRDF_ERR( PRDF_FUNC "memdiags::background_scrub(0x%08x,%d) failed", + mcbChip->getHuid(), i_rank.getMaster() ); + PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); + o_rc = FAIL; break; + } + + } while (0); + + return o_rc; #undef PRDF_FUNC } @@ -350,20 +371,33 @@ uint32_t startBgScrub<TYPE_MCA>( TargetHandle_t i_trgt, const MemRank & i_rank ) //############################################################################## template<> -uint32_t startBgScrub<TYPE_MBA>( TargetHandle_t i_trgt, +uint32_t startBgScrub<TYPE_MBA>( ExtensibleChip * i_mbaChip, const MemRank & i_rank ) { #define PRDF_FUNC "[PlatServices::startBgScrub<TYPE_MBA>] " - PRDF_ASSERT( nullptr != i_trgt ); - PRDF_ASSERT( TYPE_MBA == getTargetType(i_trgt) ); + PRDF_ASSERT( nullptr != i_mbaChip ); + PRDF_ASSERT( TYPE_MBA == i_mbaChip->getType() ); - uint32_t rc = SUCCESS; + uint32_t o_rc = SUCCESS; + + do + { + // Clear all of the counters and maintenance ECC attentions. + o_rc = prepareNextCmd<TYPE_MBA>( i_mbaChip ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "prepareNextCmd(0x%08x) failed", + i_mbaChip->getHuid() ); + break; + } - PRDF_ERR( PRDF_FUNC "function not implemented yet" ); -// TODO RTC 136126 + // Start the background scrub command. + PRDF_ERR( PRDF_FUNC "function not implemented yet" ); // TODO RTC 136126 - return rc; + } while (0); + + return o_rc; #undef PRDF_FUNC } diff --git a/src/usr/diag/prdf/plat/prdfPlatServices.H b/src/usr/diag/prdf/plat/prdfPlatServices.H index d04f295e5..6b611b89b 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices.H +++ b/src/usr/diag/prdf/plat/prdfPlatServices.H @@ -108,15 +108,14 @@ uint32_t putScom(TARGETING::TargetHandle_t i_target, BIT_STRING_CLASS& io_bs, /** * @brief Starts Background Scrubbing. - * @param i_trgt MCA or MBA target. + * @param i_chip MCA or MBA chip. * @param i_rank Will start background scrubbing on the first address of this * slave rank. To ensure the command is started on a master rank * boundary, make sure the slave rank value is 0. * @return Non-SUCCESS if an internal function fails, otherwise SUCCESS. */ template<TARGETING::TYPE T> -uint32_t startBgScrub( TARGETING::TargetHandle_t i_trgt, - const MemRank & i_rank ); +uint32_t startBgScrub( ExtensibleChip * i_chip, const MemRank & i_rank ); } // end namespace PlatServices diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_rt.C b/src/usr/diag/prdf/plat/prdfPlatServices_rt.C index 23d24df51..a30dd3d76 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices_rt.C +++ b/src/usr/diag/prdf/plat/prdfPlatServices_rt.C @@ -118,23 +118,23 @@ void sendDynMemDeallocRequest( uint64_t i_startAddr, uint64_t i_endAddr ) //############################################################################## template<> -uint32_t stopBgScrub<TYPE_MCBIST>( TargetHandle_t i_trgt ) +uint32_t stopBgScrub<TYPE_MCBIST>( ExtensibleChip * i_chip ) { #define PRDF_FUNC "[PlatServices::stopBgScrub<TYPE_MCBIST>] " - PRDF_ASSERT( nullptr != i_trgt ); - PRDF_ASSERT( TYPE_MCBIST == getTargetType(i_trgt) ); + PRDF_ASSERT( nullptr != i_chip ); + PRDF_ASSERT( TYPE_MCBIST == i_chip->getType() ); uint32_t rc = SUCCESS; - fapi2::Target<fapi2::TARGET_TYPE_MCBIST> fapiTrgt ( i_trgt ); + fapi2::Target<fapi2::TARGET_TYPE_MCBIST> fapiTrgt ( i_chip->getTrgt() ); fapi2::ReturnCode fapi_rc = memdiags::stop( fapiTrgt ); errlHndl_t errl = fapi2::rcToErrl( fapi_rc ); if ( nullptr != errl ) { - PRDF_ERR( PRDF_FUNC "memdiags::stop(0x%08x) failed", getHuid(i_trgt) ); + PRDF_ERR( PRDF_FUNC "memdiags::stop(0x%08x) failed", i_chip->getHuid()); PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); rc = FAIL; } @@ -147,12 +147,12 @@ uint32_t stopBgScrub<TYPE_MCBIST>( TargetHandle_t i_trgt ) //------------------------------------------------------------------------------ template<> -uint32_t stopBgScrub<TYPE_MCA>( TargetHandle_t i_trgt ) +uint32_t stopBgScrub<TYPE_MCA>( ExtensibleChip * i_chip ) { - PRDF_ASSERT( nullptr != i_trgt ); - PRDF_ASSERT( TYPE_MCA == getTargetType(i_trgt) ); + PRDF_ASSERT( nullptr != i_chip ); + PRDF_ASSERT( TYPE_MCA == i_chip->getType() ); - return stopBgScrub<TYPE_MCBIST>( getConnectedParent(i_trgt, TYPE_MCBIST) ); + return stopBgScrub<TYPE_MCBIST>( getConnectedParent(i_chip, TYPE_MCBIST) ); } //############################################################################## @@ -160,12 +160,12 @@ uint32_t stopBgScrub<TYPE_MCA>( TargetHandle_t i_trgt ) //############################################################################## template<> -uint32_t stopBgScrub<TYPE_MBA>( TargetHandle_t i_trgt ) +uint32_t stopBgScrub<TYPE_MBA>( ExtensibleChip * i_chip ) { #define PRDF_FUNC "[PlatServices::stopBgScrub<TYPE_MBA>] " - PRDF_ASSERT( nullptr != i_trgt ); - PRDF_ASSERT( TYPE_MBA == getTargetType(i_trgt) ); + PRDF_ASSERT( nullptr != i_chip ); + PRDF_ASSERT( TYPE_MBA == i_chip->getType() ); uint32_t rc = SUCCESS; diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_rt.H b/src/usr/diag/prdf/plat/prdfPlatServices_rt.H index bd1529347..b591b06ee 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices_rt.H +++ b/src/usr/diag/prdf/plat/prdfPlatServices_rt.H @@ -64,11 +64,11 @@ void sendDynMemDeallocRequest( uint64_t i_startAddr, uint64_t i_endAddr ); /** * @brief Stops Background Scrubbing. - * @param i_trgt MCBIST, MCA, or MBA target. + * @param i_chip MCBIST, MCA, or MBA chip. * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise. */ template<TARGETING::TYPE T> -uint32_t stopBgScrub( TARGETING::TargetHandle_t i_trgt ); +uint32_t stopBgScrub( ExtensibleChip * i_chip ); } // end namespace PlatServices |