This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] J721EXCPXEVM:DRA829 4GB DDR 内联 ECC 启用

Guru**** 2903660 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1647590/j721excpxevm-dra829-4gb-ddr-inline-ecc-enablement

器件型号: J721EXCPXEVM
Thread: DRA829 中讨论的其他器件

尊敬的 TI 团队:

我当前在使用 DRA829 器件时遇到问题。

我的系统配置了 4GB DDR 内存、我需要使用 MSMC2DDR 桥接内联 ECC 功能启用 DDR ECC。

从 SoC 的角度来看、DDR 地址空间分为两个区域:

  • 低 DDR 区域:

0x80000000 ~ 0xFFFFFFFF
  • 高 DDR 区域:

0x880000000 ~ 0x8FFFFFFFF

目前、我能够在 C7x 内核的下部 2GB DDR 地址区域内成功注入和触发 ECC 错误。

但是、我无法在上部 2GB DDR 地址区域内触发 ECC 错误。

您能解释一下为什么会发生这种情况吗?

非常感谢您的支持。

 

我的 ECC 配置如下、我已经使用 UDMA 初始化 DDR 存储器空间、
并保留 1/9 的 DDR 空间用于 ECC 奇偶校验存储:

image.png

 

用于在 C7x 内核上的高 DDR 地址区域触发 ECC 错误的代码如下所示:

{

    volatile uint64_t *gTest_Addr = NULL;
    volatile uint64_t testVal;
    volatile uint64_t testVal2;
    volatile uint64_t *translatedMemPtr;

    /* Clear any residual ECC errors */
    DDR_clearAllECCError();

    /* Inject error */
    gTest_Addr = (uint64_t *) ((0x880000000));

    /* Write back any pending writes */
    CacheP_wbInv ((void *)gTest_Addr, 4);

    /* Read value from test location */
    testVal = gTest_Addr[0];

    /* Flip one bit to introduce error */
    testVal2 = testVal ^ 0x00010000u;

    /* Calculate translated address */
    translatedMemPtr = (volatile uint64_t *)(DDRGetTranslatedAddress((uintptr_t)gTest_Addr));

    /* Generating a 1b ECC error */
    /* NOTE: The following section should NOT be useed in actual application */
    /* ================================================================================ */

    /* Temporarily disable ECC */
    CSL_emifDisableECC ((CSL_emif_sscfgRegs *)CSL_COMPUTE_CLUSTER0_SS_CFG_BASE);

    /* Now corrupt the value */
    *(translatedMemPtr) = testVal2;
    CacheP_wbInv ((void *)translatedMemPtr, 4);

    /* Enable back ECC */
    CSL_emifEnableECC ((CSL_emif_sscfgRegs *)CSL_COMPUTE_CLUSTER0_SS_CFG_BASE);

    /* ================================================================================ */

    /* Invalidate cache */
    CacheP_Inv ((void *)gTest_Addr, 4);

    /* Read value to trigger error */
    testVal2 = gTest_Addr[0];

}

#define EMIF_ECC_MEM_BLOCK_SIZE       0x200
#define EMIF_ECC_DATA_SIZE_PER_BLOCK  0x40
uintptr_t DDRGetTranslatedAddress(uintptr_t memAddress)
{
    uint64_t memIndex;
    uintptr_t translatedMemAddr;

 

    memIndex = (memAddress-0x880000000u)/EMIF_ECC_MEM_BLOCK_SIZE;
    if ((memIndex & 0x1u) == 0)
    {
        translatedMemAddr = memAddress + ((memIndex)*EMIF_ECC_DATA_SIZE_PER_BLOCK);
    }
    else
    {
        translatedMemAddr = memAddress + ((memIndex+1u)*EMIF_ECC_DATA_SIZE_PER_BLOCK);
    }
    return  translatedMemAddr;
}

您能告诉我、我的过程或配置是否有问题吗?