/*--------------------------------------------------------------------------*/
/* Full system wake */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemWake(uint32_t lmId, uint32_t agentId)
{
int32_t status = SM_ERR_SUCCESS;
lmm_rpc_trigger_t trigger =
{
.rpcInst = 0U,
.event = LMM_TRIGGER_SYSTEM,
.parm[0] = LMM_TRIGGER_PARM_WAKE,
.parm[1] = agentId,
.parm[2] = 0U,
.parm[3] = 1U
};
/* Notify LMs via system */
for (uint32_t dstLm = 0U; dstLm < SM_NUM_LM; dstLm++)
{
(void) LMM_RpcNotificationTrigger(dstLm, &trigger);
}
SM_TEST_MODE_ERR(SM_TEST_MODE_LMM_LVL1, SM_ERR_TEST)
/* Return status */
return status;
}
/*--------------------------------------------------------------------------*/
/* Return system reset (shutdown/boot) reason */
/*--------------------------------------------------------------------------*/
void LM_SystemReason(uint32_t lmId, lmm_rst_rec_t *bootRec,
lmm_rst_rec_t *shutdownRec)
{
int32_t status;
uint32_t flags;
/* Get system shutdown reason */
DEV_SM_SystemShutdownRecGet(shutdownRec);
/* Valid record? */
if (shutdownRec->valid)
{
/* Reset */
*bootRec = *shutdownRec;
}
else
{
lmm_rst_rec_t br = DEV_SM_RST_REC_POR;
/* POR */
*bootRec = br;
}
/* Get BBM status */
status = SM_BBMGETBOOTSTATUS(&flags);
/* Update boot record */
if (status == SM_ERR_SUCCESS)
{
/* Added to improve the test coverage */
SM_TEST_MODE_EXEC(SM_TEST_MODE_EXEC_LVL1,
flags = DEV_SM_BBM_BOOT_BUTTON);
if ((flags & (DEV_SM_BBM_BOOT_BUTTON | DEV_SM_BBM_BOOT_ALARM
| DEV_SM_BBM_BOOT_ROLLOVER)) != 0U)
{
lmm_rst_rec_t bbmRec = DEV_SM_RST_REC_BBM;
*bootRec = bbmRec;
bootRec->errId = flags;
bootRec->validErr = true;
}
}
}
/*--------------------------------------------------------------------------*/
/* Set system sleep mode */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemSleepModeSet(uint32_t lmId, uint32_t sleepMode,
uint32_t sleepFlags)
{
int32_t status = SM_ERR_SUCCESS;
/* Check LM */
if (lmId >= SM_NUM_LM)
{
status = SM_ERR_NOT_FOUND;
}
else
{
static uint32_t s_sleepMode[SM_NUM_LM] = { 0 };
static uint32_t s_sleepFlags[SM_NUM_LM] = { 0 };
uint32_t newMode = 0U;
uint32_t newFlags = 0U;
/* Record new sleep mode/flags */
s_sleepMode[lmId] = sleepMode;
s_sleepFlags[lmId] = sleepFlags;
/* Aggregate sleep mode/flags */
for (uint32_t lm = 0U; lm < SM_NUM_LM; lm++)
{
newMode = MAX(newMode, s_sleepMode[lm]);
newFlags |= s_sleepFlags[lm];
}
/* Inform device of sleep mode/flags */
SM_SYSTEMSLEEPMODESET(newMode, newFlags);
}
SM_TEST_MODE_ERR(SM_TEST_MODE_LMM_LVL1, SM_ERR_TEST)
/* Return status */
return status;
}