diff options
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/memory/p9_mss_scrub.C')
-rw-r--r-- | src/import/chips/p9/procedures/hwp/memory/p9_mss_scrub.C | 98 |
1 files changed, 12 insertions, 86 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/p9_mss_scrub.C b/src/import/chips/p9/procedures/hwp/memory/p9_mss_scrub.C index 6ba472549..0fb902ac2 100644 --- a/src/import/chips/p9/procedures/hwp/memory/p9_mss_scrub.C +++ b/src/import/chips/p9/procedures/hwp/memory/p9_mss_scrub.C @@ -43,102 +43,28 @@ #include <generic/memory/lib/utils/mcbist/gen_patterns.H> #include <lib/mcbist/memdiags.H> #include <generic/memory/lib/utils/count_dimm.H> -#include <lib/fir/memdiags_fir.H> +#include <lib/fir/unmask.H> using fapi2::TARGET_TYPE_MCBIST; using fapi2::TARGET_TYPE_MCA; using fapi2::TARGET_TYPE_SYSTEM; using fapi2::FAPI2_RC_SUCCESS; -/// -/// @brief Begin background scrub -/// @param[in] i_target MCBIST -/// @return FAPI2_RC_SUCCESS iff ok -/// -fapi2::ReturnCode p9_mss_scrub( const fapi2::Target<TARGET_TYPE_MCBIST>& i_target ) +extern "C" { - FAPI_INF("Start mss scrub"); - // If there are no DIMM we don't need to bother. In fact, we can't as we didn't setup - // attributes for the PHY, etc. - if (mss::count_dimm(i_target) == 0) + /// + /// @brief Begin background scrub + /// @param[in] i_target MCBIST + /// @return FAPI2_RC_SUCCESS iff ok + /// + fapi2::ReturnCode p9_mss_scrub( const fapi2::Target<TARGET_TYPE_MCBIST>& i_target ) { - FAPI_INF("... skipping scrub for %s - no DIMM ...", mss::c_str(i_target)); - return fapi2::FAPI2_RC_SUCCESS; - } - - // If we're running in the simulator, we want to only touch the addresses which training touched - uint8_t l_sim = 0; - bool l_poll_results = false; - fapi2::buffer<uint64_t> l_status; + FAPI_INF("Start mss scrub for %s", mss::c_str(i_target)); + FAPI_TRY(mss::memdiags::mss_scrub_helper(i_target)); - // A small vector of addresses to poll during the polling loop - const std::vector<mss::poll_probe<fapi2::TARGET_TYPE_MCBIST>> l_probes = - { - {i_target, "mcbist current address", MCBIST_MCBMCATQ}, - }; - - // We'll fill in the initial delay below - mss::poll_parameters l_poll_parameters(0, 200, 100 * mss::DELAY_1MS, 200, 10000); - uint64_t l_memory_size = 0; - - FAPI_TRY( mss::eff_memory_size<mss::mc_type::NIMBUS>(i_target, l_memory_size) ); - l_poll_parameters.iv_initial_delay = mss::calculate_initial_delay(i_target, (l_memory_size * mss::BYTES_PER_GB)); - - FAPI_TRY( mss::is_simulation( l_sim) ); - - if (l_sim) - { - fapi2::ReturnCode l_rc; - - // Use some sort of pattern in sim in case the verification folks need to look for something - // TK. Need a verification pattern. This is a not-good pattern for verification ... We don't really - // have a good pattern for verification defined. - FAPI_INF("running mss sim init in place of scrub"); - l_rc = mss::mcbist::sim::sf_init(i_target, mss::mcbist::PATTERN_0); - - // Unmask firs and turn off FIFO mode before returning - FAPI_TRY ( mss::unmask::after_memdiags( i_target ) ); - FAPI_TRY ( mss::unmask::after_background_scrub( i_target ) ); - FAPI_TRY ( mss::reset_reorder_queue_settings(i_target) ); - - return l_rc; + fapi_try_exit: + return fapi2::current_err; } - // In Cronus on hardware (which is how we got here - f/w doesn't call this) we want - // to call sf_init (0's) - // TK we need to check FIR given the way this is right now, we should adjust with better stop - // conditions when we learn more about what we want to find in the lab - FAPI_TRY( mss::memdiags::sf_init(i_target, mss::mcbist::PATTERN_0) ); - - // Poll for completion. - l_poll_results = mss::poll(i_target, MCBIST_MCBISTFIRQ, l_poll_parameters, - [&l_status](const size_t poll_remaining, - const fapi2::buffer<uint64_t>& stat_reg) -> bool - { - FAPI_DBG("mcbist firq 0x%llx, remaining: %d", stat_reg, poll_remaining); - l_status = stat_reg; - return l_status.getBit<MCBIST_MCBISTFIRQ_MCBIST_PROGRAM_COMPLETE>() == true; - }, - l_probes); - - FAPI_ASSERT( l_poll_results == true, - fapi2::MSS_MEMDIAGS_SUPERFAST_INIT_FAILED_TO_INIT().set_MCBIST_TARGET(i_target), - "p9_mss_scrub (init) timedout %s", mss::c_str(i_target) ); - - // Unmask firs after memdiags and turn off FIFO mode - FAPI_TRY ( mss::unmask::after_memdiags( i_target ) ); - FAPI_TRY ( mss::reset_reorder_queue_settings(i_target) ); - - // Start background scrub - FAPI_TRY ( mss::memdiags::background_scrub( i_target, - mss::mcbist::stop_conditions<>(), - mss::mcbist::speed::BG_SCRUB, - mss::mcbist::address() ) ); - - // Unmask firs after background scrub is started - FAPI_TRY ( mss::unmask::after_background_scrub( i_target ) ); - -fapi_try_exit: - return fapi2::current_err; } |