summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/plat/mem
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/diag/prdf/plat/mem')
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemBgScrub.H27
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H46
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C2
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",
OpenPOWER on IntegriCloud