summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/usr/hwpf/hwpf_reasoncodes.H5
-rw-r--r--src/include/usr/isteps/istep18list.H14
-rw-r--r--src/include/usr/mbox/ipc_msg_types.H3
-rw-r--r--src/include/usr/mbox/mbox_queues.H3
-rw-r--r--src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.C334
-rw-r--r--src/usr/hwpf/hwp/establish_system_smp/establish_system_smp.H15
-rw-r--r--src/usr/initservice/istepdispatcher/istep_mbox_msgs.H6
-rw-r--r--src/usr/initservice/istepdispatcher/istepdispatcher.C52
-rw-r--r--src/usr/initservice/istepdispatcher/istepdispatcher.H9
-rw-r--r--src/usr/mbox/ipcSp.C16
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,
OpenPOWER on IntegriCloud