/* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ /* $Source: src/usr/diag/mdia/mdia.C $ */ /* */ /* OpenPOWER HostBoot Project */ /* */ /* Contributors Listed Below - COPYRIGHT 2012,2017 */ /* [+] 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 */ /** * @file mdia.C * @brief mdia entry points, utility function implementations */ // The following is required because MDIA implements its own version of these // hardware procedures: // $Id: mss_memdiags.H,v 1.9 2013/12/02 14:58:58 bellows Exp $ // $Id: mss_memdiags.C,v 1.24 2014/03/11 19:05:18 gollub Exp $ #include "mdiafwd.H" #include "mdiatrace.H" #include "mdiasm.H" #include "mdiasmimpl.H" #include #include #include using namespace TARGETING; using namespace Util; namespace MDIA { errlHndl_t runStep(const TargetHandleList & i_targetList) { MDIA_FAST("memory diagnostics entry with %d target(s)", i_targetList.size()); // memory diagnostics ipl step entry point errlHndl_t err = nullptr; Globals globals; TargetHandle_t top = nullptr; targetService().getTopLevelTarget(top); if(top) { globals.mfgPolicy = top->getAttr(); uint8_t maxMemPatterns = top->getAttr(); // This registry / attr is the same as the // exhaustive mnfg one if(maxMemPatterns) { globals.mfgPolicy |= MNFG_FLAG_ENABLE_EXHAUSTIVE_PATTERN_TEST; } globals.simicsRunning = Util::isSimicsRunning(); } // get the workflow for each target mba passed in. // associate each workflow with the target handle. WorkFlowAssocMap list; TargetHandleList::const_iterator tit; DiagMode mode; for(tit = i_targetList.begin(); tit != i_targetList.end(); ++tit) { err = getDiagnosticMode(globals, *tit, mode); if(err) { break; } err = getWorkFlow(mode, list[*tit], globals); if(err) { break; } } if(nullptr == err) { // set global data Singleton::instance().setGlobals(globals); err = Singleton::instance().run(list); } // ensure threads and pools are shutdown when finished doStepCleanup(globals); // If this step completes without the need for a reconfig due to an RCD // parity error, clear all RCD parity error counters. ATTR_RECONFIGURE_LOOP_type attr = top->getAttr(); if ( 0 == (attr & RECONFIGURE_LOOP_RCD_PARITY_ERROR) ) { TargetHandleList trgtList; getAllChiplets( trgtList, TYPE_MCA ); for ( auto & trgt : trgtList ) { if ( 0 != trgt->getAttr() ) trgt->setAttr(0); } } if (nullptr != err) { MDIA_FAST("runStep: error in runStep"); } return err; } void doStepCleanup(const Globals & i_globals) { // stop the state machine Singleton::instance().shutdown(); // TODO ... stop the command monitor } errlHndl_t processEvent(MaintCommandEvent & i_event) { errlHndl_t err = 0; // Call State machine processEvent Singleton::instance().processMaintCommandEvent(i_event); return err; } void waitingForMaintCmdEvents(bool & o_waiting) { Singleton::instance().running(o_waiting); } }