summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/diag/prdf/plat/prdfPlatServices_ipl.C')
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices_ipl.C209
1 files changed, 172 insertions, 37 deletions
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C
index 21cea0c85..14d1c26ba 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C
+++ b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C
@@ -43,7 +43,8 @@
#include <prdfMfgThresholdMgr.H>
#include <diag/mdia/mdia.H>
-#include <config.h>
+
+#include <hwp_wrappers.H>
using namespace TARGETING;
@@ -211,19 +212,19 @@ uint32_t mssRestoreDramRepairs<TYPE_MBA>( TargetHandle_t i_target,
//------------------------------------------------------------------------------
template<>
-uint32_t mssRestoreDramRepairs<TYPE_MEM_PORT>( TargetHandle_t i_target,
- uint8_t & o_repairedRankMask,
- uint8_t & o_badDimmMask )
+uint32_t mssRestoreDramRepairs<TYPE_OCMB_CHIP>( TargetHandle_t i_target,
+ uint8_t & o_repairedRankMask,
+ uint8_t & o_badDimmMask )
{
uint32_t o_rc = SUCCESS;
- /* TODO RTC 207273 - no HWP support yet
+ /* TODO RTC 199032 - no HWP support yet
errlHndl_t errl = NULL;
fapi2::buffer<uint8_t> tmpRepairedRankMask, tmpBadDimmMask;
FAPI_INVOKE_HWP( errl, mss::restore_repairs,
- fapi2::Target<fapi2::TARGET_TYPE_MEM_PORT>( i_target ),
+ fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>( i_target ),
tmpRepairedRankMask, tmpBadDimmMask );
if ( NULL != errl )
@@ -315,7 +316,7 @@ uint32_t startSfRead<TYPE_MCA>( ExtensibleChip * i_mcaChip,
fapi2::Target<fapi2::TARGET_TYPE_MCBIST> fapiTrgt ( mcbChip->getTrgt() );
// Get the stop conditions.
- mss::mcbist::stop_conditions stopCond;
+ mss::mcbist::stop_conditions<> stopCond;
stopCond.set_pause_on_mpe(mss::ON)
.set_pause_on_ue(mss::ON)
.set_pause_on_aue(mss::ON)
@@ -843,41 +844,43 @@ uint32_t resumeTdSteerCleanup<TYPE_MBA>( ExtensibleChip * i_chip,
template<>
bool isBroadcastModeCapable<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip )
{
- /* TODO RTC 207273 - no HWP support yet
PRDF_ASSERT( nullptr != i_chip );
PRDF_ASSERT( TYPE_OCMB_CHIP == i_chip->getType() );
+ mss::states l_ret = mss::states::NO;
+
+ #ifdef CONFIG_AXONE
+
fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> fapiTrgt ( i_chip->getTrgt() );
+ FAPI_CALL_HWP( l_ret, exp_is_broadcast_capable, fapiTrgt );
+
+ #endif
- mss::states l_ret = mss::states::NO;
- FAPI_CALL_HWP( l_ret, mss::mcbist::is_broadcast_capable, fapiTrgt );
return ( mss::states::YES == l_ret );
- */
- return false;
}
//------------------------------------------------------------------------------
template<>
-uint32_t startSfRead<TYPE_MEM_PORT>( ExtensibleChip * i_memPort,
- const MemRank & i_rank )
+uint32_t startSfRead<TYPE_OCMB_CHIP>( ExtensibleChip * i_ocmb,
+ const MemRank & i_rank )
{
- #define PRDF_FUNC "[PlatServices::startSfRead<TYPE_MCA>] "
+ #define PRDF_FUNC "[PlatServices::startSfRead<TYPE_OCMB_CHIP>] "
PRDF_ASSERT( isInMdiaMode() ); // MDIA must be running.
- PRDF_ASSERT( nullptr != i_memPort );
- PRDF_ASSERT( TYPE_MEM_PORT == i_memPort->getType() );
+ PRDF_ASSERT( nullptr != i_ocmb );
+ PRDF_ASSERT( TYPE_OCMB_CHIP == i_ocmb->getType() );
uint32_t o_rc = SUCCESS;
- /* TODO RTC 207273 - no HWP support yet
+ #ifdef CONFIG_AXONE
+
// Get the OCMB_CHIP fapi target
- ExtensibleChip * ocmbChip = getConnectedParent( i_memPort, TYPE_OCMB_CHIP );
- fapi2::Target<fapi2::TYPE_OCMB_CHIP> fapiTrgt ( ocmbChip->getTrgt() );
+ fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> fapiTrgt ( i_ocmb->getTrgt() );
// Get the stop conditions.
- mss::mcbist::stop_conditions stopCond;
+ mss::mcbist::stop_conditions<mss::mc_type::EXPLORER> stopCond;
stopCond.set_pause_on_mpe(mss::ON)
.set_pause_on_ue(mss::ON)
.set_pause_on_aue(mss::ON)
@@ -892,39 +895,39 @@ uint32_t startSfRead<TYPE_MEM_PORT>( ExtensibleChip * i_memPort,
{
// Get the first address of the given rank.
mss::mcbist::address saddr, eaddr;
- o_rc = getMemAddrRange<TYPE_MEM_PORT>( i_memPort, i_rank, saddr, eaddr,
- SLAVE_RANK );
+ o_rc = getMemAddrRange<TYPE_OCMB_CHIP>( i_ocmb, i_rank, saddr, eaddr,
+ SLAVE_RANK );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC "getMemAddrRange(0x%08x,0x%2x) failed",
- i_memPort->getHuid(), i_rank.getKey() );
+ i_ocmb->getHuid(), i_rank.getKey() );
break;
}
// Clear all of the counters and maintenance ECC attentions.
- o_rc = prepareNextCmd<TYPE_OCMB_CHIP>( ocmbChip );
+ o_rc = prepareNextCmd<TYPE_OCMB_CHIP>( i_ocmb );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC "prepareNextCmd(0x%08x) failed",
- ocmbChip->getHuid() );
+ i_ocmb->getHuid() );
break;
}
// Start the super fast read command.
errlHndl_t errl;
- FAPI_INVOKE_HWP( errl, mss::memdiags::sf_read, fapiTrgt, stopCond,
+ FAPI_INVOKE_HWP( errl, exp_sf_read, fapiTrgt, stopCond,
saddr );
if ( nullptr != errl )
{
- PRDF_ERR( PRDF_FUNC "mss::memdiags::sf_read(0x%08x,%d) failed",
- ocmbChip->getHuid(), i_rank.getMaster() );
+ PRDF_ERR( PRDF_FUNC "exp_sf_read(0x%08x,%d) failed",
+ i_ocmb->getHuid(), i_rank.getMaster() );
PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
o_rc = FAIL; break;
}
} while (0);
- */
+ #endif
return o_rc;
@@ -933,22 +936,154 @@ uint32_t startSfRead<TYPE_MEM_PORT>( ExtensibleChip * i_memPort,
//------------------------------------------------------------------------------
-// This specialization only exists to avoid a lot of extra code in some classes.
-// The input chip must still be an MEM_PORT chip.
template<>
-uint32_t startSfRead<TYPE_OCMB_CHIP>( ExtensibleChip * i_memPort,
- const MemRank & i_rank )
+uint32_t cleanupSfRead<TYPE_OCMB_CHIP>( ExtensibleChip * i_ocmbChip )
{
- return startSfRead<TYPE_MEM_PORT>( i_memPort, i_rank );
+ return SUCCESS; // Not needed for MCBIST commands.
}
//------------------------------------------------------------------------------
+#ifdef CONFIG_AXONE
+
template<>
-uint32_t cleanupSfRead<TYPE_OCMB_CHIP>( ExtensibleChip * i_ocmbChip )
+uint32_t startTdSteerCleanup<TYPE_OCMB_CHIP>( ExtensibleChip * i_chip,
+ const MemRank & i_rank, AddrRangeType i_rangeType,
+ mss::mcbist::stop_conditions<mss::mc_type::EXPLORER> i_stopCond )
{
- return SUCCESS; // Not needed for MCBIST commands.
+ #define PRDF_FUNC "[PlatServices::startTdSteerCleanup<TYPE_OCMB_CHIP>] "
+
+ PRDF_ASSERT( isInMdiaMode() ); // MDIA must be running.
+
+ PRDF_ASSERT( nullptr != i_chip );
+ PRDF_ASSERT( TYPE_OCMB_CHIP == i_chip->getType() );
+
+ uint32_t o_rc = SUCCESS;
+
+ // Default speed is to run as fast as possible.
+ //mss_MaintCmd::TimeBaseSpeed cmdSpeed = mss_MaintCmd::FAST_MAX_BW_IMPACT;
+
+ // Set stop-on-AUE for all target scrubs. See explanation in startBgScrub()
+ // for the reasons why.
+ i_stopCond.set_pause_on_aue(mss::ON);
+
+ do
+ {
+ // Get the address range of the given rank.
+ mss::mcbist::address saddr, eaddr;
+ o_rc = getMemAddrRange<TYPE_OCMB_CHIP>( i_chip, i_rank, saddr, eaddr,
+ i_rangeType );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "getMemAddrRange(0x%08x,0x%2x) failed",
+ i_chip->getHuid(), i_rank.getKey() );
+ break;
+ }
+
+ // Clear all of the counters and maintenance ECC attentions.
+ o_rc = prepareNextCmd<TYPE_OCMB_CHIP>( i_chip );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "prepareNextCmd(0x%08x) failed",
+ i_chip->getHuid() );
+ break;
+ }
+
+ /* TODO RTC 199032 - sparing support
+ // Get the MBA fapi target.
+ fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiTrgt ( i_chip->getTrgt() );
+
+ // Start the steer cleanup command.
+ mss_TimeBaseSteerCleanup cmd { fapiTrgt, saddr, eaddr, cmdSpeed,
+ i_stopCond, false };
+ errlHndl_t errl = nullptr;
+ FAPI_INVOKE_HWP( errl, cmd.setupAndExecuteCmd );
+ if ( nullptr != errl )
+ {
+ PRDF_ERR( PRDF_FUNC "setupAndExecuteCmd() on 0x%08x,0x%02x failed",
+ i_chip->getHuid(), i_rank.getKey() );
+ PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
+ o_rc = FAIL; break;
+ }
+ */
+
+ } while (0);
+
+ return o_rc;
+
+ #undef PRDF_FUNC
}
+
+#endif
+
+//------------------------------------------------------------------------------
+
+#ifdef CONFIG_AXONE
+
+template<>
+uint32_t startTdSfRead<TYPE_OCMB_CHIP>(ExtensibleChip * i_chip,
+ const MemRank & i_rank, AddrRangeType i_rangeType,
+ mss::mcbist::stop_conditions<mss::mc_type::EXPLORER> i_stopCond)
+{
+ #define PRDF_FUNC "[PlatServices::startTdSfRead<TYPE_OCMB_CHIP>] "
+
+ PRDF_ASSERT( isInMdiaMode() ); // MDIA must be running.
+
+ PRDF_ASSERT( nullptr != i_chip );
+ PRDF_ASSERT( TYPE_OCMB_CHIP == i_chip->getType() );
+
+ uint32_t o_rc = SUCCESS;
+
+ // Set stop-on-AUE for all target scrubs. See explanation in startBgScrub()
+ // for the reasons why.
+ i_stopCond.set_pause_on_aue(mss::ON);
+
+ do
+ {
+ // Get the address range of the given rank.
+ mss::mcbist::address saddr, eaddr;
+ o_rc = getMemAddrRange<TYPE_OCMB_CHIP>( i_chip, i_rank, saddr, eaddr,
+ i_rangeType );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "getMemAddrRange(0x%08x,0x%2x) failed",
+ i_chip->getHuid(), i_rank.getKey() );
+ break;
+ }
+
+ // Clear all of the counters and maintenance ECC attentions.
+ o_rc = prepareNextCmd<TYPE_OCMB_CHIP>( i_chip );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "prepareNextCmd(0x%08x) failed",
+ i_chip->getHuid() );
+ break;
+ }
+
+ // Get the OCMB fapi target.
+ fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>
+ fapiTrgt( i_chip->getTrgt() );
+
+ // Start the super fast read command.
+ errlHndl_t errl;
+ FAPI_INVOKE_HWP( errl, exp_sf_read, fapiTrgt, i_stopCond, saddr );
+ if ( nullptr != errl )
+ {
+ PRDF_ERR( PRDF_FUNC "exp_sf_read(0x%08x,%d) failed",
+ i_chip->getHuid(), i_rank.getMaster() );
+ PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
+ o_rc = FAIL; break;
+ }
+
+ } while (0);
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+#endif
+
//------------------------------------------------------------------------------
} // end namespace PlatServices
OpenPOWER on IntegriCloud