summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Hickman <Matthew.Hickman@ibm.com>2018-04-10 15:58:46 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-05-18 10:52:21 -0400
commit7b8e60462b27343ed743e947f35abcac52a4ec58 (patch)
tree22e3c0dbecfedc855eb1d6809b2f7b7e5061dae9
parent57e0a47955d8709a3a905c26f55553868bc386a1 (diff)
downloadtalos-hostboot-7b8e60462b27343ed743e947f35abcac52a4ec58.tar.gz
talos-hostboot-7b8e60462b27343ed743e947f35abcac52a4ec58.zip
Added p9_mss_memdiag for cronus ipl and modified scrub for step 16
Change-Id: I2fb279f10c75d6fd3cab66d54a7bdac1382a6b9e Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44428 Dev-Ready: Brent Wieman <bwieman@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Louis Stermole <stermole@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: ANDRE A. MARIN <aamarin@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44433 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.C66
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.H31
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.mk31
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/p9_mss_memdiag.C104
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/tests/p9_mss_ut.mk2
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/wrapper/p9_mss_memdiag_wrap.C270
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/wrapper/p9_mss_memdiag_wrap.mk30
7 files changed, 498 insertions, 36 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.C b/src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.C
index ec744a001..d1f18a3ba 100644
--- a/src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.C
+++ b/src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.C
@@ -22,3 +22,69 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
+
+///
+/// @file p9_mss_background_scrub.C
+/// @brief Begin background scrub
+///
+// *HWP HWP Owner: Matthew Hickman <Matthew.Hickman@ibm.com>
+// *HWP HWP Backup: Andre Marin <aamarin@us.ibm.com>
+// *HWP Team: Memory
+// *HWP Level: 2
+// *HWP Consumed by: FSP:HB
+
+#include <fapi2.H>
+#include <p9_mss_background_scrub.H>
+
+#include <lib/dimm/rank.H>
+#include <lib/mcbist/address.H>
+#include <lib/mcbist/mcbist.H>
+#include <lib/mcbist/patterns.H>
+#include <lib/mcbist/memdiags.H>
+#include <lib/mcbist/sim.H>
+#include <generic/memory/lib/utils/count_dimm.H>
+#include <lib/fir/memdiags_fir.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_background_scrub( const fapi2::Target<TARGET_TYPE_MCBIST>& i_target )
+{
+ FAPI_INF("Start mss background scrub on: %s", mss::c_str( i_target ));
+
+ // 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)
+ {
+ FAPI_INF("... skipping background 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;
+ FAPI_TRY( mss::is_simulation(l_sim) );
+
+ // Kick off background scrub if we are not running in sim
+ if (!(l_sim))
+ {
+ // 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;
+}
diff --git a/src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.H b/src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.H
index e167be56e..1d95e87fc 100644
--- a/src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.H
+++ b/src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.H
@@ -22,3 +22,34 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
+
+///
+/// @file p9_mss_background_scrub.H
+/// @brief Begin background scrub
+///
+// *HWP HWP Owner: Matt Hickman <Matthew.Hickman@ibm.com>
+// *HWP FW Owner: Andre Marin <aamarin@us.ibm.com>
+// *HWP Team: Memory
+// *HWP Level: 2
+// *HWP Consumed by: FSP:HB
+
+#ifndef __P9_MSS_BACKGROUND_SCRUB__
+#define __P9_MSS_BACKGROUND_SCRUB__
+
+#include <fapi2.H>
+
+typedef fapi2::ReturnCode (*p9_mss_background_scrub_FP_t) (const fapi2::Target<fapi2::TARGET_TYPE_MCBIST>&);
+
+extern "C"
+{
+
+ ///
+ /// @brief Begin background scrub
+ /// @param[in] i_target, MCBIST
+ /// @return FAPI2_RC_SUCCESS iff ok
+ ///
+ fapi2::ReturnCode p9_mss_background_scrub( const fapi2::Target<fapi2::TARGET_TYPE_MCBIST>& i_target );
+
+}
+
+#endif
diff --git a/src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.mk b/src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.mk
new file mode 100644
index 000000000..15f1e39fc
--- /dev/null
+++ b/src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.mk
@@ -0,0 +1,31 @@
+# IBM_PROLOG_BEGIN_TAG
+# This is an automatically generated prolog.
+#
+# $Source: src/import/chips/p9/procedures/hwp/memory/p9_mss_background_scrub.mk $
+#
+# OpenPOWER HostBoot Project
+#
+# Contributors Listed Below - COPYRIGHT 2015,2018
+# [+] International Business Machines Corp.
+#
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+# IBM_PROLOG_END_TAG
+
+# Include the macros and things for MSS procedures
+-include 00common.mk
+
+PROCEDURE=p9_mss_background_scrub
+$(eval $(call ADD_MEMORY_INCDIRS,$(PROCEDURE)))
+$(call BUILD_PROCEDURE)
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 6c35c0502..2f4d110c1 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
@@ -25,40 +25,45 @@
///
/// @file p9_mss_memdiag.C
-/// @brief Mainstore pattern testing
+/// @brief HW Procedure pattern testing
///
-// *HWP HWP Owner: Stephen Glancy <sglancy@us.ibm.com>
+// *HWP HWP Owner: Matthew Hickman <Matthew.Hickman@ibm.com>
// *HWP HWP Backup: Andre Marin <aamarin@us.ibm.com>
// *HWP Team: Memory
-// *HWP Level: 3
+// *HWP Level: 2
// *HWP Consumed by: FSP:HB
#include <fapi2.H>
#include <p9_mss_memdiag.H>
+#include <lib/dimm/rank.H>
#include <lib/utils/poll.H>
#include <generic/memory/lib/utils/find.H>
#include <generic/memory/lib/utils/count_dimm.H>
#include <lib/mcbist/address.H>
+#include <lib/mcbist/patterns.H>
#include <lib/mcbist/memdiags.H>
#include <lib/mcbist/mcbist.H>
#include <lib/mc/port.H>
+#include <lib/mcbist/sim.H>
#include <lib/ecc/ecc.H>
+#include <lib/fir/memdiags_fir.H>
using fapi2::TARGET_TYPE_MCBIST;
using fapi2::TARGET_TYPE_SYSTEM;
using fapi2::TARGET_TYPE_MCA;
+using fapi2::FAPI2_RC_SUCCESS;
extern "C"
{
///
- /// @brief Pattern test the DRAM
- /// @param[in] i_target the McBIST of the ports of the dram you're training
+ /// @brief Begin background scrub and run pattern tests
+ /// @param[in] i_target MCBIST
/// @return FAPI2_RC_SUCCESS iff ok
///
fapi2::ReturnCode p9_mss_memdiag( const fapi2::Target<TARGET_TYPE_MCBIST>& i_target )
{
- FAPI_INF("Start memdiag");
+ FAPI_INF("Start mss memdiags on: %s", mss::c_str( i_target ));
// 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.
@@ -68,9 +73,48 @@ extern "C"
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 = false;
+ bool l_poll_results = false;
+ fapi2::buffer<uint64_t> l_status;
+
+ // Set poll parameter values for max time to complete sf_init
+ constexpr uint64_t INITIAL_DELAY = 0;
+ constexpr uint64_t INITIAL_SIM_DELAY = 200;
+ constexpr uint64_t DELAY_TIME = 100 * mss::DELAY_1MS;
+ constexpr uint64_t SIM_DELAY_TIME = 200;
+ constexpr uint64_t MAX_POLL_COUNT = 10000;
+
+ // 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(INITIAL_DELAY, INITIAL_SIM_DELAY, DELAY_TIME, SIM_DELAY_TIME, MAX_POLL_COUNT);
+ uint64_t l_memory_size = 0;
+
+ FAPI_TRY( mss::eff_memory_size(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)
+ {
+ // Use some sort of pattern in sim in case the verification folks need to look for something
+ FAPI_INF("running mss sim init in place of memdiags");
+ FAPI_TRY ( 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::reset_reorder_queue_settings(i_target) );
+
+ return fapi2::FAPI2_RC_SUCCESS;
+ }
+
+ // Unsure if redundant code? Wasn't called before to my knowledge
+ // Only major difference between old mss_scrub and old mss_memdiag
// 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))
{
@@ -120,38 +164,28 @@ extern "C"
#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.
+ // In Cronus on hardware (which is how we got here - f/w doesn't call this) we want
+ // to call sf_init (0's)
FAPI_TRY( mss::memdiags::sf_init(i_target, mss::mcbist::PATTERN_0) );
- // If we're in the sim, we want to poll for the FIR bit. I don't think this ever really happens
- // unless we're expressly testing this API.
- if (l_sim)
+ // 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
{
- // Poll for the fir bit. We expect this to be set ...
- fapi2::buffer<uint64_t> l_status;
-
- // 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},
- };
-
- mss::poll_parameters l_poll_parameters;
- bool 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_memdiags timedout %s", mss::c_str(i_target) );
- }
+ FAPI_DBG("mcbist firq 0x%016llx, 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_memdiag (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) );
fapi_try_exit:
FAPI_INF("End memdiag");
diff --git a/src/import/chips/p9/procedures/hwp/memory/tests/p9_mss_ut.mk b/src/import/chips/p9/procedures/hwp/memory/tests/p9_mss_ut.mk
index f725cd1b6..92f63c543 100644
--- a/src/import/chips/p9/procedures/hwp/memory/tests/p9_mss_ut.mk
+++ b/src/import/chips/p9/procedures/hwp/memory/tests/p9_mss_ut.mk
@@ -41,13 +41,13 @@ $(WRAPPER)_DEPLIBS+=p9_mss_draminit
$(WRAPPER)_DEPLIBS+=p9_mss_draminit_training
$(WRAPPER)_DEPLIBS+=p9_mss_draminit_training_adv
$(WRAPPER)_DEPLIBS+=p9_mss_draminit_mc
+$(WRAPPER)_DEPLIBS+=p9_mss_memdiag
$(WRAPPER)_DEPLIBS+=p9_mss_scrub
$(WRAPPER)_DEPLIBS+=p9_mss_freq
$(WRAPPER)_DEPLIBS+=p9_mss_eff_config
$(WRAPPER)_DEPLIBS+=p9_mss_eff_config_thermal
$(WRAPPER)_DEPLIBS+=p9_mss_bulk_pwr_throttles
$(WRAPPER)_DEPLIBS+=p9_mss_utils_to_throttle
-$(WRAPPER)_DEPLIBS+=p9_mss_memdiag
$(WRAPPER)_DEPLIBS+=p9_mss_freq_system
$(WRAPPER)_DEPLIBS+=p9_mss_volt
$(WRAPPER)_DEPLIBS+=p9_mss_freq_drift
diff --git a/src/import/chips/p9/procedures/hwp/memory/wrapper/p9_mss_memdiag_wrap.C b/src/import/chips/p9/procedures/hwp/memory/wrapper/p9_mss_memdiag_wrap.C
new file mode 100644
index 000000000..87ded708b
--- /dev/null
+++ b/src/import/chips/p9/procedures/hwp/memory/wrapper/p9_mss_memdiag_wrap.C
@@ -0,0 +1,270 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/import/chips/p9/procedures/hwp/memory/wrapper/p9_mss_memdiag_wrap.C $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2016,2018 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+#include <prcdUtils.H>
+
+#include <croClientCapi.H>
+#include <ecmdClientCapi.H>
+#include <ecmdUtils.H>
+#include <ecmdSharedUtils.H>
+#include <fapi2.H>
+#include <fapi2ClientCapi.H>
+#include <fapi2SharedUtils.H>
+
+#include <string>
+#include <sstream>
+
+#include <p9_mss_memdiag.H>
+
+// ----------------------------------------------------------------------
+// Function definitions
+// ----------------------------------------------------------------------
+
+// display help message
+void help()
+{
+ // procedure constants
+ const std::string PROCEDURE = " p9_mss_memdiag_wrap";
+ const std::string REVISION = "$Revision: 1.0 $";
+ // build help message
+ char outstr[200];
+ snprintf(outstr, sizeof(outstr),
+ "\nThis is the help text for the procedure %s (%s)\n", PROCEDURE.c_str(),
+ REVISION.c_str());
+ ecmdOutput(outstr);
+ snprintf(outstr, sizeof(outstr), "Syntax: %s\n", PROCEDURE.c_str());
+ ecmdOutput(outstr);
+ ecmdOutput(" [-h] [-k#] [-n#] [-s#] [-p#] [-verif]\n");
+ ecmdOutput("\n");
+ ecmdOutput("Additional options:\n");
+ ecmdOutput(" -h This help\n");
+ ecmdOutput("\n");
+}
+
+
+// main function
+int main(int argc, char* argv[])
+{
+ // procedure constants
+ const std::string PROCEDURE = "p9_mss_memdiag_wrap";
+ const std::string REVISION = "$Revision: 1.0 $";
+
+ // from prcdUtils
+ extern bool GLOBAL_SIM_MODE;
+ extern bool GLOBAL_VERIF_MODE;
+
+ // flow/control variables
+ uint32_t rc = ECMD_SUCCESS;
+ ecmdDllInfo DLLINFO;
+ ecmdLooperData looper;
+ ecmdChipTarget target;
+ bool valid_pos_found = false;
+ char outstr[200];
+
+ fapi2::ReturnCode rc_fapi(fapi2::FAPI2_RC_SUCCESS);
+
+
+ //-----------------------------------------------------------------------------------------
+ // load and initialize the eCMD Dll
+ // if left NULL, which DLL to load is determined by the ECMD_DLL_FILE environment variable
+ // if set to a specific value, the specified DLL will be loaded
+ //-----------------------------------------------------------------------------------------
+ rc = ecmdLoadDll("");
+
+ if (rc)
+ {
+ return rc;
+ }
+
+ //-----------------------------------------------------------------------------------------
+ // This is needed if you're running a FAPI procedure from this eCMD procedure
+ //-----------------------------------------------------------------------------------------
+
+ // initalize FAPI2 extension
+ rc = fapi2InitExtension();
+
+ if (rc)
+ {
+ ecmdOutputError("Error initializing FAPI2 extension!\n");
+ return rc;
+ }
+
+
+
+ // establish if this is a simulation run or not
+ rc = ecmdQueryDllInfo(DLLINFO);
+
+ if (rc)
+ {
+ ecmdUnloadDll();
+ return rc;
+ }
+
+ if (DLLINFO.dllEnv == ECMD_DLL_ENV_SIM)
+ {
+ GLOBAL_SIM_MODE = true;
+ }
+
+ //-------------------------------------------------------------------------------------------------
+ // Parse out user options (excluding -pX, -cX, -coe, -debug, etc
+ // E.G., ecmdRunHwp.x86 -testmode
+ //-------------------------------------------------------------------------------------------------
+ if (ecmdParseOption(&argc, &argv, "-h"))
+ {
+ help();
+ ecmdUnloadDll();
+ return rc;
+ }
+
+
+ // run procedure in sim verification mode
+ if (ecmdParseOption(&argc, &argv, "-verif"))
+ {
+ GLOBAL_VERIF_MODE = true;
+ }
+
+ //-------------------------------------------------------------------------------------------------
+ // Parse out common eCMD args like -p0, -c0, -coe, etc..
+ // Any found args will be removed from arg list upon return
+ //-------------------------------------------------------------------------------------------------
+ rc = ecmdCommandArgs(&argc, &argv);
+
+ if (rc)
+ {
+ ecmdUnloadDll();
+ return rc;
+ }
+
+ // unsupported arguments left over?
+ if (argc != 1)
+ {
+ ecmdOutputError("Unknown/unsupported arguments specified!\n");
+ help();
+ ecmdUnloadDll();
+ return ECMD_INVALID_ARGS;
+ }
+
+ //-------------------------------------------------------------------------------------------------
+ // Let's always print the dll info to the screen, unless in quiet mode
+ //-------------------------------------------------------------------------------------------------
+
+ if (!ecmdGetGlobalVar(ECMD_GLOBALVAR_QUIETMODE))
+ {
+ // print informational message
+ snprintf(outstr, sizeof(outstr), "Procedure %s: %s\n", PROCEDURE.c_str(),
+ REVISION.c_str());
+ ecmdOutput(outstr);
+
+ // always print the DLL info to the screen, unless in quiet mode
+ rc = ecmdDisplayDllInfo();
+
+ if (rc)
+ {
+ return rc;
+ }
+ }
+
+ //-------------------------------------------------------------------------------------------------
+ // Loop over all all pu chips
+ //-------------------------------------------------------------------------------------------------
+ target.chipType = "pu"; // "p9n";
+ target.chipTypeState = ECMD_TARGET_FIELD_VALID;
+ target.chipUnitType = "mcbist"; // mca; // "mcs"; // "mba";
+ target.chipUnitTypeState = ECMD_TARGET_FIELD_VALID;
+ target.cageState = ECMD_TARGET_FIELD_WILDCARD;
+ target.nodeState = ECMD_TARGET_FIELD_WILDCARD;
+ target.slotState = ECMD_TARGET_FIELD_WILDCARD;
+ target.posState = ECMD_TARGET_FIELD_WILDCARD;
+ target.threadState = ECMD_TARGET_FIELD_UNUSED;
+ target.chipUnitNumState = ECMD_TARGET_FIELD_WILDCARD;
+
+ rc = ecmdConfigLooperInit(target, ECMD_SELECTED_TARGETS_LOOP_DEFALL, looper);
+
+ if (rc)
+ {
+ ecmdOutputError("Error initializing proc chip looper!\n");
+ ecmdUnloadDll();
+ return rc;
+ }
+
+ snprintf(outstr, sizeof(outstr),
+ "Going to call %s on proc k%d:n%d:s%d:p%02d chip type = %s %s\n",
+ PROCEDURE.c_str(), target.cage, target.node, target.slot, target.pos,
+ target.chipType.c_str(),
+ target.chipUnitType.c_str() );
+ ecmdOutput(outstr);
+
+ while (ecmdConfigLooperNext(target, looper))
+ {
+ if (!ecmdGetGlobalVar(ECMD_GLOBALVAR_QUIETMODE))
+ {
+ snprintf(outstr, sizeof(outstr),
+ "Going to call %s on proc k%d:n%d:s%d:p%02d chip type = %s %s\n",
+ PROCEDURE.c_str(), target.cage, target.node, target.slot, target.pos,
+ target.chipType.c_str(),
+ target.chipUnitType.c_str() );
+ ecmdOutput(outstr);
+ }
+
+ // Set up a fapi2::Target from ecmdChipTarget
+ fapi2::Target<fapi2::TARGET_TYPE_MCBIST> fapi_target(&target);
+
+ // invoke FAPI procedure core
+ FAPI_EXEC_HWP(rc_fapi, p9_mss_memdiag, fapi_target);
+ rc = (uint64_t) rc_fapi;
+
+ if (rc)
+ {
+ snprintf(outstr, sizeof(outstr),
+ "ERROR: %s FAPI call exited with return code = %s 0x%016x \n",
+ PROCEDURE.c_str(), ecmdParseReturnCode(rc).c_str(), rc);
+ ecmdOutputError(outstr);
+ ecmdUnloadDll();
+ return rc;
+ }
+
+ // mark that valid position has been found
+ valid_pos_found = true;
+ }
+
+ // check that a valid target was found
+ if (rc == ECMD_SUCCESS && !valid_pos_found)
+ {
+ ecmdOutputError("No valid targets found!\n");
+ ecmdUnloadDll();
+ return ECMD_TARGET_NOT_CONFIGURED;
+ }
+
+ prcdInfoMessage("----------------------------------------\n");
+ prcdInfoMessage(" mss_memdiag is done\n");
+ prcdInfoMessage("----------------------------------------\n");
+
+ //-----------------------------------------------------------------------------------------------
+ // Unload the eCMD Dll, this should always be the last thing you do
+ //-----------------------------------------------------------------------------------------------
+
+ ecmdUnloadDll();
+ return rc;
+}
diff --git a/src/import/chips/p9/procedures/hwp/memory/wrapper/p9_mss_memdiag_wrap.mk b/src/import/chips/p9/procedures/hwp/memory/wrapper/p9_mss_memdiag_wrap.mk
new file mode 100644
index 000000000..adaeb7126
--- /dev/null
+++ b/src/import/chips/p9/procedures/hwp/memory/wrapper/p9_mss_memdiag_wrap.mk
@@ -0,0 +1,30 @@
+# IBM_PROLOG_BEGIN_TAG
+# This is an automatically generated prolog.
+#
+# $Source: src/import/chips/p9/procedures/hwp/memory/wrapper/p9_mss_memdiag_wrap.mk $
+#
+# OpenPOWER HostBoot Project
+#
+# Contributors Listed Below - COPYRIGHT 2016,2018
+# [+] International Business Machines Corp.
+#
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+# IBM_PROLOG_END_TAG
+
+WRAPPER=p9_mss_memdiag_wrap
+$(WRAPPER)_USELIBS+=p9_mss_memdiag
+$(WRAPPER)_DEPLIBS+=mss
+$(WRAPPER)_DEPLIBS+=mss_generic
+$(call BUILD_WRAPPER)
OpenPOWER on IntegriCloud