summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/usr/isteps/istep09list.H3
-rw-r--r--src/include/usr/isteps/istep18list.H4
-rw-r--r--src/makefile3
-rw-r--r--src/usr/initservice/istepdispatcher/istepdispatcher.C22
-rw-r--r--src/usr/initservice/istepdispatcher/makefile3
-rw-r--r--src/usr/isteps/istep09/makefile5
-rw-r--r--src/usr/isteps/istep18/establish_system_smp.C673
-rw-r--r--src/usr/isteps/istep18/establish_system_smp.H124
-rw-r--r--src/usr/isteps/istep18/makefile21
-rw-r--r--src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.C230
-rw-r--r--src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.H45
-rw-r--r--src/usr/isteps/makefile3
-rw-r--r--src/usr/isteps/p9_fab_iovalid/makefile45
13 files changed, 1155 insertions, 26 deletions
diff --git a/src/include/usr/isteps/istep09list.H b/src/include/usr/isteps/istep09list.H
index 593b91386..30c1b4e6b 100644
--- a/src/include/usr/isteps/istep09list.H
+++ b/src/include/usr/isteps/istep09list.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2017 */
+/* Contributors Listed Below - COPYRIGHT 2012,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -229,6 +229,7 @@ const DepModInfo g_istep09Dependancies = {
{
DEP_LIB(libistep09.so),
DEP_LIB(libpm.so),
+ DEP_LIB(libp9_fab_iovalid.so),
NULL
}
};
diff --git a/src/include/usr/isteps/istep18list.H b/src/include/usr/isteps/istep18list.H
index 81cd3b171..e85ffed4e 100644
--- a/src/include/usr/isteps/istep18list.H
+++ b/src/include/usr/isteps/istep18list.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2017 */
+/* Contributors Listed Below - COPYRIGHT 2012,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -144,6 +144,8 @@ const DepModInfo g_istep18Dependancies = {
#ifndef CONFIG_VPO_COMPILE
DEP_LIB(libtod.so),
DEP_LIB(libistep18.so),
+ DEP_LIB(libp9_cpuWkup.so),
+ DEP_LIB(libp9_fab_iovalid.so),
#endif
NULL
}
diff --git a/src/makefile b/src/makefile
index d8498bd1e..b8b76957b 100644
--- a/src/makefile
+++ b/src/makefile
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2010,2017
+# Contributors Listed Below - COPYRIGHT 2010,2018
# [+] Google Inc.
# [+] International Business Machines Corp.
#
@@ -203,6 +203,7 @@ EXTENDED_MODULES += p9_phbPerst
EXTENDED_MODULES += $(if $(CONFIG_ENABLE_HDAT_IN_HOSTBOOT),hdat)
EXTENDED_MODULES += $(if $(CONFIG_SECUREBOOT),secureboot_ext)
EXTENDED_MODULES += tod
+EXTENDED_MODULES += p9_fab_iovalid
#***************************************
# Working test modules
diff --git a/src/usr/initservice/istepdispatcher/istepdispatcher.C b/src/usr/initservice/istepdispatcher/istepdispatcher.C
index a164544d8..06c45e640 100644
--- a/src/usr/initservice/istepdispatcher/istepdispatcher.C
+++ b/src/usr/initservice/istepdispatcher/istepdispatcher.C
@@ -66,6 +66,8 @@
#include <isteps/hwpisteperror.H>
#include <pnor/pnorif.H>
#include <lpc/lpcif.H>
+#include <istep18/establish_system_smp.H>
+
#ifdef CONFIG_BMC_IPMI
#include <ipmi/ipmiwatchdog.H> //IPMI watchdog timer
#include <ipmi/ipmipowerstate.H> //IPMI System ACPI Power State
@@ -2066,10 +2068,9 @@ void IStepDispatcher::handleProcFabIovalidMsg(msg_t * & io_pMsg)
// Create child thread so that if there are problems, the istep
// dispatcher code continues
- // @TODO RTC:133831
- //tid_t l_progTid = task_create(
- // ESTABLISH_SYSTEM_SMP::host_sys_fab_iovalid_processing,io_pMsg);
- tid_t l_progTid = 1;
+ tid_t l_progTid = task_create(
+ ESTABLISH_SYSTEM_SMP::host_sys_fab_iovalid_processing,io_pMsg);
+
assert( l_progTid > 0 );
// wait here for the task to end.
// status of the task ( OK or Crashed ) is returned in l_childsts
@@ -2124,9 +2125,8 @@ void IStepDispatcher::handleProcFabIovalidMsg(msg_t * & io_pMsg)
"Returned from cpu_all_winkle." );
}
- // Re-enable p8_cpu_special_wakeup
- // @TODO RTC:133831
- //err = ESTABLISH_SYSTEM_SMP::enableSpecialWakeup();
+ // Re-enable cpu special wakeup
+ err = ESTABLISH_SYSTEM_SMP::enableSpecialWakeup();
if (err)
{
TRACFCOMP( g_trac_initsvc,
@@ -2536,9 +2536,8 @@ errlHndl_t IStepDispatcher::handleCoalesceHostMsg()
// Ensure the library is loaded
- //@TODO RTC:164474
- //errlHndl_t err = VFS::module_load("libestablish_system_smp.so");
- errlHndl_t err = NULL;
+ errlHndl_t err = VFS::module_load("libestablish_system_smp.so");
+
if (err)
{
TRACFCOMP(g_trac_initsvc, "handleCoalesceHostMsg: Error loading module, PLID = 0x%x",
@@ -2546,8 +2545,7 @@ errlHndl_t IStepDispatcher::handleCoalesceHostMsg()
}
else
{
- //@TODO RTC:164474
- //err = ESTABLISH_SYSTEM_SMP::call_host_coalesce_host();
+ err = ESTABLISH_SYSTEM_SMP::call_host_coalesce_host();
if (err)
{
TRACFCOMP(g_trac_initsvc, "handleCoalesceHostMsg: Error with "
diff --git a/src/usr/initservice/istepdispatcher/makefile b/src/usr/initservice/istepdispatcher/makefile
index 904355860..52becfd3a 100644
--- a/src/usr/initservice/istepdispatcher/makefile
+++ b/src/usr/initservice/istepdispatcher/makefile
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2011,2017
+# Contributors Listed Below - COPYRIGHT 2011,2018
# [+] International Business Machines Corp.
#
#
@@ -34,6 +34,7 @@ EXTRAINCDIR += ${ROOTPATH}/src/import/chips/common/utils/imageProcs/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/ffdc/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/common/include/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/nest/
+EXTRAINCDIR += ${ROOTPATH}/src/usr/isteps
VPATH = ${ROOTPATH}/src/usr/initservice/bootconfig/
diff --git a/src/usr/isteps/istep09/makefile b/src/usr/isteps/istep09/makefile
index 24ba88a9f..a393ce668 100644
--- a/src/usr/isteps/istep09/makefile
+++ b/src/usr/isteps/istep09/makefile
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2015,2017
+# Contributors Listed Below - COPYRIGHT 2015,2018
# [+] International Business Machines Corp.
#
#
@@ -75,9 +75,6 @@ include ${PROCEDURES_PATH}/hwp/io/p9_io_xbus_post_trainadv.mk
# proc_smp_link_layer : Start SMP link layer
include ${PROCEDURES_PATH}/hwp/nest/p9_smp_link_layer.mk
-# p9_fab_iovalid
-include ${PROCEDURES_PATH}/hwp/nest/p9_fab_iovalid.mk
-
# p9_fbc_eff_config_aggregate
include ${PROCEDURES_PATH}/hwp/nest/p9_fbc_eff_config_aggregate.mk
diff --git a/src/usr/isteps/istep18/establish_system_smp.C b/src/usr/isteps/istep18/establish_system_smp.C
new file mode 100644
index 000000000..0a0ad4f76
--- /dev/null
+++ b/src/usr/isteps/istep18/establish_system_smp.C
@@ -0,0 +1,673 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/isteps/istep18/establish_system_smp.C $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2012,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 */
+/**
+ * @file establish_system_smp.C
+ *
+ * Support file for IStep: establish_system_smp
+ * Establish System SMP
+ *
+ * *****************************************************************
+ * THIS FILE WAS GENERATED ON 2012-04-11:1611
+ * *****************************************************************
+ *
+ * HWP_IGNORE_VERSION_CHECK
+ *
+ */
+
+/******************************************************************************/
+// Includes
+/******************************************************************************/
+#include <stdint.h>
+#include <sys/time.h>
+
+#include <trace/interface.H>
+#include <initservice/taskargs.H>
+#include <errl/errlentry.H>
+
+#include <initservice/isteps_trace.H>
+#include <isteps/hwpisteperror.H>
+#include <errl/errludtarget.H>
+
+#include <istep_mbox_msgs.H>
+#include <vfs/vfs.H>
+#include <config.h>
+
+// targeting support
+#include <targeting/common/commontargeting.H>
+#include <targeting/common/utilFilter.H>
+#include <targeting/common/attributes.H>
+
+// fapi support
+
+#include <fapi2.H>
+#include <fapi2/target.H>
+#include <fapi2/plat_hwp_invoker.H>
+#include <arch/pirformat.H>
+#include <isteps/hwpf_reasoncodes.H>
+
+
+#include <mbox/ipc_msg_types.H>
+#include <intr/interrupt.H>
+
+
+// Uncomment these files as they become available:
+// #include "host_coalesce_host/host_coalesce_host.H"
+#include <p9_block_wakeup_intr.H>
+#include <p9_cpu_special_wakeup.H>
+#include <initservice/istepdispatcherif.H>
+#include <isteps/hwpf_reasoncodes.H>
+
+#include "smp_unfencing_inter_enclosure_abus_links.H"
+
+#include "establish_system_smp.H"
+
+
+namespace ESTABLISH_SYSTEM_SMP
+{
+
+using namespace ISTEP;
+using namespace ISTEP_ERROR;
+using namespace ERRORLOG;
+using namespace TARGETING;
+
+
+//******************************************************************************
+//host_coalesce_timer function
+//******************************************************************************
+void* host_coalesce_timer(void* i_msgQPtr)
+
+{
+ int rc=0;
+
+ msg_t* msg = msg_allocate();
+ msg->type = HOST_COALESCE_TIMER_MSG;
+ uint32_t l_time_ms =0;
+
+ msg_q_t* msgQ = static_cast<msg_q_t*>(i_msgQPtr);
+
+
+ //this loop will be broken when the main thread receives
+ //all the messages and the timer thread receives the
+ //HB_COALESCE_MSG_DONE message
+
+ do
+ {
+ if (l_time_ms < MAX_TIME_ALLOWED_MS)
+ {
+ msg->data[1] = CONTINUE_WAIT_FOR_MSGS;
+ }
+ else
+ {
+ // HOST_COALESCE_TIMER_MSG is sent to the main thread indicating
+ // timer expired so the main thread responds back with HB_COALESCE_MSG_DONE
+ // indicating the timer is not needed and exit the loop
+ msg->data[1]=TIME_EXPIRED;
+ }
+
+ rc= msg_sendrecv(*msgQ, msg);
+ if (rc)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "coalesce host message timer failed msg sendrecv.");
+ }
+ if (msg->data[1] == HB_COALESCE_MSG_DONE)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "coalesce host message timer not needed.");
+ break;
+ }
+
+ nanosleep(0,NS_PER_MSEC);
+ l_time_ms++;
+
+ }while(1);
+
+ msg_free(msg);
+
+ return NULL;
+}
+
+//******************************************************************************
+// call_host_coalesce_host function
+//******************************************************************************
+errlHndl_t call_host_coalesce_host( )
+{
+ errlHndl_t l_errl = NULL;
+
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "call_host_coalesce_host entry" );
+
+ std::vector<TARGETING::EntityPath> present_drawers;
+
+
+ TARGETING::Target * sys = NULL;
+ TARGETING::targetService().getTopLevelTarget( sys );
+ if (sys == NULL)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "call_host_coalesce_host: error getting system target");
+ assert(0, "call_host_coalesce_host system target is NULL");
+ }
+
+ TARGETING::ATTR_HB_EXISTING_IMAGE_type hb_existing_image = 0;
+
+ hb_existing_image = sys->getAttr<TARGETING::ATTR_HB_EXISTING_IMAGE>();
+
+ if (hb_existing_image == 0)
+ {
+ //single node system so do nothing
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "call_host_coalesce_host on a single node system is a no-op" );
+ }
+ else
+ {
+
+ // This msgQ catches the responses to messages sent from each
+ //node to verify the IPC connection
+ msg_q_t msgQ = msg_q_create();
+ l_errl = MBOX::msgq_register(MBOX::HB_COALESCE_MSGQ,msgQ);
+
+ if(l_errl)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "call_host_coalesce_host:msgq_register failed" );
+ return l_errl;
+ }
+
+ //multi-node system
+ uint8_t node_map[NUMBER_OF_POSSIBLE_DRAWERS];
+ uint64_t msg_count = 0;
+
+ bool rc =
+ sys->tryGetAttr<TARGETING::ATTR_FABRIC_TO_PHYSICAL_NODE_MAP>
+ (node_map);
+ if (rc == false)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "call_host_coalesce_host:failed to get node map" );
+ assert(0,"call_host_coalesce_host:failed to get node map");
+ }
+
+ // The assertion is that the hostboot instance must be equal to
+ // the logical node we are running on. The ideal would be to have
+ // a function call that would return the HB instance number.
+ uint64_t this_node = PIR_t(task_getcpuid()).groupId;
+
+ //loop though all possible drawers whether they exist or not
+ // An invalid or non-existent logical node number in that drawer
+ // indicates that the drawerCount does not exist.
+ TARGETING::ATTR_HB_EXISTING_IMAGE_type mask = 0x0;
+ TARGETING::ATTR_HB_EXISTING_IMAGE_type master_node_mask = 0x0;
+
+ for(uint16_t drawerCount = 0; drawerCount < NUMBER_OF_POSSIBLE_DRAWERS; ++drawerCount)
+ {
+ uint16_t drawer = node_map[drawerCount];
+
+ if(drawerCount < NUMBER_OF_POSSIBLE_DRAWERS)
+ {
+
+ // set mask to msb
+ mask = 0x1 <<
+ (NUMBER_OF_POSSIBLE_DRAWERS -1);
+
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "mask=%X,hb_existing_image=%X",
+ mask,hb_existing_image);
+ if( 0 != ((mask >> drawerCount) & hb_existing_image ) )
+ {
+ //The first nonzero bit in hb_existing_image represents the
+ // master node, set mask for later comparison
+ if (master_node_mask == 0)
+ {
+ master_node_mask = mask;
+ }
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "send coalesce host message to drawer %d",
+ drawerCount );
+ ++msg_count;
+ msg_t * msg = msg_allocate();
+ msg->type = IPC::IPC_TEST_CONNECTION;
+ msg->data[0] = drawer; // target drawer
+ msg->data[1] = this_node; // node to send a msg back to
+ l_errl = MBOX::send(MBOX::HB_IPC_MSGQ, msg, drawer);
+ if (l_errl)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "MBOX::send failed");
+ break;
+ }
+ }
+ } else{
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "ATTR_FABRIC_TO_PHYSICAL_NODE_MAP is out of bounds");
+
+ //generate an errorlog
+ /*@
+ * @errortype ERRL_SEV_PREDICTIVE
+ * @moduleid fapi::MOD_HOST_COALESCE_HOST,
+ * @reasoncode fapi::RC_INVALID_SIZE,
+ * @userdata1 drawer number
+ * @userdata2 NUMBER_OF_POSSIBLE_DRAWERS
+ * @devdesc ATTR_FABRIC_TO_PHYSICAL_NODE_MAP is
+ * out of bounds for the given drawer
+ */
+ l_errl = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_PREDICTIVE,
+ fapi::MOD_HOST_COALESCE_HOST,
+ fapi::RC_INVALID_SIZE ,
+ drawer,
+ NUMBER_OF_POSSIBLE_DRAWERS );
+
+ l_errl->collectTrace("ISTEPS_TRACE");
+ l_errl->collectTrace("IPC");
+ l_errl->collectTrace("MBOXMSG");
+
+ break;
+ }
+ }
+
+ //if the send failed we just want to indicate that the
+ //istep failed and not wait for messages to come back from
+ //the other nodes
+ if(l_errl == NULL)
+ {
+ // reset mask to msb
+ mask = 0x1 << (NUMBER_OF_POSSIBLE_DRAWERS -1);
+ //create mask to apply to hb_existing_image for this particular node
+ mask = mask >> this_node;
+
+ if (master_node_mask & (hb_existing_image & mask))
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "Master Node detected, continue allowing "
+ "istep messages to this node.");
+ INITSERVICE::setAcceptIstepMessages(true);
+ }
+ else
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "This node is not the master node, no longer "
+ "respond to istep messages.");
+ INITSERVICE::setAcceptIstepMessages(false);
+ }
+
+ //wait for all hb images to respond
+ //want to spawn a timer thread
+ tid_t l_progTid = task_create(
+ ESTABLISH_SYSTEM_SMP::host_coalesce_timer,&msgQ);
+ assert( l_progTid > 0 ,"host_coalesce_timer failed");
+ while(msg_count)
+ {
+ msg_t* msg = msg_wait(msgQ);
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "coalesce host message for drawer %d completed.",
+ msg->data[0]);
+ if (msg->type == HOST_COALESCE_TIMER_MSG)
+ {
+ if (msg->data[1] == TIME_EXPIRED)
+ {
+ //timer has expired
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "call_host_coalesce_host failed to "
+ "receive messages from all hb images in time" );
+ //tell the timer thread to exit
+ msg->data[1] = HB_COALESCE_MSG_DONE;
+ msg_respond(msgQ,msg);
+
+ //generate an errorlog
+ /*@
+ * @errortype ERRL_SEV_CRITICAL_SYS_TERM
+ * @moduleid fapi::MOD_HOST_COALESCE_HOST,
+ * @reasoncode fapi::RC_HOST_TIMER_EXPIRED,
+ * @userdata1 MAX_TIME_ALLOWED_MS
+ * @userdata2 Number of nodes that have not
+ * responded
+ *
+ * @devdesc messages from other nodes have
+ * not returned in time
+ */
+ l_errl = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
+ fapi::MOD_HOST_COALESCE_HOST,
+ fapi::RC_HOST_TIMER_EXPIRED,
+ MAX_TIME_ALLOWED_MS,
+ msg_count );
+ l_errl->collectTrace("ISTEPS_TRACE");
+ l_errl->collectTrace("IPC");
+ l_errl->collectTrace("MBOXMSG");
+ return l_errl;
+
+ }
+ else if( msg->data[1] == CONTINUE_WAIT_FOR_MSGS)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "coalesce host timer continue waiting message.");
+ msg->data[1] =HB_COALESCE_WAITING_FOR_MSG;
+ msg_respond(msgQ,msg);
+ }
+ }
+ else if (msg->type == IPC::IPC_TEST_CONNECTION)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "Got response from node %d", msg->data[0] );
+ --msg_count;
+ msg_free(msg);
+ }
+
+ }
+
+ //the msg_count should be 0 at this point to have
+ //exited from the loop above. If the msg count
+ //is not zero then the timer must have expired
+ //and the code would have asserted
+ //Now need to tell the child timer thread to exit
+
+ //temp change while simics takes a long time for FLEETWOOD to IPL
+ //tmp check to tell the child timer thread to exit if didn't
+ //already timeout
+ if (msg_count ==0)
+ {
+ msg_t* msg = msg_wait(msgQ);
+ if (msg->type == HOST_COALESCE_TIMER_MSG)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "call_host_coalesce_host received all hb "
+ "images in time");
+
+ msg->data[1] = HB_COALESCE_MSG_DONE;
+ msg_respond(msgQ,msg);
+ }
+ }
+
+ //wait for the child thread to end
+ int l_childsts =0;
+ void* l_childrc = NULL;
+ tid_t l_tidretrc = task_wait_tid(l_progTid,&l_childsts,&l_childrc);
+ if ((static_cast<int16_t>(l_tidretrc) < 0)
+ || (l_childsts != TASK_STATUS_EXITED_CLEAN ))
+ {
+ // the launched task failed or crashed,
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "task_wait_tid failed; l_tidretrc=0x%x, l_childsts=0x%x",
+ l_tidretrc, l_childsts);
+
+ //generate an errorlog
+ /*@
+ * @errortype ERRL_SEV_CRITICAL_SYS_TERM
+ * @moduleid fapi::MOD_HOST_COALESCE_HOST,
+ * @reasoncode fapi::RC_HOST_TIMER_THREAD_FAIL,,
+ * @userdata1 l_tidretrc,
+ * @userdata2 l_childsts,
+ *
+ * @devdesc host coalesce host timer thread
+ * failed
+ */
+ l_errl = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_CRITICAL_SYS_TERM,
+ fapi::MOD_HOST_COALESCE_HOST,
+ fapi::RC_HOST_TIMER_THREAD_FAIL,
+ l_tidretrc,
+ l_childsts);
+
+ l_errl->collectTrace("ISTEPS_TRACE");
+ return l_errl;
+ }
+ }
+
+ MBOX::msgq_unregister(MBOX::HB_COALESCE_MSGQ);
+ msg_q_destroy(msgQ);
+
+
+ }
+
+
+
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "call_host_coalesce_host exit" );
+
+ // end task, returning any errorlogs to IStepDisp
+ return l_errl;
+}
+
+//******************************************************************************
+// host_sys_fab_iovalid_processing function
+//******************************************************************************
+void *host_sys_fab_iovalid_processing(void* io_ptr )
+{
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "host_sys_fab_iovalid_processing entry" );
+ // input parameter is actually a msg_t pointer
+ msg_t* io_pMsg = static_cast<msg_t *>(io_ptr);
+ // assume success, unless we hit an error later.
+ io_pMsg->data[0] = INITSERVICE::HWSVR_MSG_SUCCESS;
+
+ errlHndl_t l_errl = NULL;
+
+ // if there is extra data, start processing it
+ if(io_pMsg->extra_data)
+ {
+ iovalid_msg * drawerData = (iovalid_msg *)io_pMsg->extra_data;
+
+ // setup a pointer to the first drawer entry in our data
+ TARGETING::EntityPath * ptr = drawerData->drawers;
+
+ const uint16_t drawerCount = drawerData->count;
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "Master node %s List size = %d bytes Drawer count = %d",
+ ptr->toString(), drawerData->size, drawerCount);
+
+ // get FABRIC_TO_PHYSICAL_NODE_MAP
+ TARGETING::Target * sys = NULL;
+ TARGETING::targetService().getTopLevelTarget( sys );
+ assert(sys != NULL,"host_sys_fab_iovalid_processing system target is NULL");
+
+ uint8_t node_map[8];
+ bool rc = sys->tryGetAttr<TARGETING::ATTR_FABRIC_TO_PHYSICAL_NODE_MAP>
+ (node_map);
+ assert(rc == true,"host_sys_fab_iovalid_processing:failed to get node map");
+
+ TARGETING::ATTR_HB_EXISTING_IMAGE_type hb_existing_image = 0;
+
+ // create a vector with the present drawers
+ std::vector<TARGETING::EntityPath> present_drawers;
+
+ for(uint8_t i = 0; i < drawerCount; i++)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "list entry[%d] - %s", i, ptr->toString());
+
+ present_drawers.push_back(*ptr);
+
+ TARGETING::EntityPath::PathElement pe =
+ ptr->pathElementOfType(TARGETING::TYPE_NODE);
+
+ // pe.instance is the drawer number - convert to logical node
+ uint8_t logical_node = node_map[pe.instance];
+
+ // set mask to msb of bitmap
+ TARGETING::ATTR_HB_EXISTING_IMAGE_type mask = 0x1 <<
+ (NUMBER_OF_POSSIBLE_DRAWERS -1);
+
+ // set bit for this logical node.
+ hb_existing_image |= (mask >> logical_node);
+
+ ptr++;
+ }
+
+ sys->setAttr<TARGETING::ATTR_HB_EXISTING_IMAGE>(hb_existing_image);
+
+ // after agreement, open a-busses as required
+ l_errl = EDI_EI_INITIALIZATION::smp_unfencing_inter_enclosure_abus_links();
+ if (l_errl)
+ {
+ io_pMsg->data[0] = l_errl->plid();
+ errlCommit(l_errl, HWPF_COMP_ID);
+ }
+ }
+ else
+ {
+ // message needs to have at least one entry
+ // in the drawer list, else we will say invalid msg
+ io_pMsg->data[0] = INITSERVICE::HWSVR_INVALID_MESSAGE;
+ }
+
+ io_pMsg->data[1] = 0;
+
+ // if there wasn't an error
+ if (io_pMsg->data[0] == INITSERVICE::HWSVR_MSG_SUCCESS)
+ {
+ uint32_t l_plid = 0;
+
+ // Get all functional core units
+ TARGETING::TargetHandleList l_coreList;
+ getAllChiplets(l_coreList, TYPE_CORE);
+
+ for (auto l_core : l_coreList)
+ {
+
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "Running p9_block_wakeup_intr(SET) on EX target HUID %.8X",
+ TARGETING::get_huid(l_core));
+
+ fapi2::Target<fapi2::TARGET_TYPE_CORE> l_fapi2_core_target(l_core);
+
+ FAPI_INVOKE_HWP(l_errl,
+ p9_block_wakeup_intr,
+ l_fapi2_core_target,
+ p9pmblockwkup::SET);
+ if ( l_errl )
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "ERROR : p9_block_wakeup_intr(SET)" );
+ // capture the target data in the elog
+ ErrlUserDetailsTarget(l_core).addToLog( l_errl );
+ if (l_plid != 0)
+ {
+ // use the same plid as the previous
+ l_errl->plid(l_plid);
+ }
+ else
+ {
+ // set this plid for the caller to see
+ l_plid = l_errl->plid();
+ io_pMsg->data[0] = l_errl->plid();
+ }
+ errlCommit( l_errl, HWPF_COMP_ID );
+ }
+ else
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "SUCCESS : p9_block_wakeup_intr(SET)" );
+ }
+
+ // disable special wakeup
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "Running p9_cpu_special_wakeup_core (DISABLE) on Core target"
+ " HUID %.8X",
+ TARGETING::get_huid(l_core));
+
+ FAPI_INVOKE_HWP(l_errl,
+ p9_cpu_special_wakeup_core,
+ l_fapi2_core_target,
+ p9specialWakeup::SPCWKUP_DISABLE,
+ p9specialWakeup::HOST);
+
+ if(l_errl)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "Disable p9_cpu_special_wakeup_core ERROR :"
+ " Returning errorlog, reason=0x%x",
+ l_errl->reasonCode() );
+
+ // capture the target data in the elog
+ ErrlUserDetailsTarget(l_core).addToLog( l_errl );
+
+ break;
+ }
+ else
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "SUCCESS: Disable special wakeup");
+ }
+ }
+ }
+
+ // response will be sent by calling routine
+ // IStepDispatcher::handleProcFabIovalidMsg()
+ // which will also execute the procedure to winkle all cores
+
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "host_sys_fab_iovalid_processing exit data[0]=0x%X",
+ io_pMsg->data[0]);
+ return NULL;
+}
+
+
+errlHndl_t enableSpecialWakeup()
+{
+ errlHndl_t l_errl = NULL;
+
+ // Get all functional core units
+ TARGETING::TargetHandleList l_coreList;
+ getAllChiplets(l_coreList, TYPE_CORE);
+
+ for (auto l_core : l_coreList)
+ {
+
+ fapi2::Target<fapi2::TARGET_TYPE_CORE> l_fapi2_core_target(l_core);
+
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "Running p9_cpu_special_wakeup_core(ENABLE) "
+ "on Core target HUID %.8X",
+ TARGETING::get_huid(l_core));
+
+ FAPI_INVOKE_HWP(l_errl,
+ p9_cpu_special_wakeup_core,
+ l_fapi2_core_target,
+ p9specialWakeup::SPCWKUP_ENABLE,
+ p9specialWakeup::HOST);
+
+ if(l_errl)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "Enable p9_cpu_special_wakeup_core ERROR :"
+ " Returning errorlog, reason=0x%x",
+ l_errl->reasonCode() );
+
+ // capture the target data in the elog
+ ErrlUserDetailsTarget(l_core).addToLog( l_errl );
+
+ break;
+ }
+ else
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "SUCCESS: Enable special wakeup");
+ }
+ }
+ return l_errl;
+}
+
+}; // end namespace
diff --git a/src/usr/isteps/istep18/establish_system_smp.H b/src/usr/isteps/istep18/establish_system_smp.H
new file mode 100644
index 000000000..42b142e61
--- /dev/null
+++ b/src/usr/isteps/istep18/establish_system_smp.H
@@ -0,0 +1,124 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/isteps/istep18/establish_system_smp.H $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2012,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 */
+#ifndef __ESTABLISH_SYSTEM_SMP_ESTABLISH_SYSTEM_SMP_H
+#define __ESTABLISH_SYSTEM_SMP_ESTABLISH_SYSTEM_SMP_H
+
+/**
+ * @file establish_system_smp.H
+ *
+ * Establish System SMP
+ *
+ */
+
+ /*
+ * @{
+ * @substepnum 7
+ * @substepname host_sys_fab_iovalid_processing
+ * @substepdesc : Lower functional fences on sys SMP
+ * @target_sched serial
+ * @}
+ * @{
+ * @substepnum 10
+ * @substepname host_coalesce_host
+ * @substepdesc : Create single host image
+ * @target_sched serial
+ * @}
+ *
+ */
+
+/******************************************************************************/
+// Includes
+/******************************************************************************/
+#include <stdint.h>
+
+namespace ESTABLISH_SYSTEM_SMP
+{
+
+ /******************************************************************************/
+ // Globals/Constants
+ /******************************************************************************/
+ constexpr uint8_t HB_COALESCE_WAITING_FOR_MSG = 0x0;
+ constexpr uint8_t HB_COALESCE_MSG_DONE = 0x1;
+ constexpr uint32_t MAX_TIME_ALLOWED_MS = 10000;
+ constexpr uint8_t NUMBER_OF_POSSIBLE_DRAWERS = 8;
+ constexpr uint8_t CONTINUE_WAIT_FOR_MSGS = 0x2;
+ constexpr uint8_t TIME_EXPIRED=0x3;
+
+ /**
+ * @brief structure to hold iovalid processing data
+ *
+ */
+ struct iovalid_msg {
+ uint32_t size; //!Data length in bytes
+ uint16_t type; //! IPL/CCM type message
+ uint16_t count; //! Number of drawers in data
+ TARGETING::EntityPath drawers[0]; //! Place holder for data
+ };
+
+ /**
+ * enum used for sending messages within establishing system smp
+ */
+ enum
+ {
+ HOST_COALESCE_TIMER_MSG = 0xA1,
+ };
+
+ /**
+ * @brief host_coalesce_host
+ *
+ * Create single host image
+ *
+ * param[in,out] io_pMsg - input message buffer
+ * also used for response message to FSP
+ *
+ * return any errlogs to istep
+ *
+ */
+ errlHndl_t call_host_coalesce_host( );
+
+ /**
+ * @brief host_sys_fab_iovalid_processing
+ *
+ * Do hostboot side processing for fsp istep
+ * sys_proc_fab_iovalid
+ *
+ * param[in,out] io_pMsg - input message buffer with drawer info,
+ * also used for response message to FSP
+ * return NULL
+ */
+ void* host_sys_fab_iovalid_processing( void* io_pMsg );
+
+ /**
+ * @brief enableSpecialWakeup on all functional cores after
+ * winkle wakeup.
+ *
+ * @return error log handle
+ */
+ errlHndl_t enableSpecialWakeup();
+
+}; // end namespace
+
+#endif
+
diff --git a/src/usr/isteps/istep18/makefile b/src/usr/isteps/istep18/makefile
index d1add9dfe..a4862eb4f 100644
--- a/src/usr/isteps/istep18/makefile
+++ b/src/usr/isteps/istep18/makefile
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2016,2017
+# Contributors Listed Below - COPYRIGHT 2016,2018
# [+] International Business Machines Corp.
#
#
@@ -26,24 +26,35 @@ ROOTPATH = ../../../..
MODULE = istep18
-PROCEDURES_PATH = ${ROOTPATH}/src/import/chips/p9/procedures/hwp/nest
+PROCEDURES_PATH = ${ROOTPATH}/src/import/chips/p9/procedures/hwp
## support for Targeting and fapi
EXTRAINCDIR += ${PROCEDURES_PATH}
+EXTRAINCDIR += ${PROCEDURES_PATH}/nest
+EXTRAINCDIR += ${PROCEDURES_PATH}/pm
+EXTRAINCDIR += ${PROCEDURES_PATH}/lib
EXTRAINCDIR += ${ROOTPATH}/src/import/hwpf/fapi2/include
EXTRAINCDIR += ${ROOTPATH}/src/include/usr/fapi2
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/utils/imageProcs
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/common/utils/imageProcs
+EXTRAINCDIR += ${ROOTPATH}/src/usr/initservice/istepdispatcher
+EXTRAINCDIR += ${ROOTPATH}/src/usr/include/isteps/
EXTRAINCDIR += ${ROOTPATH}/src/usr/isteps
## pointer to common HWP files
OBJS += call_tod_init.o
OBJS += call_tod_setup.o
+OBJS += smp_unfencing_inter_enclosure_abus_links.o
+OBJS += establish_system_smp.o
include ${ROOTPATH}/procedure.rules.mk
-include ${PROCEDURES_PATH}/p9_tod_init.mk
-include ${PROCEDURES_PATH}/p9_tod_setup.mk
-include ${PROCEDURES_PATH}/p9_tod_save_config.mk
+include ${PROCEDURES_PATH}/nest/p9_tod_init.mk
+include ${PROCEDURES_PATH}/nest/p9_tod_setup.mk
+include ${PROCEDURES_PATH}/nest/p9_tod_save_config.mk
include ${ROOTPATH}/config.mk
VPATH += ${PROCEDURES_PATH}
+VPATH += ${PROCEDURES_PATH}/pm/
+VPATH += ${PROCEDURES_PATH}/nest/
+VPATH += ${PROCEDURES_PATH}/lib/
+VPATH += ${ROOTPATH}/src/usr/include/isteps/
diff --git a/src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.C b/src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.C
new file mode 100644
index 000000000..ffea3f394
--- /dev/null
+++ b/src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.C
@@ -0,0 +1,230 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.C $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2012,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 */
+
+
+/******************************************************************************/
+// Includes
+/******************************************************************************/
+#include <stdint.h>
+#include <map>
+
+#include <trace/interface.H>
+#include <initservice/taskargs.H>
+#include <errl/errlentry.H>
+
+#include <errl/errludtarget.H>
+
+#include <initservice/isteps_trace.H>
+
+#include <hwas/common/deconfigGard.H>
+#include <hwas/common/hwasCommon.H>
+
+#include <sbe/sbeif.H>
+
+//HWP
+#include <p9_fab_iovalid.H>
+
+// targeting support
+#include <targeting/common/commontargeting.H>
+#include <targeting/common/utilFilter.H>
+#include <targeting/common/trace.H>
+
+// fapi support
+#include <fapi2.H>
+#include <fapi2/plat_hwp_invoker.H>
+#include <isteps/hwpf_reasoncodes.H>
+#include <isteps/hwpisteperror.H>
+#include <config.h>
+#include <vector>
+#include "smp_unfencing_inter_enclosure_abus_links.H"
+
+namespace EDI_EI_INITIALIZATION
+{
+
+
+ using namespace ISTEP;
+ using namespace ISTEP_ERROR;
+ using namespace ERRORLOG;
+ using namespace TARGETING;
+ using namespace fapi;
+ using namespace HWAS;
+
+
+
+ /*
+ *
+ * brief function to check if peer target is present.
+ *
+ * returns true if peer is present, else false
+ *
+ */
+ bool isPeerPresent(TARGETING::TargetHandle_t i_targetPtr)
+ {
+ bool l_flag = false;
+
+ do
+ {
+ if( NULL == i_targetPtr)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "isPeerPresent:ERR: Null input target");
+ break;
+ }
+
+ EntityPath l_peerPath;
+ bool l_exists = i_targetPtr->tryGetAttr<ATTR_PEER_PATH>(l_peerPath);
+
+ if( false == l_exists)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "isPeerPresent:ERR: Failed to get ATTR_PEER_PATH for "
+ "target HUID:0x%08x", get_huid(i_targetPtr));
+ break;
+ }
+
+ EntityPath::PathElement l_pa = l_peerPath.pathElementOfType(TYPE_NODE);
+
+ if(l_pa.type == TYPE_NA)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "isPeerPresent:ERR: Cannot find Node into in peer path: "
+ "[%s],target HUID:0x%08x", l_peerPath.toString(),
+ get_huid(i_targetPtr));
+ break;
+ }
+
+ TARGETING::Target * sys = NULL;
+ TARGETING::targetService().getTopLevelTarget( sys );
+ assert(sys != NULL, "isPeerPresent system target is NULL");
+
+ TARGETING::ATTR_HB_EXISTING_IMAGE_type hb_images;
+
+ l_exists =
+ sys->tryGetAttr<TARGETING::ATTR_HB_EXISTING_IMAGE>(hb_images);
+
+ if( false == l_exists )
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "isPeerPresent:ERR: Failed to get "
+ "ATTR_HB_EXISTING_IMAGE "
+ "for system target. Input target HUID:0x%08x",
+ get_huid(i_targetPtr));
+ break;
+ }
+
+ // ATTR_HB_EXISTING_IMAGE only gets set on a multi-drawer system.
+ // Currently set up in host_sys_fab_iovalid_processing() which only
+ // gets called if there are multiple physical nodes. It eventually
+ // needs to be setup by a hb routine that snoops for multiple nodes.
+ if(hb_images == 0)
+ {
+ // Single node system
+ break;
+ }
+
+ // continue - multi-node
+ uint8_t node_map[8];
+ l_exists =
+ sys->tryGetAttr<TARGETING::ATTR_FABRIC_TO_PHYSICAL_NODE_MAP>(node_map);
+
+ if( false == l_exists )
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "isPeerPresent:ERR: Failed to get "
+ "ATTR_FABRIC_TO_PHYSICAL_NODE_MAP "
+ "for system target. Input target HUID:0x%08x",
+ get_huid(i_targetPtr));
+ break;
+ }
+
+ if(l_pa.instance < (sizeof(TARGETING::ATTR_HB_EXISTING_IMAGE_type) * 8))
+ {
+ // set mask
+ TARGETING::ATTR_HB_EXISTING_IMAGE_type mask = 0x1 <<
+ ((sizeof(TARGETING::ATTR_HB_EXISTING_IMAGE_type) * 8) -1);
+
+ if( 0 != ((mask >> l_pa.instance) & hb_images ) )
+ {
+ l_flag = true;
+ }
+ }
+
+ }while(0);
+
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "isPeerPresent:[%d], HUID:0x%08x",l_flag,get_huid(i_targetPtr));
+
+ return l_flag;
+ }
+ //
+ // function to unfence inter-enclosure abus links
+ //
+ errlHndl_t smp_unfencing_inter_enclosure_abus_links()
+ {
+ errlHndl_t l_errl = NULL;
+
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "smp_unfencing_inter_enclosure_abus_links entry" );
+
+ // Get all chip/chiplet targets
+ TARGETING::TargetHandleList l_cpuTargetList;
+ getAllChips(l_cpuTargetList, TYPE_PROC);
+
+
+ // Loop through all processors including master
+ for (const auto & l_cpu_target: l_cpuTargetList)
+ {
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>l_fapi2_proc_target(
+ l_cpu_target);
+
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "Running p9_fab_iovalid HWP on processor target %.8X",
+ TARGETING::get_huid(l_cpu_target) );
+ FAPI_INVOKE_HWP(l_errl, p9_fab_iovalid, l_fapi2_proc_target,
+ true, true, false);
+ if(l_errl)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "ERROR 0x%.8X : p9_fab_iovalid "
+ "HWP returns error for HUID %.8X",
+ l_errl->reasonCode(),
+ TARGETING::get_huid(l_cpu_target) );
+
+ // capture the target data in the elog
+ ErrlUserDetailsTarget(l_cpu_target).addToLog( l_errl );
+
+ errlCommit(l_errl, HWPF_COMP_ID);
+ l_errl = NULL;
+ }
+ } // end of going through all processors//
+
+
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "smp_unfencing_inter_enclosure_abus_links exit" );
+
+ return l_errl;
+ }
+
+}; // end namespace
diff --git a/src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.H b/src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.H
new file mode 100644
index 000000000..31d8fae18
--- /dev/null
+++ b/src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.H
@@ -0,0 +1,45 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.H $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2013,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 */
+#ifndef __SMP_UNFENCING_INTER_ENCLOSURE_ABUS_LINKS_H
+#define __SMP_UNFENCING_INTER_ENCLOSURE_ABUS_LINKS_H
+
+#include <errl/errlentry.H>
+
+namespace EDI_EI_INITIALIZATION
+{
+
+ /**
+ * @brief smp_unfencing_inter_enclosure_abus_links
+ *
+ * Lower functional fences of inter-enclosure Abus links
+ *
+ * return errlHndl if an error occurs
+ *
+ */
+ errlHndl_t smp_unfencing_inter_enclosure_abus_links();
+
+}
+
+#endif
diff --git a/src/usr/isteps/makefile b/src/usr/isteps/makefile
index 1d5e61874..fb39e568a 100644
--- a/src/usr/isteps/makefile
+++ b/src/usr/isteps/makefile
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2011,2017
+# Contributors Listed Below - COPYRIGHT 2011,2018
# [+] International Business Machines Corp.
#
#
@@ -46,6 +46,7 @@ SUBDIRS+=cen.d
SUBDIRS+=cpuWkup.d
SUBDIRS+=p9_phbPerst.d
SUBDIRS+=tod.d
+SUBDIRS+=p9_fab_iovalid.d
OBJS += hwpisteperror.o
OBJS += hwpistepud.o
diff --git a/src/usr/isteps/p9_fab_iovalid/makefile b/src/usr/isteps/p9_fab_iovalid/makefile
new file mode 100644
index 000000000..7f58f8f01
--- /dev/null
+++ b/src/usr/isteps/p9_fab_iovalid/makefile
@@ -0,0 +1,45 @@
+# IBM_PROLOG_BEGIN_TAG
+# This is an automatically generated prolog.
+#
+# $Source: src/usr/isteps/p9_fab_iovalid/makefile $
+#
+# OpenPOWER HostBoot Project
+#
+# Contributors Listed Below - COPYRIGHT 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
+
+ROOTPATH = ../../../..
+MODULE = p9_fab_iovalid
+
+PROCEDURES_PATH = ${ROOTPATH}/src/import/chips/p9/procedures
+
+EXTRAINCDIR += ${ROOTPATH}/src/import/chips/common/utils/imageProcs/
+EXTRAINCDIR += ${ROOTPATH}/src/import/hwpf/fapi2/include/
+EXTRAINCDIR += ${ROOTPATH}/src/include/usr/
+EXTRAINCDIR += ${ROOTPATH}/src/include/usr/fapi2/
+EXTRAINCDIR += ${PROCEDURES_PATH}/hwp/lib/
+EXTRAINCDIR += ${PROCEDURES_PATH}/hwp/nest
+
+
+#OBJS += p9_fab_iovalid.o
+
+include ${ROOTPATH}/procedure.rules.mk
+include $(PROCEDURES_PATH)/hwp/nest/p9_fab_iovalid.mk
+include ${ROOTPATH}/config.mk
+
+VPATH += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/nest/
OpenPOWER on IntegriCloud