static uint32_t s_modeSel = 0U;
static uint8_t s_lmState[SM_NUM_LM];
static int32_t s_lmError[SM_NUM_LM];
static lmm_rst_rec_t s_lmBootReason[SM_NUM_LM];
static lmm_rst_rec_t s_lmShutdownReason[SM_NUM_LM];
static uint32_t s_cpuLm[SM_NUM_CPU];
/* Global variables */
const lmm_rst_rec_t g_swReason = DEV_SM_RST_REC_SW;
static const lmm_startstop_t s_lmmStart[SM_LM_NUM_START] =
{
SM_LM_START_DATA
};
static const lmm_startstop_t s_lmmStop[SM_LM_NUM_STOP] =
{
SM_LM_STOP_DATA
};
/* Local functions */
static int32_t LMM_DoBoot(lmm_rpc_trigger_t *trigger,
const lmm_rst_rec_t *bootRec);
static int32_t LMM_DoShutdown(lmm_rpc_trigger_t *trigger,
const lmm_rst_rec_t *shutdownRec);
static int32_t LM_ProcessStart(uint32_t lmId, uint32_t start, bool cpu);
static int32_t LM_ProcessStop(uint32_t lmId, uint32_t stop);
static int32_t LM_ClockStart(uint32_t lmId, uint32_t rsrc, uint32_t numArg,
const uint64_t *arg);
/*--------------------------------------------------------------------------*/
/* Init LMM system */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemInit(void)
{
int32_t status = SM_ERR_SUCCESS;
lmm_rst_rec_t bootRec, shutdownRec;
/* Get system reset reason */
LM_SystemReason(0U, &bootRec, &shutdownRec);
/* Default for SM LM */
s_lmBootReason[0] = bootRec;
s_lmShutdownReason[0] = shutdownRec;
/* Default for all LM */
for (uint32_t lmId = 0U; lmId < SM_NUM_LM; lmId++)
{
s_lmShutdownReason[lmId] = shutdownRec;
}
/* Return status */
return status;
}
/*--------------------------------------------------------------------------*/
/* Set mode select */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemModeSelSet(uint32_t mSel)
{
int32_t status = SM_ERR_SUCCESS;
/* Check mSel*/
if (mSel < SM_LM_NUM_MSEL)
{
s_modeSel = mSel;
/* Loop over stop list to map CPUs to LM */
for (uint32_t idx = 0U; idx < SM_LM_NUM_STOP; idx++)
{
if ((s_lmmStop[idx].mSel == s_modeSel)
&& (s_lmmStop[idx].ss == LMM_SS_CPU))
{
s_cpuLm[s_lmmStop[idx].rsrc] = s_lmmStop[idx].lmId;
}
}
}
else
{
status = SM_ERR_INVALID_PARAMETERS;
}
/* Return status */
return status;
}
/*--------------------------------------------------------------------------*/
/* Return reset reason name */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemReasonNameGet(uint32_t lmId, uint32_t resetReason,
string *reasonNameAddr, int32_t *len)
{
/* Just passthru to board/device */
return SM_SYSTEMREASONNAMEGET(resetReason, reasonNameAddr, len);
}
/*--------------------------------------------------------------------------*/
/* Complete system reset handling */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemRstComp(const lmm_rst_rec_t *resetRec)
{
int32_t status;
status = LMM_SystemReset(0U, 0U, false, resetRec);
/* Return status */
return status;
}