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.

[参考译文] AM5K2E04:KeyStone II DDR3存储器控制器:如何测试 ECC 功能

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/923864/am5k2e04-keystone-ii-ddr3-memory-controller-how-to-test-the-ecc-feature

器件型号:AM5K2E04

尊敬的所有人:

我对 Keystone II 系列的 DDRAM ECC 功能有疑问(我们使用 AM5K2E04):

在文档"Keystone II 架构 DDR3存储器控制器-用户指南"中、我找到了启用/禁用此功能的方法。

但我想知道如何测试 ECC 的运行。 是否有任何方法可以将错误(1位/2位)注入 Keystone II 处理器的 DDR3?

谢谢。

此致、

胡伊

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

    您好、Huy、

    请参阅 U-Boot 用户指南中的"DDR3 ECC"部分、  

    http://software-dl.ti.com/processor-sdk-linux/esd/docs/latest/linux/Foundational_Components_U-Boot.html?highlight=ecc#ddr3-ecc

    雷克斯

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

    尊敬的 Rex:

    感谢您的回答。

    胡伊

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

    尊敬的 Rex:

    我对使用 U-Boot 的"DDR"命令注入1位错误时 ECC 的操作有疑问。

    ECC 在0x80000000 - 0xFFFF 范围内被启用 (ECC 地址范围1寄存器: 0x3fff0000)、 1位 ECC 错误中断被启用。

    整个存储器使用0x00000000模式进行初始化。

    然后、我尝试使用"DDR"命令注入1位错误。 我运行它3次、结果如下:

    第一次:

    # DDR ECC_ERR 0x8000000 0x1
    正在禁用 DDR ECC ...
    ECC 错误测试、addr 0x80000000、读取数据0x0、写入数据0x1、错误模式:0x1、 写入数据0x1后读取
    正在启用 DDR ECC...
    ECC 错误测试、地址0x8000000、读取数据0x1
    1位 ECC 错误计数:0x5
    1位 ECC 错误地址日志:0x39d17040

    第二次:

    # DDR ECC_ERR 0x8000000 0x1
    正在禁用 DDR ECC ...
    ECC 错误测试、addr 0x80000000、读取数据0x1、写入数据0x0、错误模式:0x1、 写入数据0x0后读取
    正在启用 DDR ECC...
    ECC 错误测试、地址0x8000000、读取数据0x0

    第三次:

    # DDR ECC_ERR 0x8000000 0x1
    正在禁用 DDR ECC ...
    ECC 错误测试、addr 0x80000000、读取数据0x0、写入数据0x1、错误模式:0x1、 写入数据0x1后读取
    正在启用 DDR ECC...
    ECC 错误测试、地址0x8000000、读取数据0x1
    1位 ECC 错误计数:0x4
    1位 ECC 错误地址日志:0x3ca48b00

    我的问题是:

    • 为什么这些测试之间的输出结果不同(第二个测试中没有1位 ECC 错误报告)?
    • 当有1位 ECC 错误报告时、我看到1位 ECC 错误计数和错误地址日志不同、原因是什么?
    • 我在 DDR3存储器控制器的文档中发现  、1位 ECC 错误地址日志寄存器中的值显示了2个深度地址记录 FIFO 中记录的第一个地址?  您能解释一下它的含义吗?  

    谢谢。

    此致、

    胡伊

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

    您好、Huy、

    我怀疑当您写入 DDR 时数据可能会发生变化、因为 ECC 首先被禁用。 修改 DDR 后、启用 ECC。 系统不知道您故意修改了存储器、因此认为这是错误。

    我不知道其他问题的答案。 我需要花时间进行一些读取。

    雷克斯

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

    尊敬的 Rex:

    感谢您的回答。 我在过去的几天里尝试测试 ECC 的运行。

    与上次不同、我已将 ECC 地址范围1寄存器的值设置为0x00010000 (ECC 覆盖范围为0x80000000 - 0x8003FFFF 的最小存储器区域)。 这样、我可以忽略不相关的错误、同时将 ECC 位错误注入 DDR。

    然后、我尝试 使用"DDR"命令在地址0x8000000处注入1位 ECC 错误。 但 ECC 似乎无法检测到错误、因此无法纠正错误。

    # DDR ECC_ERR 0x8000000 0x1

    您是否知道为什么 ECC 无法检测到错误? 或者、您是否有任何与 ECC 操作和"DDR"命令相关的示例?

    谢谢你。

    胡伊

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

    您好、 Huy、

    很抱歉、我一直很忙、还没有机会查看问题并阅读。 我在星期四举行了全天会议,我最早可以在星期五看一下。 我在开始后会再回来讨论这个问题。

    雷克斯

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

    您好、Huy、

    如何设置 ECC 地址范围1寄存器以及使用什么值对寄存器进行编程?

    雷克斯

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

    尊敬的 Rex:

    我发现 ECC 地址范围1寄存器可以通过以下方法设置(运行命令"DDR ECC_ERR")

    ")在 cmd_ddr3.c 文件中:

    静态 int dr_memory_ecc_err (u32 base、u32 address、u32 ecc_err);

    _raW_writel (ecc_start_ADDR1 |(ecc_end_ADDR1 << 16)、base + KS2_DDR3_ECC_ADDR_RANGE1_OFFSET);

    在原始源代码中、ECC_END_ADDR1定义如下:

    #define ECC_END_ADDR1 (((gd->start_addr_sp - DDR_remap_ADDR - CONFIG_STACKSIZE)>> 17)- 2)

    我不完全理解这一定义。 在这里使用堆栈指针的起始地址有什么用途?

    我的目的是为0x80000000 - 0x8003FFFF 的存储器启用 ECC。

    ECC_START_ADDR1仍然相同(0x8000000)

    ECC_END_ADDR1可定义为:

    #define ECC_END_ADDR1    ((0x8003FFFF - DDR_REMAP_ADDR)>> 17)

    我在这里犯了个错误吗?

    胡伊

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

    您好、Huy、

    在用户指南中、显示了 ECC 的33位地址。 您使用的是32位地址。

    雷克斯

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

    尊敬的 Rex:

    我已经考虑了这一点。 正如我提到过的、我要为0x0.8000.0000到0x0.8003.FFFF 的存储器区域启用 ECC

    因此、在本例中、ECC 地址范围的33位地址的起始地址和结束地址[32-17]仍然与32位相同、因为第33位为0。

    RAM 的基地址为0x8000.0000、因此在我的情况下、需要写入 ECC 地址范围1寄存器的值为0x00001.0000

    是这样吗?

    胡伊

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

    您好、Huy、

    您需要使用36位地址来计算起始地址和结束地址。 请参阅数据表中的 K2E 存储器映射。

    雷克斯

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

    尊敬的 Rex:

    我刚刚在 Linux 中写入了一个测试程序、而不是 uBoot、它可以立即确认 ECC 的操作(注入、正确检测1位错误)。

    寄存器的配置值没有问题。 稍后我将使用 uBoot 命令再次进行检查。

    总之、感谢您的支持。

    胡伊