From 8a6f2a39aa4f3cf106ee8b78fdc17c59224d4da2 Mon Sep 17 00:00:00 2001 From: Louis Stermole Date: Mon, 30 Jan 2017 10:59:43 -0600 Subject: Add MSS restore_repairs function Change-Id: Ie1180d067cbf87f337e2ce74d2a369d29a862cb8 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36025 Tested-by: Jenkins Server Reviewed-by: Brian R. Silver Reviewed-by: STEPHEN GLANCY Tested-by: Hostboot CI Reviewed-by: Zane C. Shelley Reviewed-by: Jennifer A. Stofer Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36027 Reviewed-by: Hostboot Team Tested-by: Jenkins OP Build CI Tested-by: FSP CI Jenkins Reviewed-by: Daniel M. Crowell --- .../p9/procedures/hwp/memory/p9_mss_memdiag.C | 62 ++++++++++++++++++++-- 1 file changed, 57 insertions(+), 5 deletions(-) (limited to 'src/import/chips/p9/procedures/hwp/memory/p9_mss_memdiag.C') diff --git a/src/import/chips/p9/procedures/hwp/memory/p9_mss_memdiag.C b/src/import/chips/p9/procedures/hwp/memory/p9_mss_memdiag.C index 8efc158b4..0bdb4de8f 100644 --- a/src/import/chips/p9/procedures/hwp/memory/p9_mss_memdiag.C +++ b/src/import/chips/p9/procedures/hwp/memory/p9_mss_memdiag.C @@ -37,21 +37,25 @@ #include #include +#include #include #include #include #include +#include +#include using fapi2::TARGET_TYPE_MCBIST; using fapi2::TARGET_TYPE_SYSTEM; +using fapi2::TARGET_TYPE_MCA; extern "C" { -/// -/// @brief Pattern test the DRAM -/// @param[in] i_target the McBIST of the ports of the dram you're training -/// @return FAPI2_RC_SUCCESS iff ok -/// + /// + /// @brief Pattern test the DRAM + /// @param[in] i_target the McBIST of the ports of the dram you're training + /// @return FAPI2_RC_SUCCESS iff ok + /// fapi2::ReturnCode p9_mss_memdiag( const fapi2::Target& i_target ) { FAPI_INF("Start memdiag"); @@ -67,6 +71,54 @@ extern "C" uint8_t is_sim = false; FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_IS_SIMULATION, fapi2::Target(), is_sim) ); + // Read the bad_dq_bitmap attribute and place corresponding symbol and chip marks + for (const auto& l_mca : mss::find_targets(i_target)) + { + fapi2::buffer l_repairs_applied; + fapi2::buffer l_repairs_exceeded; + std::vector l_ranks; + + FAPI_TRY( mss::restore_repairs( l_mca, l_repairs_applied, l_repairs_exceeded) ); + + // assert if we have exceeded the allowed repairs + for (const auto& l_dimm : mss::find_targets(l_mca)) + { + FAPI_ASSERT( !(l_repairs_exceeded.getBit(mss::index(l_dimm))), + fapi2::MSS_MEMDIAGS_REPAIRS_EXCEEDED().set_TARGET(l_dimm), + "p9_mss_memdiag bad bit repairs exceeded %s", mss::c_str(l_dimm) ); + } + +#ifdef __HOSTBOOT_MODULE + // assert if both chip and symbol marks exist for any given rank + FAPI_TRY( mss::rank::ranks(l_mca, l_ranks) ); + + for (const auto l_rank : l_ranks) + { + if (l_repairs_applied.getBit(l_rank)) + { + uint64_t l_galois = 0; + mss::states l_confirmed = mss::NO; + // check for chip mark in hardware mark store + FAPI_TRY( mss::ecc::get_hwms(l_mca, l_rank, l_galois, l_confirmed) ); + + if (l_confirmed) + { + auto l_type = mss::ecc::fwms::mark_type::CHIP; + auto l_region = mss::ecc::fwms::mark_region::DISABLED; + auto l_addr = mss::mcbist::address(0); + // check for symbol mark in firmware mark store + FAPI_TRY( mss::ecc::get_fwms(l_mca, l_rank, l_galois, l_type, l_region, l_addr) ); + + FAPI_ASSERT( l_region == mss::ecc::fwms::mark_region::DISABLED, + fapi2::MSS_MEMDIAGS_CHIPMARK_AND_SYMBOLMARK().set_TARGET(l_mca).set_RANK(l_rank), + "p9_mss_memdiag both chip mark and symbol mark on rank %d: %s", l_rank, mss::c_str(l_mca) ); + } + } + } + +#endif + } + // We start the sf_init (write 0's) and it'll tickle the MCBIST complete FIR. PRD will see that // and start a background scrub. FAPI_TRY( memdiags::sf_init(i_target, mss::mcbist::PATTERN_0) ); -- cgit v1.2.1