summaryrefslogtreecommitdiffstats
path: root/src/usr
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
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')
-rw-r--r--src/usr/diag/prdf/common/plat/prdfPlatServices_common.C105
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfPlatServices_common.H16
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C14
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices.C231
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices.H74
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices_ipl.C23
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices_rt.C45
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices_rt.H16
-rwxr-xr-xsrc/usr/diag/prdf/test/prdf_hb_common_test.mk3
9 files changed, 278 insertions, 249 deletions
diff --git a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C
index e7ad99c00..471e98b58 100644
--- a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C
+++ b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C
@@ -257,80 +257,6 @@ int32_t setVpdFailedLanesXbus(TargetHandle_t i_rxBusTgt,
//## Memory specific functions
//##############################################################################
-/* TODO RTC 157888
-// Helper function for the for several other memory functions.
-int32_t getMemAddrRange( TargetHandle_t i_mba, uint8_t i_mrank,
- ecmdDataBufferBase & o_startAddr,
- ecmdDataBufferBase & o_endAddr,
- uint8_t i_srank = 0, bool i_slaveOnly = false )
-{
- #define PRDF_FUNC "[PlatServices::getMemAddrRange] "
-
- int32_t o_rc = SUCCESS;
-
- do
- {
- // Check parameters.
- if ( TYPE_MBA != getTargetType(i_mba) )
- {
- PRDF_ERR( PRDF_FUNC "The given target is not TYPE_MBA" );
- o_rc = FAIL; break;
- }
-
- if ( (MSS_ALL_RANKS != i_mrank && MASTER_RANKS_PER_PORT <= i_mrank) ||
- (SLAVE_RANKS_PER_MASTER_RANK <= i_srank) )
- {
- PRDF_ERR( PRDF_FUNC "The given rank is not valid" );
- o_rc = FAIL; break;
- }
-
- errlHndl_t errl = NULL;
-
- if ( i_slaveOnly )
- {
- FAPI_INVOKE_HWP( errl, mss_get_slave_address_range,
- getFapiTarget(i_mba),
- i_mrank, i_srank, o_startAddr, o_endAddr );
- }
- else
- {
- FAPI_INVOKE_HWP( errl, mss_get_address_range, getFapiTarget(i_mba),
- i_mrank, o_startAddr, o_endAddr );
- }
-
- if ( NULL != errl )
- {
- PRDF_ERR( PRDF_FUNC "mss_get_address_range() failed" );
- PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
- o_rc = FAIL; break;
- }
-
- // Verify addresses are of the valid register size.
- if ( 64 != o_startAddr.getBitLength() ||
- 64 != o_endAddr.getBitLength() )
- {
- PRDF_ERR( PRDF_FUNC "Addresses returned from "
- "mss_get_address_range() are not 64-bit" );
- o_rc = FAIL; break;
- }
-
- } while (0);
-
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "Failed: i_mba=0x%08x i_mrank=%d i_srank=%d "
- "i_slaveOnly=%s", getHuid(i_mba), i_mrank, i_srank,
- i_slaveOnly ? "true" : "false" );
- }
-
- return o_rc;
-
- #undef PRDF_FUNC
-}
-*/
-
-//------------------------------------------------------------------------------
-
template <DIMMS_PER_RANK T>
int32_t getBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank,
MemDqBitmap<T> & o_bitmap )
@@ -669,37 +595,6 @@ int32_t getMemAddrRange( TargetHandle_t i_mba, CenAddr & o_startAddr,
//------------------------------------------------------------------------------
-/* TODO RTC 157888
-int32_t getMemAddrRange( TargetHandle_t i_mba, const CenRank & i_rank,
- CenAddr & o_startAddr, CenAddr & o_endAddr,
- bool i_slaveOnly )
-{
- #define PRDF_FUNC "[PlatServices::getMemAddrRange] "
-
- ecmdDataBufferBase startAddr(64), endAddr(64);
- int32_t o_rc = getMemAddrRange( i_mba, i_rank.getMaster(),
- startAddr, endAddr,
- i_rank.getSlave(), i_slaveOnly );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "Failed: i_mba=0x%08x i_rank=M%dS%d i_slaveOnly=%s",
- getHuid(i_mba), i_rank.getMaster(), i_rank.getSlave(),
- i_slaveOnly ? "true" : "false" );
- }
- else
- {
- o_startAddr = CenAddr::fromMaintStartAddr( startAddr.getDoubleWord(0) );
- o_endAddr = CenAddr::fromMaintEndAddr( endAddr.getDoubleWord(0) );
- }
-
- return o_rc;
-
- #undef PRDF_FUNC
-}
-*/
-
-//------------------------------------------------------------------------------
-
/* TODO RTC
int32_t getDimmSpareConfig( TargetHandle_t i_mba, CenRank i_rank,
uint8_t i_ps, uint8_t & o_spareConfig )
diff --git a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H
index edc440acf..67f0dc685 100755
--- a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H
+++ b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H
@@ -300,22 +300,6 @@ int32_t getMemAddrRange( TARGETING::TargetHandle_t i_mba, CenAddr & o_startAddr,
*/
/**
- * @brief Returns the start and end maintenance address of the given rank. By
- * default, will return the address range of the master rank.
- * @param i_mba Target MBA.
- * @param i_rank Target rank.
- * @param o_startAddr The return start address.
- * @param o_endAddr The return end address.
- * @param i_slaveOnly true = slave rank only, false = master rank (default).
- * @return Non-SUCCESS in internal function fails, SUCCESS otherwise.
- */
-/* TODO RTC 157888
-int32_t getMemAddrRange( TARGETING::TargetHandle_t i_mba,
- const CenRank & i_rank, CenAddr & o_startAddr,
- CenAddr & o_endAddr, bool i_slaveOnly = false );
-*/
-
-/**
* @brief Get spare DRAM information on a DIMM.
* @param i_mba MBA target.
* @param i_rank Rank.
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C b/src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C
index 005e2ee3f..e82f6c0a6 100644
--- a/src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C
+++ b/src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C
@@ -419,9 +419,8 @@ int32_t rank( ExtensibleChip * i_chip, MemRank i_rank )
do
{
MemAddr startAddr, endAddr;
- TargetHandle_t tgt = i_chip->GetChipHandle();
- o_rc = getMemAddrRange( tgt, i_rank.getRankSlct(), i_rank.getDimmSlct(),
- startAddr, endAddr );
+ o_rc = getMemAddrRange<T>( i_chip, i_rank, startAddr, endAddr,
+ SLAVE_RANK );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC "getMemAddrRange() Failed. HUID:0x%08X",
@@ -479,9 +478,8 @@ int32_t port( ExtensibleChip * i_chip )
for ( std::vector<MemRank>::iterator it = masterRanks.begin();
it != masterRanks.end(); it++ )
{
- o_rc = getMemAddrRange( tgt, it->getRankSlct(),
- it->getDimmSlct(),
- startAddr, endAddr );
+ o_rc = getMemAddrRange<T>( i_chip, *it, startAddr, endAddr,
+ MASTER_RANK );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC "getMemAddrRange() Failed. HUID:0x%08X",
@@ -553,8 +551,8 @@ int32_t dimmSlct( TargetHandle_t i_dimm )
for ( std::vector<MemRank>::iterator it = masterRanks.begin();
it != masterRanks.end(); it++ )
{
- o_rc = getMemAddrRange( tgt, it->getRankSlct(), dimmSlct,
- startAddr, endAddr );
+ o_rc = getMemAddrRange<T>( chip, *it, startAddr, endAddr,
+ MASTER_RANK );
if ( SUCCESS != o_rc )
{
PRDF_ERR( PRDF_FUNC "getMemAddrRange() Failed. HUID:0x%08X",
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 );
}
//##############################################################################
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices.H b/src/usr/diag/prdf/plat/prdfPlatServices.H
index 0c19c2e45..370bcbad0 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices.H
+++ b/src/usr/diag/prdf/plat/prdfPlatServices.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2017 */
+/* Contributors Listed Below - COPYRIGHT 2016,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -34,8 +34,8 @@
* is common between FSP and Hostboot should be in the respective common file.
*/
-#include <lib/mcbist/memdiags.H> ///< MCBIST command interfaces
-//#include <utility_procedures/mss_maint_cmds.H> TODO: RTC 157888
+#include <lib/mcbist/memdiags.H> // MCBIST command interfaces
+#include <p9c_mss_maint_cmds.H> // MBA command interfaces
// This must be included after all Hostboot specific includes. This will take
// care of cases where a file must be included in the common code, but the
@@ -103,6 +103,70 @@ uint32_t putScom(TARGETING::TargetHandle_t i_target, BitString& io_bs,
uint64_t i_address);
//##############################################################################
+//## Memory specific functions
+//##############################################################################
+
+enum AddrRangeType
+{
+ SLAVE_RANK, ///< Target slave rank only.
+ MASTER_RANK, ///< Target entire master rank.
+};
+
+/**
+ * @brief Returns the start and end address of the given rank.
+ * @note The end addresses returned from the MCBIST HWPs give a maximum
+ * possible address and do not take into account the actual configured
+ * address range. The MCBIST HW logic tolerates this unlike the MBA HW
+ * logic. Functions like Dynamic Memory Deallocation may need to adjust
+ * the actual address based on the actual HW config.
+ * @param i_chip An MCA.
+ * @param i_rank The target rank.
+ * @param o_startAddr The returned start address.
+ * @param o_endAddr The returned end address.
+ * @param i_rangeType See enum AddrRangeType.
+ * @return Non-SUCCESS if internal function fails, SUCCESS otherwise.
+ */
+template<TARGETING::TYPE T>
+uint32_t getMemAddrRange( ExtensibleChip * i_chip, const MemRank & i_rank,
+ mss::mcbist::address & o_startAddr,
+ mss::mcbist::address & o_endAddr,
+ AddrRangeType i_rangeType );
+
+/**
+ * @brief Returns the start and end address of the given rank.
+ * @param i_chip An MBA.
+ * @param i_rank The target rank.
+ * @param o_startAddr The returned start address.
+ * @param o_endAddr The returned end address.
+ * @param i_rangeType See enum AddrRangeType.
+ * @return Non-SUCCESS if internal function fails, SUCCESS otherwise.
+ */
+template<TARGETING::TYPE T>
+uint32_t getMemAddrRange( ExtensibleChip * i_chip, const MemRank & i_rank,
+ fapi2::buffer<uint64_t> & o_startAddr,
+ fapi2::buffer<uint64_t> & o_endAddr,
+ AddrRangeType i_rangeType );
+
+/**
+ * @brief Returns the start and end address of the given rank.
+ * @note The end addresses returned from the MCBIST HWPs give a maximum
+ * possible address and do not take into account the actual configured
+ * address range. The MCBIST HW logic tolerates this unlike the MBA HW
+ * logic. Functions like Dynamic Memory Deallocation may need to adjust
+ * the actual address based on the actual HW config.
+ * @param i_chip An MCA or MBA.
+ * @param i_rank The target rank.
+ * @param o_startAddr The returned start address.
+ * @param o_endAddr The returned end address.
+ * @param i_rangeType See enum AddrRangeType.
+ * @return Non-SUCCESS if internal function fails, SUCCESS otherwise.
+ */
+template<TARGETING::TYPE T>
+uint32_t getMemAddrRange( ExtensibleChip * i_chip, const MemRank & i_rank,
+ MemAddr & o_startAddr, MemAddr & o_endAddr,
+ AddrRangeType i_rangeType );
+
+//##############################################################################
//## Nimbus/Centaur Maintenance Command wrappers
//##############################################################################
@@ -164,6 +228,10 @@ template<TARGETING::TYPE T>
uint32_t startTpsRuntime( ExtensibleChip * i_chip, const MemRank & i_rank,
bool i_countAllCes );
+//##############################################################################
+//## Core/cache trace array functions
+//##############################################################################
+
/**
* @brief Restarts Trace arrays after having stopped on error
* @param i_tgt EC/EQ target
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C
index 06eb609f1..17b0040c8 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C
+++ b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C
@@ -295,20 +295,19 @@ uint32_t startSfRead<TYPE_MCA>( ExtensibleChip * i_mcaChip,
// Stop on hard CEs if MNFG CE checking is enable.
if ( isMfgCeCheckingEnabled() ) stopCond.set_pause_on_nce_hard(mss::ON);
- // Get the first address of the given rank.
- uint32_t port = i_mcaChip->getPos() % MAX_MCA_PER_MCBIST;
- mss::mcbist::address saddr, eaddr;
- FAPI_CALL_HWP_NORETURN(
- 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 )
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_rt.C b/src/usr/diag/prdf/plat/prdfPlatServices_rt.C
index dec2f2806..6e78e3052 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices_rt.C
+++ b/src/usr/diag/prdf/plat/prdfPlatServices_rt.C
@@ -115,51 +115,6 @@ void sendDynMemDeallocRequest( uint64_t i_startAddr, uint64_t i_endAddr )
#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 );
-}
-
-int32_t getMemAddrRange( TargetHandle_t i_tgt, uint8_t i_mrank,
- uint8_t i_dimmSlct, MemAddr & o_startAddr,
- MemAddr & o_endAddr, uint8_t i_srank,
- bool i_slaveOnly )
-{
- ExtensibleChip * i_mcaChip = (ExtensibleChip *)systemPtr->GetChip( i_tgt );
- uint32_t port = i_mcaChip->getPos() % MAX_MCA_PER_MCBIST;
- mss::mcbist::address saddr, eaddr;
-
- if ( i_slaveOnly )
- {
- mss::mcbist::address::get_srank_range( port,
- i_dimmSlct,
- i_mrank,
- i_srank,
- saddr, eaddr );
- }
- else
- {
- mss::mcbist::address::get_mrank_range( port,
- i_dimmSlct,
- i_mrank,
- saddr, eaddr );
- }
-
- o_startAddr = __convertMssMcbistAddr( saddr );
- o_endAddr = __convertMssMcbistAddr( eaddr );
-
- return SUCCESS;
-}
-
//##############################################################################
//## Nimbus Maintenance Command wrappers
//##############################################################################
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_rt.H b/src/usr/diag/prdf/plat/prdfPlatServices_rt.H
index f54b166ee..157e4cb25 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices_rt.H
+++ b/src/usr/diag/prdf/plat/prdfPlatServices_rt.H
@@ -55,22 +55,6 @@ void sendPageGardRequest( uint64_t i_systemAddress );
*/
void sendDynMemDeallocRequest( uint64_t i_startAddr, uint64_t i_endAddr );
-/**
- * @brief Returns the start and end maintenance address of the given rank. By
- * default, will return the address range of the master rank.
- * @param i_tgt Target MBA/MCA.
- * @param i_rank Target rank.
- * @param i_dimmSlct Target dimm select.
- * @param o_startAddr The return start address.
- * @param o_endAddr The return end address.
- * @param i_slaveOnly true = slave rank only, false = master rank (default).
- * @return Non-SUCCESS in internal function fails, SUCCESS otherwise.
- */
-int32_t getMemAddrRange( TARGETING::TargetHandle_t i_tgt, uint8_t i_mrank,
- uint8_t i_dimmSlct, MemAddr & o_startAddr,
- MemAddr & o_endAddr, uint8_t i_srank = 0,
- bool i_slaveOnly = false );
-
//##############################################################################
//## Nimbus/Centaur Maintenance Command wrappers
//##############################################################################
diff --git a/src/usr/diag/prdf/test/prdf_hb_common_test.mk b/src/usr/diag/prdf/test/prdf_hb_common_test.mk
index d04755c3c..78c116c2a 100755
--- a/src/usr/diag/prdf/test/prdf_hb_common_test.mk
+++ b/src/usr/diag/prdf/test/prdf_hb_common_test.mk
@@ -60,6 +60,9 @@ EXTRAINCDIR += ${ROOTPATH}/src/include/usr/ecmddatabuffer
EXTRAINCDIR += ${ROOTPATH}/src/include/usr/errl
EXTRAINCDIR += ${ROOTPATH}/src/include/usr/fapi2
EXTRAINCDIR += ${ROOTPATH}/src/include/usr/util
+EXTRAINCDIR += ${ROOTPATH}/src/import/chips/centaur/common/include
+EXTRAINCDIR += ${ROOTPATH}/src/import/chips/centaur/procedures/hwp/memory
+EXTRAINCDIR += ${ROOTPATH}/src/import/chips/centaur/procedures/hwp/memory/lib/shared
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/common/include/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/ffdc/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/memory
OpenPOWER on IntegriCloud