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.

[参考译文] AM6442:在 R5端启用 DDR ECC 以及 ESM 和自定义处理程序

Guru**** 2484615 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1437819/am6442-enabling-ddr-ecc-together-with-esm-and-custom-handlers-on-r5-side

器件型号:AM6442

工具与软件:

大家好、我已经检查了在 R5 SPL 中启用 DDR ECC 时它可以正常工作(如 本教程的第3.1.9.1.1.1点所示 、并在 u-boot 中使用  ddrss ecc_err 程序进行了测试)。

我想启用 DDR ECC、并在 R5中具有一个2个函数处理程序、当发生可纠正或不可纠正的错误时、ESM 模块将调用该函数处理程序 、如 DDR ECC 测试主 ESM 示例中所示:

esm1.$name                             = "CONFIG_ESM0";
esm1.bClearErrors                      = true;
esm1.esmNotifier.create(2);
esm1.esmNotifier[0].$name              = "CONFIG_ESM_NOTIFY0";
esm1.esmNotifier[0].errorNumber        = 6;
esm1.esmNotifier[0].setIntrPriorityLvl = "LOW";
esm1.esmNotifier[0].notify             = "DDR_secHandler";
esm1.esmNotifier[1].$name              = "CONFIG_ESM_NOTIFY1";
esm1.esmNotifier[1].errorNumber        = 69;
esm1.esmNotifier[1].notify             = "DDR_dedHandler";

在上述 syscfg 配置中、DDR_secHandler ()和  DDR_ddr_dedHandler ()分别被调用为可纠正和不可纠正的错误。

问题是尝试重复使用上述配置(在一起而不改变 R5 SPL)以及以下任一配置:

  1. Linux 内核加载(可能在加载 R5固件的瞬间)或
  2. 在仿真错误时、我遇到以下内核异常之一(为了仿真错误、我重复使用了从同一示例复制的函数):
    1. 堆栈空间不足、无法处理异常!
    2. 无法处理从虚拟地址 ffff000000000000处的不可执行内存执行的内核执行
    3. 无法处理虚拟地址 ffff800000a3ba38处只读内存的内核写入

在我们的架构中、我们在 A53上使用 Linux、在 R5端使用 FreeRTOS。

你知道我的错了吗? 有什么建议吗?

提前感谢您

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

    您好!

    SPL 引导流程  

    根据以上讨论、我假设您使用的是 SPL 引导流程(Linux SDK 中的默认引导流程)而不是 SBL 引导流程(MCU+ SDK 中的默认引导流程)。 有关这两个引导流程的更多资源、请参阅 AM64x Academy 的多核模块: https://dev.ti.com/tirex/explore/node?node=A__AbGt66xlJYuq-VIL-2YzSA__AM64-ACADEMY__WI1KRXP__LATEST 

    您可以在此处查看默认 SBL 引导流程:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/10_00_07_04/exports/docs/linux/Foundational_Components U-Boot/UG-General-Info.html#boot-flow

    请注意、R5F SPL 代码不会在运行时继续在 R5F0_0上运行。 代码结束、如果您希望运行时固件在 R5F0_0上运行、则需要从 uboot 或 linux remoteproc 将新代码加载到 R5F0_0中。 有关更多详细信息、请参阅上面的 AM64x Academy 链接。

    帮助我们了解 您的用例

    1) 1)何时以及如何加载要在 Linux 运行时运行的 R5F0_0代码?

    2) 2)是否希望每个 ECC 错误都报告给 R5F0_0、而不管哪个内核对 DDR 的访问会导致 ECC 错误? 您希望在报告错误后发生什么情况?

    此致、

    Nick

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

    您好、Nick、感谢您的回应。 要进行确认、是的、我使用 SPL 引导流程。

    1) Linux 启动时、会启动 Remoteproc 驱动程序、启动 R5固件。  我 只使用一个在其 r5fss0-0.syscfg 中定义了我在上面粘贴的配置片段的 R5内核。 内核会启动、但当我将(通过 R5代码) single-bit 错误或 double-bit 错误注入 DDR 存储器命令提示符时、该内核会挂起或获取内核异常。  

    2) 2)我希望 将每个 DDR 错误(无论 DDR 片段是否保留给 R5或 A53)报告给 R5中的回调、以便我可以通过 RPMsg 将该信息发送到 A53并将其保存到日志中。 如果发生 SEC、我希望 调用 DDR_secHandler、如果发生 DED、则 调用 DDR_dedHandler。

    我已经在 R5 SPL 中启用了 ECC、我看到了整个 DDR 存储器在启动期间开始运行的信息。 问题是、当我向 DDR 存储器注入错误时、不会调用回调。

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

    您好、Slawomir、

    有趣、还可以 首先、我会将您的线程发送给我们负责 MCU+中安全诊断库(SDL)的团队成员。 如果您在几个工作日内未收到回复、请随意 ping 该主题。

    此致、

    Nick

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

    您好、Nick、谢谢您、期待进一步的信息。

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

    您好、Nick。
    我想说我有一些进步,但这是不够的,我正在失去想法。 我注释了负责创建 SEC 和 DED esmNotifiers 的 SYSCONF 配置、并创建了一个任务、使用  DDR_getECCErrorInfo (&info)定期询问 MCU 的 DDR 驱动程序 API 函数有关 single-bit 和 double-bit 错误的信息。 当我注入一位错误时、我能够检测到并报告它。 问题在于双位错误、这会立即导致同步中止和电路板重新启动。 我尝试通过将此更改添加到 R5 SPL 器件树、将双位错误(它具有69个值)的事件重定向到 ESM 模块:

    main_esm: esm@420000 {
    		compatible = "ti,j721e-esm";
    		reg = <0x0 0x420000 0x0 0x1000>;
    		ti,esm-pins = <69>;
    		bootph-pre-ram;
    	};

    在双位错误注入后、不存在同步中止、但仍会重新启动电路板...

    您这边有什么信息吗?

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

    你好

    我想详细讨论此主题、因为我对 ECC 外设有类似的问题。  是否可以使用 ECC SDL API 检测 DDR 存储器的错误? 我想使用以下 API: https://software-dl.ti.com/processor-industrial-sw/esd/ind_comms_sdk/am64x/09_00_00_03/mcu_plus_sdk/docs/api_guide_am64x/group__SDL__ECC__AGGR__FUNCTION.html


    SDL_ECC_init 接受 SDL_ECC_MemType 的参数 、该参数描述了存储器类型。 按照 SDK 示例 sdl/ecc/am64x-evm/r5ss0-0_nortos 中的示例 、我找到了头文件、该文件介绍了许多存储器类型(source/sdl/include/am64x_am243x/sdlr_soc_ecc_aggr.h)、但其中没有与 DDR 存储器相关。

    BR、

    雅库布