/*--------------------------------------------------------------------------*/
/* Shutdown LM */
/*--------------------------------------------------------------------------*/
/* coverity[misra_c_2012_rule_17_2_violation] */
int32_t LMM_SystemLmShutdown(uint32_t lmId, uint32_t agentId,
uint32_t shutdownLm, bool graceful, const lmm_rst_rec_t *shutdownRec)
{
int32_t status = SM_ERR_SUCCESS;
/* Check LM */
if (shutdownLm >= SM_NUM_LM)
{
status = SM_ERR_NOT_FOUND;
}
/* Check LM state */
if ((status == SM_ERR_SUCCESS)
&& (s_lmState[shutdownLm] != LMM_STATE_LM_OFF))
{
lmm_rpc_trigger_t trigger =
{
.event = LMM_TRIGGER_SYSTEM,
.parm[0] = LMM_TRIGGER_PARM_LM_SHUTDOWN,
.parm[1] = agentId,
.parm[2] = shutdownLm,
.parm[3] = graceful ? 1U : 0U
};
/* Notify LM via system */
if (graceful || (lmId != shutdownLm))
{
(void) LMM_RpcNotificationTrigger(shutdownLm, &trigger);
}
/* Force shutdown? */
if (!graceful)
{
/* From LM */
trigger.parm[3] = lmId;
status = LMM_DoShutdown(&trigger, shutdownRec);
}
}
SM_TEST_MODE_ERR(SM_TEST_MODE_LMM_LVL1, SM_ERR_TEST)
/* Return status */
return status;
}
/*--------------------------------------------------------------------------*/
/* Reset LM */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemLmReset(uint32_t lmId, uint32_t agentId, uint32_t resetLm,
bool warm, bool graceful, const lmm_rst_rec_t *resetRec)
{
int32_t status = SM_ERR_SUCCESS;
/* Check LM */
if (resetLm >= SM_NUM_LM)
{
status = SM_ERR_NOT_FOUND;
}
if (status == SM_ERR_SUCCESS)
{
lmm_rpc_trigger_t trigger =
{
.rpcInst = 0U,
.event = LMM_TRIGGER_SYSTEM,
.parm[0] = LMM_TRIGGER_PARM_LM_COLD_RESET,
.parm[1] = agentId,
.parm[2] = resetLm,
.parm[3] = graceful ? 1U : 0U
};
/* Warm reset? */
if (warm)
{
trigger.parm[0] = LMM_TRIGGER_PARM_LM_WARM_RESET;
}
/* Notify LM via system */
if (graceful || (lmId != resetLm))
{
(void) LMM_RpcNotificationTrigger(resetLm, &trigger);
}
/* Force reset? */
if (!graceful)
{
/* From LM */
trigger.parm[3] = lmId;
/* Shutdown LM */
status = LMM_DoShutdown(&trigger, resetRec);
/* Boot the LM */
if (status == SM_ERR_SUCCESS)
{
status = LMM_DoBoot(&trigger, resetRec);
}
}
}
SM_TEST_MODE_ERR(SM_TEST_MODE_LMM_LVL1, SM_ERR_TEST)
/* Return status */
return status;
}