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


#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include "sm.h"
#include "monitor.h"
#include "monitor_trdc.h"
#include "monitor_reg.h"
#include "dev_sm_api.h"

/* Defines */

/* Types */

/* Local Functions */

static void MONITOR_DisplayGlbac(uint32_t glbac);
static void MONITOR_DisplayBlkCfg(uint32_t mbc, uint32_t did, uint32_t mem,
    uint32_t addr, uint32_t nblks);
static void MONITOR_DumpRegion(uint32_t addr, uint32_t len);
static void MONITOR_DisplayErr(uint32_t rdcId, uint32_t did,
    uint32_t derrloc);
static void MONITOR_DisplayDErr(char rdcLabel, bool mrc, uint32_t inst,
    TRDC_DERR_Type *derr);
static int32_t MONITOR_TrdcNameToBase(const char *trdcName,
    uint32_t *trdcBase);

/* Local Variables */

/*--------------------------------------------------------------------------*/
/* TRDC command                                                             */
/*--------------------------------------------------------------------------*/
int32_t MONITOR_CmdTrdc(int32_t argc, const char * const argv[])
{
    int32_t status = SM_ERR_SUCCESS;
    uint32_t baseAddr;
    const TRDC_MGR_Type *mgr;
    uint32_t ldid = 0U, hdid = 15U;

    /* Parse argument */
    if (argc > 0)
    {
        status = MONITOR_TrdcNameToBase(argv[0], &baseAddr);

        if (argc > 1)
        {
            uint32_t did = 0U;

            errno = 0;
            did = strtoul(argv[1], NULL, 0);
            if (errno == 0)
            {
                ldid = did;
                hdid = did;
            }
        }
    }
    else
    {
        status = SM_ERR_MISSING_PARAMETERS;
    }

    /* Probe for access */
    if (status == SM_ERR_SUCCESS)
    {
        mgr = (TRDC_MGR_Type*) baseAddr;

        uint32_t v = 0U;
        uint32_t a = (uint32_t) &(mgr->TRDC_CR);

        if (SystemMemoryProbe((void*) a, &v, 32U) != 0U)
        {
            status = SM_ERR_POWER;
        }
    }

    /* Check DID range */
    if (status == SM_ERR_SUCCESS)
    {
        uint32_t ndid = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NDID_MASK)
            >> TRDC_TRDC_HWCFG0_NDID_SHIFT);

        if ((hdid < ldid) || (ldid >= ndid) || (hdid >= ndid))
        {
            status = SM_ERR_INVALID_PARAMETERS;
        }
    }

    /* Dump TRDC */
    if (status == SM_ERR_SUCCESS)
    {
        uint32_t v = 0U;
        uint32_t ndid = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NDID_MASK)
            >> TRDC_TRDC_HWCFG0_NDID_SHIFT);
        uint32_t nmstr = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMSTR_MASK)
            >> TRDC_TRDC_HWCFG0_NMSTR_SHIFT);
        uint32_t nmbc = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMBC_MASK)
            >> TRDC_TRDC_HWCFG0_NMBC_SHIFT);
        uint32_t nmrc = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMRC_MASK)
            >> TRDC_TRDC_HWCFG0_NMRC_SHIFT);
        uint32_t mid = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_MID_MASK)
            >> TRDC_TRDC_HWCFG0_MID_SHIFT);
        uint32_t did = ((mgr->TRDC_HWCFG1 & TRDC_TRDC_HWCFG1_DID_MASK)
            >> TRDC_TRDC_HWCFG1_DID_SHIFT);

        /* Tick wdog */
        BOARD_WdogRefresh();

        /* Display MGR info */
        printf("CR:      0x%08X\n", mgr->TRDC_CR);
        printf("HWCFG0:  0x%08X, MID=%u NMRC=%u NMBC=%u NMSTR=%u NDID=%u\n",
            mgr->TRDC_HWCFG0, mid, nmrc, nmbc, nmstr, ndid);
        printf("HWCFG1:  0x%08X, DID=%u\n",
            mgr->TRDC_HWCFG1, did);

        if (SystemMemoryProbe((void*) (uint32_t) &(mgr->TRDC_HWCFG2),
            &v, 32U) == 0U)
        {
            if (v != 0U)
            {
                printf("HWCFG2:  0x%08X, PIDPn[31-00]=0x%08X\n", v, v);
            }
        }

        if (SystemMemoryProbe((void*) (uint32_t) &(mgr->TRDC_HWCFG3),
            &v, 32U) == 0U)
        {
            if (v != 0U)
            {
                printf("HWCFG3:  0x%08X, PIDPn[63-32]=0x%08X\n", v, v);
            }
        }

        for (uint32_t mstr = 0U; mstr < nmstr; mstr++)
        {
            uint8_t ncm = ((mgr->DACFG[mstr] & TRDC_DACFG_NCM_MASK)
                >> TRDC_DACFG_NCM_SHIFT);
            uint8_t nmdar = ((mgr->DACFG[mstr] & TRDC_DACFG_NMDAR_MASK)
                >> TRDC_DACFG_NMDAR_SHIFT);

            /* Skip if not valid */
            if (nmdar == 0U) { continue; }

            printf("DACFG%u:  0x%02X, NCM=%u NMDAR=%u\n",
                mstr, mgr->DACFG[mstr], ncm, nmdar);
        }
        printf("IDAU_CR: 0x%08X\n", mgr->TRDC_IDAU_CR);
        printf("\n");

        /* Print DAC */
        for (uint32_t mstr = 0U; mstr < nmstr; mstr++)
        {
            uint8_t nmdar = ((mgr->DACFG[mstr] & TRDC_DACFG_NMDAR_MASK)
                >> TRDC_DACFG_NMDAR_SHIFT);

            for (uint32_t mdar = 0U; mdar < ((uint32_t) nmdar); mdar++)
            {
                uint32_t vld = ((mgr->MDA[mstr][mdar]
                    & TRDC_MDA_W_DFMT0_VLD_MASK)
                    >> TRDC_MDA_W_DFMT0_VLD_SHIFT);
                uint32_t lk1 = ((mgr->MDA[mstr][mdar]
                    & TRDC_MDA_W_DFMT0_LK1_MASK)
                    >> TRDC_MDA_W_DFMT0_LK1_SHIFT);
                uint32_t dfmt = ((mgr->MDA[mstr][mdar]
                    & TRDC_MDA_W_DFMT0_DFMT_MASK)
                    >> TRDC_MDA_W_DFMT0_DFMT_SHIFT);
                uint32_t kpa = ((mgr->MDA[mstr][mdar]
                    & 0x10000000U)
                    >> 28U);
                uint32_t sid = ((mgr->MDA[mstr][mdar]
                    & 0x0FC00000U)
                    >> 22U);

                /* Skip if not valid */
                if (vld == 0U) { continue; }

                printf("MDA_W%u_%u_DFMT%u: 0x%08X, VLD=%u",
                    mdar, mstr, dfmt, mgr->MDA[mstr][mdar], vld);
                if (lk1 != 0U)
                {
                    printf(" LK1=%u", lk1);
                }
                if (dfmt == 0U)
                {
                    uint32_t pe = ((mgr->MDA[mstr][mdar]
                        & TRDC_MDA_W_DFMT0_PE_MASK)
                        >> TRDC_MDA_W_DFMT0_PE_SHIFT);

                    if (pe != 0U)
                    {
                        printf(" PID=%u", (mgr->MDA[mstr][mdar]
                            & TRDC_MDA_W_DFMT0_PID_MASK)
                            >> TRDC_MDA_W_DFMT0_PID_SHIFT);
                        printf(", PIDM=%u", (mgr->MDA[mstr][mdar]
                            & TRDC_MDA_W_DFMT0_PIDM_MASK)
                            >> TRDC_MDA_W_DFMT0_PIDM_SHIFT);
                        printf(" PE=%u", (mgr->MDA[mstr][mdar]
                            & TRDC_MDA_W_DFMT0_PE_MASK)
                            >> TRDC_MDA_W_DFMT0_PE_SHIFT);
                    }
                    printf(" SA=%u", (mgr->MDA[mstr][mdar]
                        & TRDC_MDA_W_DFMT0_SA_MASK)
                        >> TRDC_MDA_W_DFMT0_SA_SHIFT);
                    printf(" DIDS=%u", (mgr->MDA[mstr][mdar]
                        & TRDC_MDA_W_DFMT0_DIDS_MASK)
                        >> TRDC_MDA_W_DFMT0_DIDS_SHIFT);
                }
                else
                {
                    printf(" DIDB=%u", (mgr->MDA[mstr][mdar]
                        & TRDC_MDA_W_DFMT1_DIDB_MASK)
                        >> TRDC_MDA_W_DFMT1_DIDB_SHIFT);
                    printf(" SA=%u", (mgr->MDA[mstr][mdar]
                        & TRDC_MDA_W_DFMT1_SA_MASK)
                        >> TRDC_MDA_W_DFMT1_SA_SHIFT);
                    printf(" PA=%u", (mgr->MDA[mstr][mdar]
                        & TRDC_MDA_W_DFMT1_PA_MASK)
                        >> TRDC_MDA_W_DFMT1_PA_SHIFT);
                }

                if (kpa != 0U)
                {
                    printf(" KPA=%u", kpa);
                }

                if (sid != 0U)
                {
                    printf(" SID=0x%02X", sid);
                }

                printf(" DID=%d\n", (mgr->MDA[mstr][mdar]
                    & TRDC_MDA_W_DFMT0_DID_MASK)
                    >> TRDC_MDA_W_DFMT0_DID_SHIFT);
            }
        }

        /* Print MBC */
        baseAddr += 0x10000U;
        for (uint32_t mbc = 0U; mbc < nmbc; mbc++)
        {
            TRDC_MBC_Type *base = (TRDC_MBC_Type*) baseAddr;
            uint32_t nblks[4];

            /* Tick wdog */
            BOARD_WdogRefresh();

            printf("\n");

            for (uint32_t mem = 0U; mem < 4U; mem++)
            {
                nblks[mem] = ((base->MEM[mem].GLBCFG
                    & TRDC_MBC_MEM_GLBCFG_NBLKS_MASK)
                    >> TRDC_MBC_MEM_GLBCFG_NBLKS_SHIFT);

                if (nblks[mem] != 0U)
                {
                    uint32_t size = ((base->MEM[mem].GLBCFG
                        & TRDC_MBC_MEM_GLBCFG_SIZE_LOG2_MASK)
                        >> TRDC_MBC_MEM_GLBCFG_SIZE_LOG2_SHIFT);

                    /* Calc size in kbytes */
                    size = (1UL << size) / 1024U;

                    printf("MBC%u_MEM%u_GLBCFG: 0x%08X", mbc, mem,
                        base->MEM[mem].GLBCFG);
                    printf(", SIZE=%uK", size);
                    printf(" NBLKS=%u\n", nblks[mem]);
                }
            }

            for (uint32_t ac = 0U; ac < 8U; ac++)
            {
                printf("MBC%u_MEMN_GLBAC%u: 0x%08X", mbc, ac,
                    base->GLBAC[ac]);
                MONITOR_DisplayGlbac(base->GLBAC[ac]);
            }

            for (uint32_t d = ldid; d <= hdid; d++)
            {
                /* Tick wdog */
                BOARD_WdogRefresh();

                MONITOR_DisplayBlkCfg(mbc, d, 0U, (uint32_t)
                    &(base->DOM[d].MEM0_BLK_CFG),
                    nblks[0]);

                for (uint32_t w = 0U; w < 16U; w++)
                {
                    if (nblks[0] > (w * 32U))
                    {
                        printf("MBC%u_DOM%u_MEM0_BLK_NSE_W%u:  ",
                            mbc, d, w);

                        if (d < 10U)
                        {
                            printf(" ");
                        }

                        printf("0x%08X\n",
                            base->DOM[d].MEM0_BLK_NSE[w]);
                    }
                }

                for (uint32_t mem = 1U; mem < 4U; mem++)
                {
                    MONITOR_DisplayBlkCfg(mbc, d, mem, (uint32_t)
                        &(base->DOM[d].MEM[mem - 1U].BLK_CFG),
                        nblks[mem]);

                    for (uint32_t w = 0U; w < 2U; w++)
                    {
                        if (nblks[mem] > (w * 32U))
                        {
                            printf("MBC%u_DOM%u_MEM%u_BLK_NSE_W%u:  ",
                                mbc, d, mem, w);

                            if (d < 10U)
                            {
                                printf(" ");
                            }

                            printf("0x%08X\n",
                                base->DOM[d].MEM[mem - 1U].BLK_NSE[w]);
                        }
                    }
                }
            }

            baseAddr += 0x2000U;
        }

        /* Print MRC */
        for (uint32_t mrc = 0U; mrc < nmrc; mrc++)
        {
            const TRDC_MRC_Type *base = (TRDC_MRC_Type*) baseAddr;

            /* Tick wdog */
            BOARD_WdogRefresh();

            printf("\n");

            uint32_t nrgns = ((base->GLBCFG
                & TRDC_MRC_GLBCFG_NRGNS_MASK)
                >> TRDC_MRC_GLBCFG_NRGNS_SHIFT);

            printf("MRC%u_GLBCFG: 0x%08X", mrc, base->GLBCFG);
            printf(", NRGNS=%u\n", nrgns);

            for (uint32_t ac = 0U; ac < 8U; ac++)
            {
                printf("MRC%u_MEMN_GLBAC%u: 0x%08X", mrc, ac,
                    base->GLBAC[ac]);
                MONITOR_DisplayGlbac(base->GLBAC[ac]);
            }

            for (uint32_t d = ldid; d <= hdid; d++)
            {
                /* Tick wdog */
                BOARD_WdogRefresh();

                for (uint32_t r = 0U; r < nrgns; r++)
                {
                    uint32_t w0 = base->DOM[d].RGN[r].W0;
                    uint32_t w1 = base->DOM[d].RGN[r].W1;

                    uint32_t vld = ((w1
                        & TRDC_MRC_DOM0_RGD_W_VLD_MASK)
                        >> TRDC_MRC_DOM0_RGD_W_VLD_SHIFT);

                    if (vld != 0U)
                    {
                        printf("MRC%u_DOM%u_RGD%u_W0: 0x%08X", mrc, d, r,
                            w0);
                        printf(", START_ADDR=0x%08X", (w0
                            & TRDC_MRC_DOM0_RGD_W_STRT_ADDR_MASK));
                        printf(", MRACSEL=%u\n", (w0
                            & TRDC_MRC_DOM0_RGD_W_MRACSEL_MASK)
                            >> TRDC_MRC_DOM0_RGD_W_MRACSEL_SHIFT);
                        printf("MRC%u_DOM%u_RGD%u_W1: 0x%08X", mrc, d, r,
                            w1);
                        printf(", END_ADDR=0x%08X", (w1
                            & TRDC_MRC_DOM0_RGD_W_END_ADDR_MASK)
                            | 0x3FFFU);
                        printf(", NSE=%u", (w1
                            & TRDC_MRC_DOM0_RGD_W_NSE_MASK)
                            >> TRDC_MRC_DOM0_RGD_W_NSE_SHIFT);
                        printf(", VLD=%u\n", vld);
                    }
                }
            }

            baseAddr += 0x1000U;
        }

    }

    return status;
}