summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/plat
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2016-11-02 14:49:21 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2016-11-10 11:13:15 -0500
commit6f748dedb37487fec125e21ce463958e9aef646c (patch)
tree8312e0a36943fee6ca7923727ddbc04870d30bc1 /src/usr/diag/prdf/plat
parentbfa11bef304b6a3ac4dc05f9b41b218210a1d0ca (diff)
downloadtalos-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.H27
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.H46
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C2
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices.C88
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices.H5
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices_rt.C24
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices_rt.H4
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
OpenPOWER on IntegriCloud