summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/plat/prdfPlatServices.C
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2018-03-29 11:58:46 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2018-03-30 10:44:02 -0400
commita219839511f65dcc1b106de7f267191c787e7f83 (patch)
tree0db08b65d5234d81544ee467df8dcd1ad3ac7f06 /src/usr/diag/prdf/plat/prdfPlatServices.C
parent39489bc4e96c8606c2aacb9520a79d0854f1d567 (diff)
downloadtalos-hostboot-a219839511f65dcc1b106de7f267191c787e7f83.tar.gz
talos-hostboot-a219839511f65dcc1b106de7f267191c787e7f83.zip
PRD: support getMemAddrRange() for MBA ranks
Change-Id: I54aed4e18d048d7c4c1cdaeb284c700b932e727b RTC: 190363 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/56475 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com> Reviewed-by: Brian J. Stegmiller <bjs@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/56489 CI-Ready: Zane C. Shelley <zshelle@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/usr/diag/prdf/plat/prdfPlatServices.C')
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices.C231
1 files changed, 187 insertions, 44 deletions
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices.C b/src/usr/diag/prdf/plat/prdfPlatServices.C
index 1292c6066..e558c0c7f 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices.C
+++ b/src/usr/diag/prdf/plat/prdfPlatServices.C
@@ -271,6 +271,159 @@ TARGETING::TargetHandle_t getActiveRefClk(TARGETING::TargetHandle_t
}
//##############################################################################
+//## Memory specific functions
+//##############################################################################
+
+template<>
+uint32_t getMemAddrRange<TYPE_MCA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ mss::mcbist::address & o_startAddr,
+ mss::mcbist::address & o_endAddr,
+ AddrRangeType i_rangeType )
+{
+ #define PRDF_FUNC "[PlatServices::getMemAddrRange<TYPE_MCA>] "
+
+ PRDF_ASSERT( nullptr != i_chip );
+ PRDF_ASSERT( TYPE_MCA == i_chip->getType() );
+
+ uint32_t port = i_chip->getPos() % MAX_MCA_PER_MCBIST;
+
+ if ( SLAVE_RANK == i_rangeType )
+ {
+ FAPI_CALL_HWP_NORETURN( mss::mcbist::address::get_srank_range,
+ port, i_rank.getDimmSlct(),
+ i_rank.getRankSlct(), i_rank.getSlave(),
+ o_startAddr, o_endAddr );
+ }
+ else if ( MASTER_RANK == i_rangeType )
+ {
+ FAPI_CALL_HWP_NORETURN( mss::mcbist::address::get_mrank_range,
+ port, i_rank.getDimmSlct(),
+ i_rank.getRankSlct(), o_startAddr, o_endAddr );
+ }
+ else
+ {
+ PRDF_ERR( PRDF_FUNC "unsupported range type %d", i_rangeType );
+ PRDF_ASSERT(false);
+ }
+
+ return SUCCESS;
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+template<>
+uint32_t getMemAddrRange<TYPE_MBA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ fapi2::buffer<uint64_t> & o_startAddr,
+ fapi2::buffer<uint64_t> & o_endAddr,
+ AddrRangeType i_rangeType )
+{
+ #define PRDF_FUNC "[PlatServices::getMemAddrRange<TYPE_MBA>] "
+
+ PRDF_ASSERT( nullptr != i_chip );
+ PRDF_ASSERT( TYPE_MBA == i_chip->getType() );
+
+ uint32_t o_rc = SUCCESS;
+
+ errlHndl_t errl = nullptr;
+ fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiTrgt ( i_chip->getTrgt() );
+
+ if ( SLAVE_RANK == i_rangeType )
+ {
+ FAPI_INVOKE_HWP( errl, mss_get_slave_address_range, fapiTrgt,
+ i_rank.getMaster(), i_rank.getSlave(),
+ o_startAddr, o_endAddr );
+ if ( nullptr != errl )
+ {
+ PRDF_ERR( PRDF_FUNC "mss_get_slave_address_range(0x%08x,0x%02x) "
+ "failed", i_chip->getHuid(), i_rank.getKey() );
+ PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
+ o_rc = FAIL;
+ }
+ }
+ else if ( MASTER_RANK == i_rangeType )
+ {
+ FAPI_INVOKE_HWP( errl, mss_get_address_range, fapiTrgt,
+ i_rank.getMaster(), o_startAddr, o_endAddr );
+ if ( nullptr != errl )
+ {
+ PRDF_ERR( PRDF_FUNC "mss_get_address_range(0x%08x,0x%02x) failed",
+ i_chip->getHuid(), i_rank.getKey() );
+ PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
+ o_rc = FAIL;
+ }
+ }
+ else
+ {
+ PRDF_ERR( PRDF_FUNC "unsupported range type %d", i_rangeType );
+ PRDF_ASSERT(false);
+ }
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+MemAddr __convertMssMcbistAddr( const mss::mcbist::address & i_addr )
+{
+ uint64_t dslct = i_addr.get_dimm();
+ uint64_t rslct = i_addr.get_master_rank();
+ uint64_t srnk = i_addr.get_slave_rank();
+ uint64_t bnk = i_addr.get_bank();
+ uint64_t row = i_addr.get_row();
+ uint64_t col = i_addr.get_column();
+
+ uint64_t mrnk = (dslct << 2) | rslct;
+
+ return MemAddr ( MemRank ( mrnk, srnk ), bnk, row, col );
+}
+
+template<>
+uint32_t getMemAddrRange<TYPE_MCA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ MemAddr & o_startAddr,
+ MemAddr & o_endAddr,
+ AddrRangeType i_rangeType )
+{
+ mss::mcbist::address saddr, eaddr;
+ uint32_t o_rc = getMemAddrRange<TYPE_MCA>( i_chip, i_rank, saddr, eaddr,
+ i_rangeType );
+ if ( SUCCESS == o_rc )
+ {
+ o_startAddr = __convertMssMcbistAddr( saddr );
+ o_endAddr = __convertMssMcbistAddr( eaddr );
+ }
+
+ return o_rc;
+}
+
+//------------------------------------------------------------------------------
+
+template<>
+uint32_t getMemAddrRange<TYPE_MBA>( ExtensibleChip * i_chip,
+ const MemRank & i_rank,
+ MemAddr & o_startAddr,
+ MemAddr & o_endAddr,
+ AddrRangeType i_rangeType )
+{
+ fapi2::buffer<uint64_t> saddr, eaddr;
+ uint32_t o_rc = getMemAddrRange<TYPE_MBA>( i_chip, i_rank, saddr, eaddr,
+ i_rangeType );
+ if ( SUCCESS == o_rc )
+ {
+ o_startAddr = MemAddr::fromMaintAddr<TYPE_MBA>( (uint64_t)saddr );
+ o_endAddr = MemAddr::fromMaintAddr<TYPE_MBA>( (uint64_t)eaddr );
+ }
+
+ return o_rc;
+}
+
+//##############################################################################
//## Nimbus Maintenance Command wrappers
//##############################################################################
@@ -327,18 +480,19 @@ uint32_t startBgScrub<TYPE_MCA>( ExtensibleChip * i_mcaChip,
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(),
- i_rank.getRankSlct(),
- i_rank.getSlave(),
- saddr,
- eaddr );
-
do
{
+ // Get the first address of the given rank.
+ mss::mcbist::address saddr, eaddr;
+ o_rc = getMemAddrRange<TYPE_MCA>( i_mcaChip, i_rank, saddr, eaddr,
+ SLAVE_RANK );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "getMemAddrRange(0x%08x,0x%2x) failed",
+ i_mcaChip->getHuid(), i_rank.getKey() );
+ break;
+ }
+
// Clear all of the counters and maintenance ECC attentions.
o_rc = prepareNextCmd<TYPE_MCBIST>( mcbChip );
if ( SUCCESS != o_rc )
@@ -434,39 +588,28 @@ uint32_t __startTdScrub_mca( ExtensibleChip * i_mcaChip,
//------------------------------------------------------------------------------
-uint32_t __startTdScrubMaster_mca( ExtensibleChip * i_mcaChip,
- const MemRank & i_rank,
- mss::mcbist::stop_conditions & i_stopCond )
+uint32_t __startTdScrub_mca( ExtensibleChip * i_mcaChip, const MemRank & i_rank,
+ mss::mcbist::stop_conditions & i_stopCond,
+ AddrRangeType i_rangeType )
{
- // Get the address rank of the master rank.
- uint32_t port = i_mcaChip->getPos() % MAX_MCA_PER_MCBIST;
- mss::mcbist::address saddr, eaddr;
- FAPI_CALL_HWP_NORETURN(
- mss::mcbist::address::get_mrank_range,
- port,
- i_rank.getDimmSlct(),
- i_rank.getRankSlct(),
- saddr, eaddr );
-
- return __startTdScrub_mca( i_mcaChip, saddr, eaddr, i_stopCond );
-}
-
-//------------------------------------------------------------------------------
+ #define PRDF_FUNC "[PlatServices::__startTdScrub_mca] "
-uint32_t __startTdScrubSlave_mca( ExtensibleChip * i_mcaChip,
- const MemRank & i_rank,
- mss::mcbist::stop_conditions & i_stopCond )
-{
- // Get the address rank of the slave 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(),
- i_rank.getRankSlct(),
- i_rank.getSlave(),
- saddr, eaddr );
+ uint32_t o_rc = getMemAddrRange<TYPE_MCA>( i_mcaChip, i_rank, saddr, eaddr,
+ i_rangeType );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "getMemAddrRange(0x%08x,0x%2x) failed",
+ i_mcaChip->getHuid(), i_rank.getKey() );
+ }
+ else
+ {
+ o_rc = __startTdScrub_mca( i_mcaChip, saddr, eaddr, i_stopCond );
+ }
- return __startTdScrub_mca( i_mcaChip, saddr, eaddr, i_stopCond );
+ return o_rc;
+
+ #undef PRDF_FUNC
}
//------------------------------------------------------------------------------
@@ -477,7 +620,7 @@ uint32_t startVcmPhase1<TYPE_MCA>( ExtensibleChip * i_mcaChip,
{
mss::mcbist::stop_conditions stopCond;
- return __startTdScrubMaster_mca( i_mcaChip, i_rank, stopCond );
+ return __startTdScrub_mca( i_mcaChip, i_rank, stopCond, MASTER_RANK );
}
//------------------------------------------------------------------------------
@@ -488,7 +631,7 @@ uint32_t startVcmPhase2<TYPE_MCA>( ExtensibleChip * i_mcaChip,
{
mss::mcbist::stop_conditions stopCond;
- return __startTdScrubMaster_mca( i_mcaChip, i_rank, stopCond );
+ return __startTdScrub_mca( i_mcaChip, i_rank, stopCond, MASTER_RANK );
}
//------------------------------------------------------------------------------
@@ -501,7 +644,7 @@ uint32_t startTpsPhase1<TYPE_MCA>( ExtensibleChip * i_mcaChip,
stopCond.set_nce_soft_symbol_count_enable(mss::ON)
.set_nce_inter_symbol_count_enable(mss::ON);
- return __startTdScrubSlave_mca( i_mcaChip, i_rank, stopCond );
+ return __startTdScrub_mca( i_mcaChip, i_rank, stopCond, SLAVE_RANK );
}
//------------------------------------------------------------------------------
@@ -513,7 +656,7 @@ uint32_t startTpsPhase2<TYPE_MCA>( ExtensibleChip * i_mcaChip,
mss::mcbist::stop_conditions stopCond;
stopCond.set_nce_hard_symbol_count_enable(mss::ON);
- return __startTdScrubSlave_mca( i_mcaChip, i_rank, stopCond );
+ return __startTdScrub_mca( i_mcaChip, i_rank, stopCond, SLAVE_RANK );
}
//------------------------------------------------------------------------------
@@ -534,7 +677,7 @@ uint32_t startTpsRuntime<TYPE_MCA>( ExtensibleChip * i_mcaChip,
.set_nce_inter_symbol_count_enable(mss::ON);
}
- return __startTdScrubSlave_mca( i_mcaChip, i_rank, stopCond );
+ return __startTdScrub_mca( i_mcaChip, i_rank, stopCond, SLAVE_RANK );
}
//##############################################################################
OpenPOWER on IntegriCloud