diff options
Diffstat (limited to 'src/usr/diag/prdf/plat/prdfPlatServices_ipl.C')
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices_ipl.C | 209 |
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 |