From a219839511f65dcc1b106de7f267191c787e7f83 Mon Sep 17 00:00:00 2001 From: Zane Shelley Date: Thu, 29 Mar 2018 11:58:46 -0500 Subject: PRD: support getMemAddrRange() for MBA ranks Change-Id: I54aed4e18d048d7c4c1cdaeb284c700b932e727b RTC: 190363 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/56475 Tested-by: Jenkins Server Reviewed-by: Benjamin J. Weisenbeck Reviewed-by: Brian J. Stegmiller Reviewed-by: Caleb N. Palmer Reviewed-by: Zane C. Shelley Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/56489 CI-Ready: Zane C. Shelley Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins --- .../prdf/common/plat/prdfPlatServices_common.C | 105 ---------- .../prdf/common/plat/prdfPlatServices_common.H | 16 -- src/usr/diag/prdf/plat/mem/prdfMemDynDealloc.C | 14 +- src/usr/diag/prdf/plat/prdfPlatServices.C | 231 +++++++++++++++++---- src/usr/diag/prdf/plat/prdfPlatServices.H | 74 ++++++- src/usr/diag/prdf/plat/prdfPlatServices_ipl.C | 23 +- src/usr/diag/prdf/plat/prdfPlatServices_rt.C | 45 ---- src/usr/diag/prdf/plat/prdfPlatServices_rt.H | 16 -- src/usr/diag/prdf/test/prdf_hb_common_test.mk | 3 + 9 files changed, 278 insertions(+), 249 deletions(-) (limited to 'src/usr') 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 int32_t getBadDqBitmap( TargetHandle_t i_trgt, const MemRank & i_rank, MemDqBitmap & 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 @@ -299,22 +299,6 @@ int32_t getMemAddrRange( TARGETING::TargetHandle_t i_mba, CenAddr & o_startAddr, CenAddr & o_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_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. 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( 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::iterator it = masterRanks.begin(); it != masterRanks.end(); it++ ) { - o_rc = getMemAddrRange( tgt, it->getRankSlct(), - it->getDimmSlct(), - startAddr, endAddr ); + o_rc = getMemAddrRange( 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::iterator it = masterRanks.begin(); it != masterRanks.end(); it++ ) { - o_rc = getMemAddrRange( tgt, it->getRankSlct(), dimmSlct, - startAddr, endAddr ); + o_rc = getMemAddrRange( 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 @@ -270,6 +270,159 @@ TARGETING::TargetHandle_t getActiveRefClk(TARGETING::TargetHandle_t i_oscPos ); } +//############################################################################## +//## Memory specific functions +//############################################################################## + +template<> +uint32_t getMemAddrRange( 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] " + + 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( ExtensibleChip * i_chip, + const MemRank & i_rank, + fapi2::buffer & o_startAddr, + fapi2::buffer & o_endAddr, + AddrRangeType i_rangeType ) +{ + #define PRDF_FUNC "[PlatServices::getMemAddrRange] " + + PRDF_ASSERT( nullptr != i_chip ); + PRDF_ASSERT( TYPE_MBA == i_chip->getType() ); + + uint32_t o_rc = SUCCESS; + + errlHndl_t errl = nullptr; + fapi2::Target 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( 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( 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( ExtensibleChip * i_chip, + const MemRank & i_rank, + MemAddr & o_startAddr, + MemAddr & o_endAddr, + AddrRangeType i_rangeType ) +{ + fapi2::buffer saddr, eaddr; + uint32_t o_rc = getMemAddrRange( i_chip, i_rank, saddr, eaddr, + i_rangeType ); + if ( SUCCESS == o_rc ) + { + o_startAddr = MemAddr::fromMaintAddr( (uint64_t)saddr ); + o_endAddr = MemAddr::fromMaintAddr( (uint64_t)eaddr ); + } + + return o_rc; +} + //############################################################################## //## Nimbus Maintenance Command wrappers //############################################################################## @@ -327,18 +480,19 @@ uint32_t startBgScrub( 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( 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( 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( 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( 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( 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( 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( 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( 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 ///< MCBIST command interfaces -//#include TODO: RTC 157888 +#include // MCBIST command interfaces +#include // 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 @@ -102,6 +102,70 @@ uint32_t getScom(TARGETING::TargetHandle_t i_target, BitString& io_bs, 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 +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 +uint32_t getMemAddrRange( ExtensibleChip * i_chip, const MemRank & i_rank, + fapi2::buffer & o_startAddr, + fapi2::buffer & 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 +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 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( 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( 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( 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 -- cgit v1.2.1