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



# SM configuration file for the MX95 EVK

MAKE    soc=MIMX95, board=mcimx95evk, build=gcc_cross
DOX     name=MX95EVK, desc="i.MX95 EVK Configuration Data"

include ../devices/MIMX95/configtool/device.cfg

#==========================================================================#
# Board                                                                    #
#==========================================================================#

BOARD               DEBUG_UART_INSTANCE=2
BOARD               DEBUG_UART_BAUDRATE=115200

BOARD               I2C_INSTANCE=1
BOARD               I2C_BAUDRATE=400000

#==========================================================================#
# Common Defines                                                           #
#==========================================================================#

NOTIFY:             api=notify
GET:                api=get
SET:                api=set
PRIV:               api=priv
ALL:                api=all
READONLY:           perm=ro

#==========================================================================#
# ELE Domain                                                               #
#==========================================================================#

DOM0                name="ELE", did=0

OWNER:              perm=sec_rw, api=all
ACCESS:             perm=sec_rw, api=none, mdid=none
DATA:               perm=rw

# Resources

# Sharing MP access may not be safe if FuSa SW using EDMA2
EDMA2_MP            ACCESS
EDMA2_CH0_1         OWNER
V2X_ACC             OWNER

# Memory

M33_TCM_SYS         DATA, begin=0x020200000, size=256K
OCRAM               DATA, begin=0x020480000, size=352K
DDR                 DATA, begin=0x080000000, end=0x87FFFFFFF, nodbg

#==========================================================================#
# ISP Domain                                                               #
#==========================================================================#

DOM10               name="ISP", did=10

OWNER:              perm=rw

#==========================================================================#
# V2X Domain                                                               #
#==========================================================================#

DOM12               name="V2X", did=12

DFMT1:              sa=bypass, pa=bypass
OWNER:

# Resources

V2X_FH              OWNER

# Memory

DDR                 READONLY, begin=0x080000000, end=0x08AFFFFFF, nodbg
DDR                 DATA, begin=0x08B000000, end=0x08BFFFFFF, nodbg
DDR                 READONLY, begin=0x08C000000, end=0x87FFFFFFF, nodbg

#==========================================================================#
# SM M33 EENV                                                              #
#==========================================================================#

LM0                 name="SM", rpc=none, boot=1, did=2, safe=feenv

DFMT0:              sa=secure
DFMT1:              sa=secure, pa=privileged
OWNER:              perm=sec_rw, api=all
ACCESS:             perm=sec_rw, api=none, mdid=none
TEST_MU:            perm=sec_rw

EXEC:               perm=sec_rwx
DATA:               perm=sec_rw

MODE                msel=1, boot=1
MODE                msel=2, boot=1

#==========================================================================#
# M7 EENV                                                                  #
#==========================================================================#

LM1                 name="M7", rpc=scmi, boot=2, skip=1, did=4, safe=seenv

DFMT0:              sa=secure
DFMT1:              sa=secure, pa=privileged
OWNER:              perm=rw, api=all

EXEC:               perm=full
DATA:               perm=rw

# Start/Stop (mSel=0)

PD_M7               start=1, stop=2
CPU_M7P             start=2, stop=1

# Start/Stop (mSel=1)

MODE                msel=1, boot=2

PD_M7               msel=1, start=1, stop=2
CPU_M7P             msel=1, start=2, stop=1

# Start/Stop (mSel=2)

PD_M7               msel=2, start=1, stop=2
CPU_M7P             msel=2, start=2, stop=1

# RPC Interface

SCMI_AGENT0         name="M7"
MAILBOX             type=mu, mu=9, test=8, priority=high
CHANNEL             db=0, xport=smt, check=crc32, rpc=scmi, type=a2p, \
                    test=default
CHANNEL             db=1, xport=smt, check=crc32, rpc=scmi, \
                    type=p2a_notify, notify=24
CHANNEL             db=2, xport=smt, check=crc32, rpc=scmi, \
                    type=p2a_priority

#==========================================================================#
# A55 secure EENV                                                          #
#==========================================================================#

LM2                 name="AP", rpc=scmi, boot=3, skip=1, did=3, default

DFMT0:              sa=bypass
DFMT1:              sa=secure, pa=privileged
OWNER:              perm=sec_rw, api=all

EXEC:               perm=sec_rwx
DATA:               perm=sec_rw

# Start/Stop (mSel=0)

