summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/memory/p9_mss_memdiag.C
diff options
context:
space:
mode:
authorLouis Stermole <stermole@us.ibm.com>2017-01-30 10:59:43 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-02-28 16:15:19 -0500
commit8a6f2a39aa4f3cf106ee8b78fdc17c59224d4da2 (patch)
treee462c6798f1c8dd720dc191d6641a94b2bdbccce /src/import/chips/p9/procedures/hwp/memory/p9_mss_memdiag.C
parent3b44d04006f31b5b88b47e0479d99ea40b030ccf (diff)
downloadtalos-hostboot-8a6f2a39aa4f3cf106ee8b78fdc17c59224d4da2.tar.gz
talos-hostboot-8a6f2a39aa4f3cf106ee8b78fdc17c59224d4da2.zip
Add MSS restore_repairs function
Change-Id: Ie1180d067cbf87f337e2ce74d2a369d29a862cb8 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36025 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Brian R. Silver <bsilver@us.ibm.com> Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36027 Reviewed-by: Hostboot Team <hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/memory/p9_mss_memdiag.C')
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/p9_mss_memdiag.C62
1 files changed, 57 insertions, 5 deletions
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 <p9_mss_memdiag.H>
#include <lib/utils/poll.H>
+#include <lib/utils/find.H>
#include <lib/utils/count_dimm.H>
#include <lib/mcbist/address.H>
#include <lib/mcbist/memdiags.H>
#include <lib/mcbist/mcbist.H>
+#include <lib/mc/port.H>
+#include <lib/ecc/ecc.H>
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<TARGET_TYPE_MCBIST>& 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<TARGET_TYPE_SYSTEM>(), is_sim) );
+ // Read the bad_dq_bitmap attribute and place corresponding symbol and chip marks
+ for (const auto& l_mca : mss::find_targets<TARGET_TYPE_MCA>(i_target))
+ {
+ fapi2::buffer<uint8_t> l_repairs_applied;
+ fapi2::buffer<uint8_t> l_repairs_exceeded;
+ std::vector<uint64_t> 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<fapi2::TARGET_TYPE_DIMM>(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) );
OpenPOWER on IntegriCloud