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.

[参考译文] SK-AM62A-LP:Linux:器件树:为器件管理器保留的内存?

Guru**** 2445440 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1546690/sk-am62a-lp-linux-device-tree-reserved-memory-for-device-manager

器件型号:SK-AM62A-LP


工具/软件:

我想知道设备管理器二进制文件和/或其工作空间是否应有一些保留内存。  查看 EVM 的 FIT 映像和器件树、我可以看到 ATF 加载到 0x9e780000、并 为其保留了 0x80000 字节。

tispl.bin:

 图像 0 (ATF)
 说明: ARM 可信固件
 创建时间:   2024 年 3 月 19 日星期二 15:31:40
 类型:      可以正常运行
 压缩: 未压缩
 数据大小:  54676 字节= 53.39KiB = 0.05 MIB
 架构:AArch64
 操作系统:       Arm Trusted Firmware
 加载地址:0x9e780000

k3-am62a7-sk.dts:

    “SECURE_TFA_DDR:TFA@9e780000{
      REG =<0x00 0x9e780000 0x00 0x80000>;
      对齐=<0x1000>;
      无映射;
    };“

OPTEE 还具有 0x01800000 字节的保留内存。

tispl.bin:

 图像 1 (TEE)
 描述: OPTEE
 创建时间:   2024 年 3 月 19 日星期二 15:31:40
 类型:      可信执行环境映像
 压缩: 未压缩
 数据大小:  480252 字节= 469.00KiB = 0.46MIB

k3-am62a7-sk.dts:

    SECURE_DDR:optee@9e800000{
      REG =<0x00 0x9e800000 0x00 0x01800000>;/*对于 OP-TEE */
      对齐=<0x1000>;
      无映射;
    };

但是、器件管理器/R5 部分不对齐。  假设器件使用 R5 SRAM 或  wkup_r5fss0_core0_memory_region 作为其工作区域、是否应该有一个至少可表示 DM 加载位置和大小的保留存储器段?

tispl.bin:

 图像 5 (dm)
 描述: DM 二进制
 创建时间:   2024 年 3 月 19 日星期二 15:31:40
 类型:      可以正常运行
 压缩: 未压缩
 数据大小:  509036 字节= 497.11KiB = 0.49 MIB
 建筑:未知建筑
 操作系统:       未知的操作系统
 加载地址:0x89000000

