/*--------------------------------------------------------------------------*/
/* Boot logical machines */
/* */
/* Note only call from main(). Cannot be called from an interrupt context. */
/*--------------------------------------------------------------------------*/
int32_t LMM_Boot(void)
{
int32_t status;
uint32_t mSel = s_mSel;
uint32_t lmmInitFlags = s_lmmInitFlags;
/* Default out of range mSel */
if (mSel >= SM_LM_NUM_MSEL)
{
mSel = 0U;
}
/* Inform LM system of mode select */
status = LMM_SystemModeSelSet(mSel);
/* Get starting system counter */
uint64_t startTime = DEV_SM_Usec64Get();
/* Boot LMs */
if ((status == SM_ERR_SUCCESS)
&& ((lmmInitFlags & LM_INIT_FLAGS_BOOT) != 0U))
{
/* Loop over boot order */
for (uint8_t bootOrder = 1U; bootOrder <= SM_NUM_LM; bootOrder++)
{
/* Loop over LMs */
for (uint32_t lmId = 0U; lmId < SM_NUM_LM; lmId++)
{
/* Boot if LM requested in this order */
if (g_lmmConfig[lmId].boot[mSel] == bootOrder)
{
uint64_t bootTime = startTime
+ ((uint64_t) g_lmmConfig[lmId].rtime);
/* Wait until start time */
while (DEV_SM_Usec64Get() < bootTime)
{
; /* Intentional empty while */
}
/* Record calling parms */
s_bootLm = lmId;
s_bootSkip = g_lmmConfig[lmId].bootSkip[mSel];
/* Trigger SWI handler */
SWI_Trigger();
/* Collect status */
status = s_bootStatus;
}
/* Exit loop on error */
if (status != SM_ERR_SUCCESS)
{
break;
}
}
/* Exit loop on error */
if (status != SM_ERR_SUCCESS)
{
break;
}
}
}
/* Return status */
return status;
}