diff options
| author | ayma <ayma@us.ibm.com> | 2013-11-21 16:43:26 -0600 |
|---|---|---|
| committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2014-01-10 11:46:56 -0600 |
| commit | 4ad61235bc58f1ed2740bd0e2a03e27438038997 (patch) | |
| tree | 20d2b74f4b6776cdabc17ce35780e1c8531f43a6 /src | |
| parent | 63df7681be86e6f1aafaa62d70306b09edf88bba (diff) | |
| download | talos-hostboot-4ad61235bc58f1ed2740bd0e2a03e27438038997.tar.gz talos-hostboot-4ad61235bc58f1ed2740bd0e2a03e27438038997.zip | |
istep 18.12 hb changes
18.12. host_coalesce_host : Re-activate Hostboot images
a) FSP sends each Hostboot image a mailbox .wakeup. message
This places an a pending interrupt to the EX, but it is
blocked by the .block wakeup. sources
b) FSP then removes the block wakeup sources (master processor last)
p8_block_wakeup_intr.C -reset
This removes the block wakeup sources and allows hostboot to
receive (and exit winkle) the pending mailbox message
c) HB instance will wake up (un-winkle) its master core, thread 0
d) Hostboot will then issue IPIs to all threads in its instance
e) Hostboot will establish IPC between each of the HB entities
On failure system will xstop or TI
No sync point with the FSP
RTC: 89024
Change-Id: I747873d0b5c38f8c440a8546d44be2b8e94bce2e
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/7395
Tested-by: Jenkins Server
Reviewed-by: Brian H. Horton <brianh@linux.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/usr/hwpf/hwpf_reasoncodes.H | 5 | ||||
| -rw-r--r-- | src/include/usr/isteps/istep18list.H | 14 | ||||
| -rw-r--r-- | src/include/usr/mbox/ipc_msg_types.H | 3 | ||||
| -rw-r--r-- | src/include/usr/mbox/mbox_queues.H | 3 | ||||
| -rw-r--r-- | src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C | 334 | ||||
| -rw-r--r-- | src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.H | 15 | ||||
| -rw-r--r-- | src/usr/initservice/istepdispatcher/istep_mbox_msgs.H | 6 | ||||
| -rw-r--r-- | src/usr/initservice/istepdispatcher/istepdispatcher.C | 52 | ||||
| -rw-r--r-- | src/usr/initservice/istepdispatcher/istepdispatcher.H | 9 | ||||
| -rw-r--r-- | src/usr/mbox/ipcSp.C | 16 |
10 files changed, 408 insertions, 49 deletions
diff --git a/src/include/usr/hwpf/hwpf_reasoncodes.H b/src/include/usr/hwpf/hwpf_reasoncodes.H index 9babe4e05..1a0d9c873 100644 --- a/src/include/usr/hwpf/hwpf_reasoncodes.H +++ b/src/include/usr/hwpf/hwpf_reasoncodes.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2013 */ +/* COPYRIGHT International Business Machines Corp. 2013,2014 */ /* */ /* p1 */ /* */ @@ -64,6 +64,7 @@ namespace fapi MOD_PLAT_ATTR_SVC_GET_SPARE_DATA = 0x19, MOD_PLAT_ATTR_SVC_GET_BADDQ_DATA = 0x1A, MOD_PLAT_ATTR_SVC_SET_BADDQ_DATA = 0x1B, + MOD_HOST_COALESCE_HOST = 0x1C, }; /** @@ -109,6 +110,8 @@ namespace fapi RC_INCORRECT_MSG_TYPE = HWPF_COMP_ID | 0x28, RC_NO_SINGLE_MBA = HWPF_COMP_ID | 0x29, + RC_HOST_TIMER_EXPIRED = HWPF_COMP_ID | 0x2A, + RC_HOST_TIMER_THREAD_FAIL = HWPF_COMP_ID | 0x2B, }; /** diff --git a/src/include/usr/isteps/istep18list.H b/src/include/usr/isteps/istep18list.H index 2a735462b..f1b70c57c 100644 --- a/src/include/usr/isteps/istep18list.H +++ b/src/include/usr/isteps/istep18list.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2012,2013 */ +/* COPYRIGHT International Business Machines Corp. 2012,2014 */ /* */ /* p1 */ /* */ @@ -27,10 +27,8 @@ * @file istep18list.H * * IStep 18 Establish System SMP - * IPL FLow Doc v1.35 (04/11/13) + * IPL FLow Doc v1.39 (12/09/13) * - * 18.12 host_coalesce_host - * : Create single host image * 18.13 proc_tod_setup * : Create TOD topology * 18.14 proc_tod_init @@ -187,12 +185,12 @@ namespace INITSERVICE } }, { - ISTEPNAME(18,12,"host_coalesce_host"), - ESTABLISH_SYSTEM_SMP::call_host_coalesce_host, + ISTEPNAME(18,12,""), + NULL, { - START_FN, + NONE, EXT_IMAGE, - NORMAL_IPL_OP | MPIPL_OP, + IPL_NOOP, false, } }, diff --git a/src/include/usr/mbox/ipc_msg_types.H b/src/include/usr/mbox/ipc_msg_types.H index 306e93d39..e6b450b40 100644 --- a/src/include/usr/mbox/ipc_msg_types.H +++ b/src/include/usr/mbox/ipc_msg_types.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2013 */ +/* COPYRIGHT International Business Machines Corp. 2013,2014 */ /* */ /* p1 */ /* */ @@ -33,6 +33,7 @@ namespace IPC enum ipc_msg_type_t { IPC_POPULATE_ATTRIBUTES = MBOX::FIRST_SECURE_MSG + 1, + IPC_TEST_CONNECTION = MBOX::FIRST_SECURE_MSG + 2, }; }; // namespace IPC diff --git a/src/include/usr/mbox/mbox_queues.H b/src/include/usr/mbox/mbox_queues.H index 564775f1b..0f2e5e277 100644 --- a/src/include/usr/mbox/mbox_queues.H +++ b/src/include/usr/mbox/mbox_queues.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2012,2013 */ +/* COPYRIGHT International Business Machines Corp. 2012,2014 */ /* */ /* p1 */ /* */ @@ -50,6 +50,7 @@ namespace MBOX HB_LID_MSGQ = 8, //For transferring LIDs from FSP. HB_IPC_MSGQ = 9, //For inter-drawer HB messages HB_POP_ATTR_MSGQ = 10, // populate Attribute response + HB_COALESCE_MSGQ = 11, //host_coalesce response // Add HB mbox msg queue ids (services) before this line HB_LAST_VALID_MSGQ, // end of valid HB mbox msgQ ids diff --git a/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C b/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C index de014e2a3..bcc4e498c 100644 --- a/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C +++ b/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2012,2013 */ +/* COPYRIGHT International Business Machines Corp. 2012,2014 */ /* */ /* p1 */ /* */ @@ -38,6 +38,7 @@ // Includes /******************************************************************************/ #include <stdint.h> +#include <sys/time.h> #include <trace/interface.H> #include <initservice/taskargs.H> @@ -58,11 +59,11 @@ // fapi support #include <fapi.H> #include <fapiPlatHwpInvoker.H> +#include <hwpf/hwpf_reasoncodes.H> #include "establish_system_smp.H" - -// Uncomment these files as they become available: -// #include "host_coalesce_host/host_coalesce_host.H" +#include <mbox/ipc_msg_types.H> +#include <intr/interrupt.H> namespace ESTABLISH_SYSTEM_SMP { @@ -73,50 +74,317 @@ using namespace TARGETING; using namespace fapi; using namespace EDI_EI_INITIALIZATION; -// -// Wrapper function to call host_coalesce_host -// -void* call_host_coalesce_host( void *io_pArgs ) +/******************************************************************************/ +// Globals/Constants +/******************************************************************************/ +const uint8_t HB_COALESCE_WAITING_FOR_MSG = 0x0; +const uint8_t HB_COALESCE_MSG_DONE = 0x1; +const uint8_t MAX_TIME_ALLOWED_MS = 10; +const uint8_t NUMBER_OF_POSSIBLE_NODES = 8; +const uint8_t CONTINUE_WAIT_FOR_MSGS = 0x2; +const uint8_t TIME_EXPIRED=0x3; + +//****************************************************************************** +//host_coalese_timer function +//****************************************************************************** +void* host_coalese_timer(void* i_msgQPtr) + +{ + int rc=0; + + msg_t* msg = msg_allocate(); + msg->type = HOST_COALESCE_TIMER_MSG; + uint8_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 recieves + //all the messages and the timer thread recieves the + //HB_COALESCE_MSG_DONE message + + do + { + if (l_time_ms < MAX_TIME_ALLOWED_MS) + { + msg->data[1] = CONTINUE_WAIT_FOR_MSGS; + } + else + { + msg->data[1]=TIME_EXPIRED; + } + + rc= msg_sendrecv(*msgQ, msg); + if (rc) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "coalese host message timer failed msg sendrecv."); + } + if (msg->data[1] == HB_COALESCE_MSG_DONE) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "coalese 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; - TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_coalesce_host entry" ); -#if 0 - // @@@@@ CUSTOM BLOCK: @@@@@ - // figure out what targets we need - // customize any other inputs - // set up loops to go through all targets (if parallel, spin off a task) + 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); + } - // write HUID of target - TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, - "target HUID %.8X", TARGETING::get_huid(l)); + TARGETING::ATTR_HB_EXISTING_IMAGE_type hb_existing_image = 0; - // cast OUR type of target to a FAPI type of target. - const fapi::Target l_fapi_@targetN_target( TARGET_TYPE_MEMBUF_CHIP, - (const_cast<TARGETING::Target*>(l_@targetN_target)) ); + hb_existing_image = sys->getAttr<TARGETING::ATTR_HB_EXISTING_IMAGE>(); - // call the HWP with each fapi::Target - FAPI_INVOKE_HWP( l_errl, host_coalesce_host, _args_...); - if ( l_errl ) + if (hb_existing_image == 0) { - TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, - "ERROR : .........." ); - errlCommit( l_errl, HWPF_COMP_ID ); + //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 { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "SUCCESS : .........." ); + + // This msgQ catches the reponses 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_NODES]; + 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); + } + + // 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. + const INTR::PIR_t masterCpu = task_getcpuid(); + uint64_t this_node = masterCpu.nodeId; + + + //loop though all possible drawers whether they exist or not + // An invalid or non-existant logical node number in that drawer + // indicates that the drawer does not exist. + + TARGETING::ATTR_HB_EXISTING_IMAGE_type mask = 0x0; + + for(uint16_t drawer = 0; drawer < NUMBER_OF_POSSIBLE_NODES; ++drawer) + { + uint16_t node = node_map[drawer]; + + if(node < NUMBER_OF_POSSIBLE_NODES) + { + + // set mask to msb + mask = 0x1 << + (NUMBER_OF_POSSIBLE_NODES -1); + + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "mask=%X,hb_existing_image=%X", + mask,hb_existing_image); + if( 0 != ((mask >> node) & hb_existing_image ) ) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "send coalese host message to drawer %d", + drawer ); + ++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, node); + if (l_errl) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "MBOX::send failed"); + 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) + { + //wait for all hb images to respond + //want to spawn a timer thread + tid_t l_progTid = task_create( + ESTABLISH_SYSTEM_SMP::host_coalese_timer,&msgQ); + assert( l_progTid > 0 ); + while(msg_count) + { + msg_t* msg = msg_wait(msgQ); + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "coalese 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, + "coalese 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 BRAZOS 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); + + } - // @@@@@ END CUSTOM BLOCK: @@@@@ -#endif - TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + + + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_host_coalesce_host exit" ); - // end task, returning any errorlogs to IStepDisp return l_errl; } @@ -182,7 +450,7 @@ void host_sys_fab_iovalid_processing( msg_t* io_pMsg ) // set mask to msb of bitmap TARGETING::ATTR_HB_EXISTING_IMAGE_type mask = 0x1 << - ((sizeof(TARGETING::ATTR_HB_EXISTING_IMAGE_type) * 8) -1); + (NUMBER_OF_POSSIBLE_NODES -1); // set bit for this logical node. hb_existing_image |= (mask >> logical_node); diff --git a/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.H b/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.H index 25bcf0a1f..51ff27cc5 100644 --- a/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.H +++ b/src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2012,2013 */ +/* COPYRIGHT International Business Machines Corp. 2012,2014 */ /* */ /* p1 */ /* */ @@ -73,17 +73,26 @@ namespace ESTABLISH_SYSTEM_SMP 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] - pointer to any arguments, usually NULL + * param[in,out] io_pMsg - input message buffer + * also used for response message to FSP * * return any errlogs to istep * */ -void* call_host_coalesce_host( void *io_pArgs ); +errlHndl_t call_host_coalesce_host( ); /** * @brief host_sys_fab_iovalid_processing diff --git a/src/usr/initservice/istepdispatcher/istep_mbox_msgs.H b/src/usr/initservice/istepdispatcher/istep_mbox_msgs.H index c7b97e25b..e6ad9263e 100644 --- a/src/usr/initservice/istepdispatcher/istep_mbox_msgs.H +++ b/src/usr/initservice/istepdispatcher/istep_mbox_msgs.H @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2012,2013 */ +/* COPYRIGHT International Business Machines Corp. 2012,2014 */ /* */ /* p1 */ /* */ @@ -44,6 +44,7 @@ enum { HWSVR_MSG_SUCCESS = 0x00, HWSVR_INVALID_MESSAGE = 0x01, + HWSVR_MSG_ERROR = 0x02, }; // ------------------------------------------------------------------ @@ -57,6 +58,7 @@ enum HWSVR_SYNC_POINT = 0x10, HWSVR_IPL_PROGRESS_CODE = 0x11, HWSVR_DO_IOVALID_PROCESSING = 0xC1, + HWSVR_COALESCE_HOST = 0xC2, HWSVR_DO_SHUTDOWN = 0x12 }; @@ -79,6 +81,8 @@ enum HWSVR_IPL_PROGRESS_CODE, SHUTDOWN = MBOX::FIRST_UNSECURE_MSG | HWSVR_DO_SHUTDOWN, + COALESCE_HOST = MBOX::FIRST_UNSECURE_MSG | + HWSVR_COALESCE_HOST, }; diff --git a/src/usr/initservice/istepdispatcher/istepdispatcher.C b/src/usr/initservice/istepdispatcher/istepdispatcher.C index 14416487d..e76fdc331 100644 --- a/src/usr/initservice/istepdispatcher/istepdispatcher.C +++ b/src/usr/initservice/istepdispatcher/istepdispatcher.C @@ -750,6 +750,7 @@ void IStepDispatcher::msgHndlr() { msg_t * pMsg = NULL; pMsg = msg_wait(iv_msgQ); + errlHndl_t l_errLog = NULL; switch(pMsg->type) { @@ -773,6 +774,26 @@ void IStepDispatcher::msgHndlr() TRACFCOMP(g_trac_initsvc, ERR_MRK"msgHndlr: Ignoring IStep msg in non-IStep mode!"); } break; + case COALESCE_HOST: + TRACFCOMP(g_trac_initsvc, INFO_MRK"msgHndlr: COALESCE_HOST"); + l_errLog = handleCoalesceHostMsg(); + if (l_errLog) + { + errlCommit(l_errLog, INITSVC_COMP_ID); + + // Send the message back as a response + pMsg->data[0] = HWSVR_MSG_ERROR; + } + else + { + pMsg->data[0] = HWSVR_MSG_SUCCESS; + } + + msg_respond(iv_msgQ, pMsg); + pMsg = NULL; + + break; + case SHUTDOWN: // Shutdown requested from Fsp TRACFCOMP(g_trac_initsvc, INFO_MRK"msgHndlr: SHUTDOWN"); @@ -1381,4 +1402,35 @@ void IStepDispatcher::getIstepInfo ( uint8_t & o_iStep, mutex_unlock( &iv_mutex ); } +// ---------------------------------------------------------------------------- +// IStepDispatcher::handleCoalesceHostMsg() +// ---------------------------------------------------------------------------- +errlHndl_t IStepDispatcher::handleCoalesceHostMsg() +{ + TRACFCOMP(g_trac_initsvc, ENTER_MRK"IStepDispatcher::handleCoalesceHostMsg"); + + // Ensure the library is loaded + errlHndl_t err = VFS::module_load("libestablish_system_smp.so"); + + if (err) + { + TRACFCOMP(g_trac_initsvc, "handleCoalesceHostMsg: Error loading module, PLID = 0x%x", + err->plid()); + } + else + { + err = ESTABLISH_SYSTEM_SMP::call_host_coalesce_host(); + if (err) + { + TRACFCOMP(g_trac_initsvc, "handleCoalesceHostMsg: Error with " + "call_host_coalese_host function LID = 0x%x", + err->plid()); + } + } + + TRACFCOMP( g_trac_initsvc, EXIT_MRK"IStepDispatcher::handleCoalesceHostMsg"); + + return err; +} + } // namespace diff --git a/src/usr/initservice/istepdispatcher/istepdispatcher.H b/src/usr/initservice/istepdispatcher/istepdispatcher.H index 64daf15d5..c3382fe3b 100644 --- a/src/usr/initservice/istepdispatcher/istepdispatcher.H +++ b/src/usr/initservice/istepdispatcher/istepdispatcher.H @@ -247,6 +247,15 @@ private: void handleProcFabIovalidMsg(msg_t * & io_pMsg); /** + * @brief Handles the CoalesceHost message. + * + * Executes the processing required for the host_coalesce_host istep + * + * @return errlHndl_t - the error log generated + */ + errlHndl_t handleCoalesceHostMsg(); + + /** * @brief Handles an IStepRequest message * * Executes the requested IStep and returns result in response message diff --git a/src/usr/mbox/ipcSp.C b/src/usr/mbox/ipcSp.C index 4fc7e120e..d53f4f171 100644 --- a/src/usr/mbox/ipcSp.C +++ b/src/usr/mbox/ipcSp.C @@ -5,7 +5,7 @@ /* */ /* IBM CONFIDENTIAL */ /* */ -/* COPYRIGHT International Business Machines Corp. 2013 */ +/* COPYRIGHT International Business Machines Corp. 2013,2014 */ /* */ /* p1 */ /* */ @@ -128,6 +128,20 @@ void IpcSp::msgHandler() break; + case IPC_TEST_CONNECTION: + + TRACFCOMP( g_trac_ipc, + "IPC received the test connection msg - %d:%d", + msg->data[0], msg->data[1] ); + + //Send a response to indicate the connection has been + //established + err = MBOX::send(MBOX::HB_COALESCE_MSGQ, msg, msg->data[1] ); + if (err) + { + errlCommit(err,IPC_COMP_ID); + } + break; default: TRACFCOMP( g_trac_ipc, |

