diff options
author | Swathi Madhuri Bhattiprolu <bhmadhur@in.ibm.com> | 2018-01-08 03:38:04 -0600 |
---|---|---|
committer | William G. Hoffa <wghoffa@us.ibm.com> | 2018-01-31 09:38:28 -0500 |
commit | d999ed144f949e318fbd0523f0dfaa56d291596f (patch) | |
tree | 3fcab2e8f602c8ac442e8eb27f4b0b8a816b40e5 /src | |
parent | 82805770e03584fbe18df365600d5090b170d364 (diff) | |
download | blackbird-hostboot-d999ed144f949e318fbd0523f0dfaa56d291596f.tar.gz blackbird-hostboot-d999ed144f949e318fbd0523f0dfaa56d291596f.zip |
Re-enable base multi-drawer ipl support
Changes include:
- Establish System SMP
- host_coalesce_host message processing
- host_sys_fab_iovalid_processing
- smp_unfencing_inter_enclosure_abus_links
Change-Id: I83fea15f0d14c9cbc9a884ece5a2e7ce01e888bb
RTC:164474
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/51598
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Prachi Gupta <pragupta@us.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/include/usr/isteps/istep09list.H | 3 | ||||
-rw-r--r-- | src/include/usr/isteps/istep18list.H | 4 | ||||
-rw-r--r-- | src/makefile | 3 | ||||
-rw-r--r-- | src/usr/initservice/istepdispatcher/istepdispatcher.C | 22 | ||||
-rw-r--r-- | src/usr/initservice/istepdispatcher/makefile | 3 | ||||
-rw-r--r-- | src/usr/isteps/istep09/makefile | 5 | ||||
-rw-r--r-- | src/usr/isteps/istep18/establish_system_smp.C | 673 | ||||
-rw-r--r-- | src/usr/isteps/istep18/establish_system_smp.H | 124 | ||||
-rw-r--r-- | src/usr/isteps/istep18/makefile | 21 | ||||
-rw-r--r-- | src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.C | 230 | ||||
-rw-r--r-- | src/usr/isteps/istep18/smp_unfencing_inter_enclosure_abus_links.H | 45 | ||||
-rw-r--r-- | src/usr/isteps/makefile | 3 | ||||
-rw-r--r-- | src/usr/isteps/p9_fab_iovalid/makefile | 45 |
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/ |