VOLT_ARM            start=1|1, stop=9
PD_A55P             start=2, stop=8, test
PD_A55C0            stop=7
PD_A55C1            stop=6
PD_A55C2            stop=5
PD_A55C3            stop=4
PD_A55C4            stop=3
PD_A55C5            stop=2
PERF_A55            start=3|3
CPU_A55C0           start=4
CPU_A55P            stop=1

# Start/Stop (mSel=1)

VOLT_ARM            msel=1, start=1|1, stop=9
PD_A55P             msel=1, start=2, stop=8
PD_A55C0            msel=1, stop=7
PD_A55C1            msel=1, stop=6
PD_A55C2            msel=1, stop=5
PD_A55C3            msel=1, stop=4
PD_A55C4            msel=1, stop=3
PD_A55C5            msel=1, stop=2
PERF_A55            msel=1, start=3|3
CPU_A55C0           msel=1, start=4
CPU_A55P            msel=1, stop=1

# Start/Stop (mSel=2)

VOLT_ARM            msel=2, start=1|1, stop=9
PD_A55P             msel=2, start=2, stop=8
PD_A55C0            msel=2, stop=7
PD_A55C1            msel=2, stop=6
PD_A55C2            msel=2, stop=5
PD_A55C3            msel=2, stop=4
PD_A55C4            msel=2, stop=3
PD_A55C5            msel=2, stop=2
PERF_A55            msel=2, start=3|3
CPU_A55C0           msel=2, start=4
CPU_A55P            msel=2, stop=1

# RPC Interface

SCMI_AGENT1         name="AP-S", secure
MAILBOX             type=mu, mu=1, test=0
CHANNEL             db=0, xport=smt, rpc=scmi, type=a2p
CHANNEL             db=1, xport=smt, rpc=scmi, type=p2a_notify

#==========================================================================#
# A55 non-secure EENV                                                      #
#==========================================================================#

DFMT0:              sa=nonsecure
DFMT1:              sa=nonsecure, pa=privileged

OWNER:              perm=rw, api=all
ACCESS:             perm=rw, api=all, mdid=none

EXEC:               perm=full
DATA:               perm=rw

# RPC Interface

SCMI_AGENT2         name="AP-NS"
MAILBOX             type=mu, mu=3, test=2
CHANNEL             db=0, xport=smt, rpc=scmi, type=a2p
CHANNEL             db=1, xport=smt, rpc=scmi, type=p2a_notify

Функция main system manager (M33)
int main(int argc, const char * const argv[])
{
    int32_t status = SM_ERR_SUCCESS;
    uint64_t delta;
    uint32_t mSel = 0U;

    /* Store boot start time */
    g_bootTime[SM_BT_START] = DEV_SM_Usec64Get();

    /* Init the system hardware */
    status = BRD_SM_Init(argc, argv, &mSel);

    /* Save start banner time */
    delta = DEV_SM_Usec64Get();

    /* Print banner */
    printf("\nHello from SM (Build %lu, Commit %08lx, %s %s)\n\n",
        SM_BUILD, SM_COMMIT, SM_DATE, SM_TIME);

    /* Add to subtract time */
    /* Intentional: used only for debug */
    /* coverity[cert_int30_c_violation] */
    g_bootTime[SM_BT_SUB] += (DEV_SM_Usec64Get() - delta);

    /* Init LMM */
    if (status == SM_ERR_SUCCESS)
    {
        /* mSel from BRD_SM_Init(), LMM_INIT_FLAGS from Makefile */
        status = LMM_Init(&mSel, LMM_INIT_FLAGS);
    }

#ifndef SIMU
    /* Start systick, disable boot WDOG */
    SM_SYSTICKENABLE();
#endif

    if (status == SM_ERR_SUCCESS)
    {
        /* Mark LMM inited */
        s_lmmInited = true;

        /* Boot LMs */
        status = LMM_Boot();
    }

    /* Post-boot cleanup */
    if (status == SM_ERR_SUCCESS)
    {
        status = LMM_PostBoot();
    }
...

    return status;
}

int32_t LMM_CpuInit(void)
{
    int32_t status = SM_ERR_SUCCESS;

    /* Loop over CPUs */
    for (uint32_t cpuId = 0U; cpuId < SM_NUM_CPU; cpuId++)
    {
        uint32_t mSel;
        uint32_t flags;

        /* Get boot data */
        if (DEV_SM_RomBootCpuGet(cpuId, &s_bootVector[cpuId], &mSel,
            &flags) == SM_ERR_SUCCESS)
        {
            /* Save ROM provided vector */
            s_bootFlags[cpuId] = true;
        }
        else
        {
            s_bootFlags[cpuId] = false;
        }
    }

    /* Return status */
    return status;
}

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;
}