diff options
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) |