k3-am62a7-sk.dts:

    wkup_r5fss0_core0_dma_memory_region:r5f-dma-memory@9c800000{
      compatible =“shared-dma-pool";“;
      REG =<0x00 0x9c800000 0x00 0x10000>;
      无映射;
    };

    wkup_r5fss0_core0_memory_region:r5f-dma-memory@9c900000{
      compatible =“shared-dma-pool";“;
      REG =<0x00 0x9c900000 0x00 0x01e00000>;
      无映射;
    };

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

    您好 Jason、

    您走在正确的轨道上。

    Linux 器件树文件中的 wkup_r5fss0_core0_*存储器区域适用于 DM R5F。 如果在 DM R5F 上运行代码、需要使用 RPMsg 与 Linux 进行通信、则为 RPMsg virtio 缓冲区分配 1MB。 0x1e0_0000 大小的分配用于我们期望看到存储了设备管理器代码。

    有关更多详细信息、请参阅 AM62Ax Academy:
    多核>内存>如何分配内存
    https://dev.ti.com/tirex/explore/node?node=A__AZVZJv4-HUUgYw7e1iCjsg__AM62A-ACADEMY__WeZ9SsL__LATEST 

    由于您使用的是 AM62Ax、因此您可能使用固件构建器中提供的 VPAC/ISP 代码。 但为简单起见、我们来看看其他 AM62 系列器件默认使用的 ipc_rpmsg_echo_linux 示例:
    https://github.com/TexasInstruments/mcupsdk-core-k3/tree/k3_main/examples/drivers/ipc/ipc_rpmsg_echo_linux

    如果我们检查 AM62Ax DM R5F 的 linker.cmd 文件、那么我们应该会看到程序数据放置在内存区域中的 0x9C90_0000:
    https://github.com/TexasInstruments/mcupsdk-core-k3/blob/k3_main/examples/drivers/ipc/ipc_rpmsg_echo_linux/am62ax-sk/r5fss0-0_freertos/ti-arm-clang/linker.cmd

    这就是我们看到的:

        // reordered so that it is easier to map to 0x9C90_0000 + 0x1e0_0000
        
        DDR_IPC_RESOURCE_TABLE_LINUX: ORIGIN = 0x9C900000 LENGTH = 0x400    /* For resource table   */
        DDR_IPC_TRACE_LINUX         : ORIGIN = 0x9C900400 LENGTH = 0xFFC00  /* IPC trace buffer     */
            /* DDR for DM LPM data [ size 640.00 KB ] */
        DDR_LPM_DATA    (RWIX)      : ORIGIN = 0x9CA00000 LENGTH = 0x000A0000
        /* DDR for DM R5F code/data [ size 27 MiB + 384 KB ] */
        DDR                         : ORIGIN = 0x9CAA0000 LENGTH = 0x1B60000

    固件构建器代码应具有类似的内存分配。

    此致、

    Nick

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

    我看到了 wkup_r5fss0_core0_*保留存储器部分如何涵盖 IPC + DM 的工作区域、但我缺失的部分是如何  保护通过 tispl.bin FIT 映像加载到地址 0x8900000 的二进制文件。  从 Academy 链接:

    注释

    远程内核使用的任何 DDR 或 SRAM 区域仍必须在 Linux 器件树中保留、以防止 Linux 覆盖数据。

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

    嗯、还可以。 让我们谈谈引导期间不同时间点的存储器使用情况。

    摘要

    我预计应在加载 DM R5F 时使用 0x8900_0000、而不是在 DM R5F 实际运行时使用

    更多详细信息

    当 SPL 运行时、尚未加载 Linux 文件系统。 因此、当 SPL 加载 DM R5F 固件时、它不能直接访问存储在正常文件系统结构中的“正常“文件。

    我将以 uboot rproc 驱动程序(remoteproc 的 uboot 版本)为例、因为我预计它的工作方式与 DM R5F 负载类似。

    如果您想了解有关加载非 DM R5F 内核的不同方法的更多信息、请参阅 AM62Ax Academy:
    多核>引导>初始化远程内核的方法
    https://dev.ti.com/tirex/explore/node?node=A__AWpHX3tkZpsGgP46fOsCQQ__AM62A-ACADEMY__WeZ9SsL__LATEST

    我们使用 uboot rproc 命令初始化非 Linux 内核的子系统、加载固件、然后启动内核:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM62AX/10_01_00/exports/docs/linux/Foundational_Components /U-Boot/UG-RemoteProc.html

    但是、您会注意到示例文档中的中间步骤:
    =>加载 MMC 1:2 0x90000000 /lib/firmware/j7-main-r5f0_0-fw
    在 112ms 内读取 2536540 字节 (21.6 MiB/s)
    => rproc load 2 0x90000000 0x${filesize}
    加载带有数据@addr=0x90000000 2536540 字节的远程处理器 2:成功!

    该 DDR 地址在 Linux 运行时期间实际上没有使用。 我们只需要将二进制文件加载到内核中。 因此、我们首先将文件加载到 DDR 存储器中、然后将二进制文件从 DDR 复制到处理器中。 加载处理器内核后、可以覆盖和重复使用 DDR 的这一部分。

    此致、

    Nick

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

    现在我看到 FIT 映像中的 DM 固件是 ELF 二进制文件。  SPL U-Boot 首先将其 加载到 DDR 的 0x8900000 处、然后使用 ELF 标头将其加载到 R5 的 TCM 中。  DM 固件似乎使用 wkup_r5fss0_core0_*作为其工作区域。

    跟进问题。   ipc_rpmsg_echo_linux 通常用作默认或通用 DM 固件。  是否有独立且不包含 IPC 示例的 DM 固件?

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

    您好 Jason、

    是的、我们的大多数 MCU+示例实际上都可以为 DM R5F 构建、包括空工程。 让我为您提供一些额外的指导:

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

    顺便说一下、今天晚些时候、我将发布一条客户警报、说明 在 SDK 10.1 及更早版本中使用 ipc_rpmsg_echo_Linux DM R5F 工程时可能发生的 DM R5F 崩溃。 如果我没有将您链接到星期一提供的警报和相关常见问题解答、请对我执行 Ping 操作。

    我将附上一些文件草稿。 我不确定是否想将其链接到常见问题解答、因为它涉及安装和使用 MCU+ SDK、这可能会让仅 Linux 的客户感到困惑。 如果您认为将此信息链接给其他客户也有帮助、请告诉我。

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

    如果客户希望 DM 任务是在 DM R5F 内核上运行的唯一代码、该怎么办?

    删除处理器上运行的任何未使用代码可视为最佳做法。 但是、如果客户要将 MCU+ SDK 的 ipc_rpmsg_echo_linux 工程替换  空工程 (即,只有  DM 任务,没有其他任务在运行)、则需要记住一些事项

    不要将垃圾数据传递给 Linux 驱动程序

    默认情况下、在这些处理器的 Linux 器件树文件中定义 DM R5F 内核。 这意味着 Linux Remoteproc 驱动程序将尝试读取 DM R5F 的 DDR 存储器分配中的“资源表“数据。

    如果加载了 ipc_rpmsg_echo_linux 工程、则会在 DDR 中填充资源表。  

    但是、空工程在编写时并未考虑 Linux。 这意味着资源表不会放置在 DDR 中。 因此、Linux Remoteproc 驱动程序读取的内存区域将处于未初始化状态。 DDR 存储器未初始化为设定值、因此这个未初始化的存储器区域将用随机 1 和 0 填充。

    如果 Linux Remoteproc 驱动程序读取随机数据、则其行为方式可能出乎意料。 因此、如果我们改为使用空工程、则必须确保 Linux 不会读取随机数据。

    选项 1:从 Linux 器件树中删除 DM R5F 器件树节点   

    使用此选项时、我们会阻止 Linux Remoteproc 和 RPMsg 驱动程序尝试与 DM R5F 进行交互。 Linux 驱动程序和 DM 任务之间的所有 TI-SCI 通信都将继续照常工作。

    下面提供了一个示例:

    e2e.ti.com/.../3463.0001_2D00_SITSW_2D00_6185_2D00_Remove_2D00_DM_2D00_R5F_2D00_node_2D00_from_2D00_Linux_2D00_devicetree.patch

    请注意、DM R5F 的存储器区域仍应在 Linux 器件树中定义、以防止 Linux 覆盖 DM R5F 数据。 可以删除用于与 DM R5F 进行 RPMsg 通信的 1MByte virtio 区域。

    选项 2:将资源表区域初始化为已知值  

    如果要修改 DM R5F 工程而不是 Linux 器件树文件、则可以选择另一个选项。 如果您可以保证 DDR 的 DM R5F 资源表区域始终填充 0、则可以保证 Linux Remoteproc 驱动程序的运行方式始终相同。

    以下是实现此目的的一种方法:

    diff --git a/examples/empty/am62px-sk/wkup-r5fss0-0_freertos/ti-arm-clang/linker.cmd b/examples/empty/am62px-sk/wkup-r5fss0-0_freertos/ti-arm-clang/linker.cmd
    index 1e27ee9..b29f55a 100644
    --- a/examples/empty/am62px-sk/wkup-r5fss0-0_freertos/ti-arm-clang/linker.cmd
    +++ b/examples/empty/am62px-sk/wkup-r5fss0-0_freertos/ti-arm-clang/linker.cmd
    @@ -61,6 +61,11 @@ SECTIONS
             .text:abort: palign(8) /* this helps in loading symbols when using XIP mode */
         } load = R5F_TCMB, run = R5F_TCMA
    
    +    GROUP {
    +        /* create a hole and fill it with 0x00000000 */
    +        .resource_table: fill = 0x00000000 { .+= 0x0400; } palign(1024)
    +    } > DDR_RESOURCE_TABLE
    +
         .lpm_data (NOLOAD)      : {} align(4)       > DDR_LPM_DATA
         .text                   : {} palign(8)      > DDR
         .const                  : {} palign(8)      > DDR
    @@ -161,6 +166,11 @@ MEMORY
    
         WKUP_SRAM_TRACE_BUFF (RWIX) : ORIGIN = 0x41880000 LENGTH = 0x0000800
    
    +    /*
    +     * Fill the resource table region with zeros so Linux remoteproc driver does
    +     * not read garbage data.
    +     */
    +    DDR_RESOURCE_TABLE          : ORIGIN = 0x9C900000, LENGTH = 0x400
         /* DDR for DM LPM data [ size 640.00 KB ] */
         DDR_LPM_DATA    (RWIX)      : ORIGIN = 0x9CA00000 LENGTH = 0x000A0000
         /* DDR for DM R5F code/data [ size 27MiB + 416 KB ] */
    

    以下是 Linux 如何使用随机资源表值行为的示例:

    [    7.562659] platform 78000000.r5f: R5F core may have been powered on by a different host, programmed state (0) != actual state (1)
    [    7.593146] platform 78000000.r5f: configured R5F for IPC-only mode
    [    7.625007] platform 78000000.r5f: assigned reserved memory node r5f-dma-memory@9c800000
    [    7.681768] remoteproc remoteproc1: 78000000.r5f is available
    [    7.691070] remoteproc remoteproc1: attaching to 78000000.r5f
    [    7.698364] remoteproc remoteproc1: rsc table is truncated
    [    7.704812] remoteproc remoteproc1: Failed to process resources: -22
    [    7.773275] k3_r5_rproc bus@f0000:bus@b00000:r5fss@78000000: rproc_add failed, ret = -22
    [    7.783217] k3_r5_rproc bus@f0000:bus@b00000:r5fss@78000000: k3_r5_cluster_rproc_init failed, ret = -22
    [    7.793242] k3_r5_rproc: probe of bus@f0000:bus@b00000:r5fss@78000000 failed with error -22
    [    7.886106] remoteproc remoteproc1: releasing 78000000.r5f 

    下面是 Linux 在使用用零填充的资源表区域时的行为方式:

    [    7.455715] platform 78000000.r5f: R5F core may have been powered on by a different host, programmed state (0) != actual state (1)
    [    7.456773] platform 78000000.r5f: configured R5F for IPC-only mode
    [    7.456873] platform 78000000.r5f: assigned reserved memory node r5f-dma-memory@9c800000
    [    7.457671] remoteproc remoteproc1: 78000000.r5f is available
    [    7.457779] remoteproc remoteproc1: attaching to 78000000.r5f
    [    7.457792] remoteproc remoteproc1: remote processor 78000000.r5f is now attached 

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

    有关潜在 DM R5F 崩溃的客户警报如下:
    【常见问题解答】【警报】DM R5F 在某些情况下可能会崩溃:AM62x、AM62Ax、AM62Dx、AM62Px、AM67、 AM67A 

    如果将 ipc_rpmsg_echo 固件替换为空工程、则您的设计不会受到此问题的威胁。

    此致、

    Nick