diff options
Diffstat (limited to 'src/usr/diag/prdf/plat/mem')
-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 |
3 files changed, 48 insertions, 27 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", |