Загрузка данных


/*--------------------------------------------------------------------------*/
/* Return LM status                                                         */
/*--------------------------------------------------------------------------*/
int32_t LM_SystemLmStatus(uint32_t lmId, uint32_t stateLm, uint32_t *state,
    int32_t *errStatus)
{
    int32_t status = SM_ERR_SUCCESS;

    /* Check LM */
    if (stateLm >= SM_NUM_LM)
    {
        status = SM_ERR_NOT_FOUND;
    }
    else
    {
        /* Return info */
        *state = (uint32_t) s_lmState[stateLm];
        *errStatus = s_lmError[stateLm];
    }

    // cppcheck-suppress unknownMacro
    SM_TEST_MODE_EXEC(SM_TEST_MODE_LMM_ALT1, *errStatus = SM_ERR_TEST)
    SM_TEST_MODE_ERR(SM_TEST_MODE_LMM_LVL1, SM_ERR_TEST)

    /* Return status */
    return status;
}

/*--------------------------------------------------------------------------*/
/* Check if an LM can be booted                                             */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemLmCheck(uint32_t bootLm)
{
    int32_t status = SM_ERR_SUCCESS;
    uint32_t idx = g_lmmConfig[bootLm].start - 1U;

    /* Loop over start list */
    while (idx < SM_LM_NUM_START)
    {
        const lmm_startstop_t *ptr = &s_lmmStart[idx];

        /* End for this LM */
        if (ptr->lmId != bootLm)
        {
            break;
        }

        /* CPU command for this mSel? */
        if ((ptr->mSel == s_modeSel) && (ptr->ss == LMM_SS_CPU))
        {
            /* Check vector */
            status = LMM_CpuBootCheck(ptr->lmId, ptr->rsrc);

            /* Translate and exit */
            if (status != SM_ERR_SUCCESS)
            {
                status = SM_ERR_MISSING_PARAMETERS;
                break;
            }
        }

        /* Next entry */
        idx++;
    }

    SM_TEST_MODE_ERR(SM_TEST_MODE_LMM_LVL1, SM_ERR_TEST)

    /* Return status */
    return status;
}

/*--------------------------------------------------------------------------*/
/* Check if a CPU is started when an LM boots                               */
/*--------------------------------------------------------------------------*/
bool LM_CpuCheck(uint32_t lmId, uint32_t cpuId)
{
    bool rtn = false;
    uint32_t idx = g_lmmConfig[lmId].start - 1U;

    /* Loop over start list to check for CPU */
    while ((!rtn) && (idx < SM_LM_NUM_START))
    {
        const lmm_startstop_t *ptr = &s_lmmStart[idx];

        /* End for this LM? */
        if (ptr->lmId != lmId)
        {
            break;
        }

        /* For this mode? */
        if (ptr->mSel == s_modeSel)
        {
            /* Process start command */
            if ((ptr->ss == LMM_SS_CPU) && (ptr->rsrc == cpuId))
            {
                rtn = true;
            }
        }

        /* Next entry */
        idx++;
    }

    /* Return state */
    return rtn;
}

/*--------------------------------------------------------------------------*/
/* Power on LM                                                              */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemLmPowerOn(uint32_t lmId, uint32_t agentId, uint32_t pwrLm)
{
    int32_t status = SM_ERR_SUCCESS;

    if (s_lmState[pwrLm] == LMM_STATE_LM_OFF)
    {
        /* Start resources minus CPU starts */
        if (g_lmmConfig[pwrLm].start != 0U)
        {
            status = LM_ProcessStart(pwrLm,
                g_lmmConfig[pwrLm].start - 1U, false);
        }

        if (status == SM_ERR_SUCCESS)
        {
            /* Record state */
            s_lmState[pwrLm] = LMM_STATE_LM_POWERED;
        }

        /* Record status */
        s_lmError[pwrLm] = status;
    }

    SM_TEST_MODE_ERR(SM_TEST_MODE_LMM_LVL1, SM_ERR_TEST)

    /* Return status */
    return status;
}

/*--------------------------------------------------------------------------*/
/* Boot LM                                                                  */
/*--------------------------------------------------------------------------*/
int32_t LMM_SystemLmBoot(uint32_t lmId, uint32_t agentId, uint32_t bootLm,
    const lmm_rst_rec_t *bootRec)
{
    int32_t status;
    lmm_rpc_trigger_t trigger =
    {
        .event = LMM_TRIGGER_SYSTEM,
        .parm[0] = LMM_TRIGGER_PARM_LM_BOOT,
        .parm[1] = agentId,
        .parm[2] = bootLm,
        .parm[3] = lmId
    };

    /* Check LM */
    status = LMM_SystemLmCheck(bootLm);

    /* Boot LM */
    if (status == SM_ERR_SUCCESS)
    {
        status = LMM_DoBoot(&trigger, bootRec);
    }
    else
    {
        s_lmError[bootLm] = status;
    }

    SM_TEST_MODE_ERR(SM_TEST_MODE_LMM_LVL1, SM_ERR_TEST)

    /* Return status */
    return status;
}