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.

[参考译文] RTOS/am5726:PCIe 入站写入外部 RAM 失败

Guru**** 2546020 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/597246/rtos-am5726-pcie-inbound-write-into-external-ram-fails

器件型号:AM5726

工具/软件:TI-RTOS

您好!

 我 用 DSP1来控制 PCIe 子系统、即2xlan Gen2 RC。 EP 是 FPGA。 RC 存储器读取请求正常、如果入站存储器目标是 DSP 本地 L2-RAM、则 EP 写入请求也有效。 但是、如果我对外部 DDR 存储器执行相同的操作、则会失败。

DSP 在具有 PDK 1.0.4和 SYS/BIOS 6.46.0.23的 TI/RTOS 上运行。 它通过 Linux 中的 remoteproc (PROCESSOR-SDK-LINUXT-AM57xx-EVM-03.01.00.06)引导、并在其资源表中具有 DDR 存储器区域的所有必需插件。  

MMU 失败时没有错误(PCIe 数据路径 MMU 已禁用)、请求不会被拒绝、因为不受支持-实际上一切似乎都很好、除了数据从未进入内存。

我错过了什么吗? 我是否必须为 PCIe 子系统授予 DDR 的任何访问权限? 由于 L2 RAM 地址是本地地址、我必须将其转换为全局 L3-Main 地址空间。 我不需要对 DDR-RAM 地址执行此操作、因为它已经是全局性的-我对吗?

提前感谢、

                    Tim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    需要检查的一点是、Linux 也在 DDR3中运行、确保 PCIe 入站不会与 Linux 发生冲突。 另一种方法是通过 JTAG 或 devmem2检查 PCIe 入站寄存器设置:0x51000900至0x51000920 (如果这是 PCIESS1)。

    典型的图像看起来像附加的图片、入站方向、使用了区域0。 从0x9000_0000到0x9000_0000、映射到0x4080_0000 (DSP 局部到全局)。

    在您的情况下、0x5100_0918将是 DDR3中的某个值。 这些寄存器看起来是否正确?

    此致、Eric

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

    Eric、

     我认为所讨论的 DDR 存储器范围不会发生冲突、因为其资源表中已经有一个 DSP 存储器分配、并且在系统器件树配置中声明以下行将其从 Linux 存储器映射中排除:

    保留存储器{
    #address-cells =<2>;
    大小单元格=<2>;
    范围;
    
    dsp1_CMA_pool:dsp1_CMA@99000000{
    兼容="共享 dma-pool ";
    REG =<0x0 0x99000000 0x0 0x4000000>;
    可重复使用;
    状态="正常";
    };
    
    };
    
    

    在我看来、iATU 寄存器似乎可以:

    这是 DSP L2 RAM 的设置

    这是 DDR RAM 的设置。

    与设置的唯一区别是  PCIECTRL_PL_IATU_REG_CTRL_2的 bar_number 字段中的5。 但这不重要、因为 match_mode 是地址、而不是条。  

    嗯... 运气差。

    最棒的

     Tim

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

    是的、条码3或5无关紧要。 我使用 RTOS 代码测试了两个 AM572X IDK EVM 连接案例。 然后、我将一侧0x5100_0918从0x4080_0000编辑为0x9920_0000、我能够在 DSP 内核的存储器视图窗口中确认一侧的0x2100_0000现在映射到远程侧的0x9920_0000 (而不是之前的0x0080_0000)。

    因此、Linux 中有一些设置可以防止这种情况... 让我检查一下我的 Linux 同事。

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

    这一刻蚀区域不能用于 PCIe、而是用于 IPC。

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

    Rex、

     由于您可能已经被淘汰、我指向 PCIe 请求的地址在 IPC 的范围内。 Linux SDK 附带的设置已将 IPC 的 devmem 部分从0x99000000设置为0x990FFFFF。 我有意使用 IPC 使用的内存段'Behind (后面)、起始地址为0x99100000 (缓冲区起始地址为0x99200000)。

    我已经检查了另一个设置、其中的分割线与 Linux 设备树中定义的 CMA 部分相分离。 地址为0x90000000。 我相应地调整了 DSP 资源表、但没有结果。

    您认为在 ARM 上运行的操作系统阻止 PCIe 外设主端口写入存储器位置的原因是什么? 背后有什么回声?

    最棒的

         Tim

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

    假设 Linux 中的 PCIe 配置已禁用、我可以想到的可能原因是数据被写入不同的存储器位置、或者 MMU 没有为 DSP 解除阻止。

    对于第一个原因、您需要确保入站/出站区域在两端对齐。

    通常、资源表指示 DSP 将使用的存储器区域。 通过 Remoteproc 下载 DSP 映像时、Remoteproc 将在资源表中获取信息并修改 MMU。 这意味着2个条件、进入资源表并通过 Remoteproc 下载。 从您的帖子中、您似乎正在使用 Remoteproc 进行下载、因此应该已经注意了。

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

    尊敬的 Rex:

     很抱歉耽误你的回答、我是 AFK。

    感谢您澄清从 Linux 的角度来看可能会出现什么问题。

    不幸的是、我仍然卡住:

    • 入站/出站区域正确对齐:

    在 FPGA 端、我们使用64位 PCIe 地址空间、因此无需进行出站转换(在 L2-RAM 目标情况下、它已经在工作)。

    在 Sitara 端、入站转换从 PCIe 地址0x90000000映射到 DSP-L3-主地址0x90100000。 根据我的理解、对齐必须在此处满足的4KB 边界上。

    • MMU 不会阻止存储器访问。

    例如、从 PCIe 地址空间到有问题的 RAM 区域的本地 DMA 传输工作正常、并且 CPU 写入访问工作正常。

    我再次使用与 IPC devmem 完全分离的地址空间进行了测试。 以下是用于 memproc 进行 MMU 编程的资源表中的 curveouts/devmems 的列表:

    分段:DA: 40400000 pA:00000000 len: 00100000
    分段:DA: 90000000 pA:00000000 len: 00100000
    分段:DA: 90100000 pa: 00000000 len: 00d00000
    分段:DA: 90e00000 pa: 00000000 len: 00200mevelen: 00000
    
    pa: 00000 d: 00000
    
    DA:60000000 pA:a0000000 len:0c000000
    devmem:da:70000000 pA:70000000 len:08000000
    devmem:da:78000000 pA:08000000
    devmem:da:02000000 pA:02000000 len:00000
    devmem:da:20000000 pA:800000000 demm
    
    :1000000
    :5000000 devmen:0800mem:0800mem:00000 demen:0800mem:1000000 48000000 pA:48000000 len:00200000
    devmem:da:48400000 pA:4840000 len:0040000
    devmem:da:48800000 pA:48800000 len:00800000
    devmem:da:54000000 pA:54000000 len:0000
    devmem:da:4epA:4e000000 len:00100000 len 

    问题中的 PCIe 传输目标内存位置为0x90100000。 MMU 将其映射到相同的地址。

    如果我未能配置 DSP 固件的资源表、Linux 会使用 DSP mu0 dmesg 错误条目对非法内存访问做出响应。 PCIe 传输失败时不会出现这种情况。

    因此、仍然是运气差。 是否有提示?

         Tim

    PS.:在 Linux 端、整个 PCIe 总线被禁用。 DSP 完全处理 PCIe 子系统的初始化和配置。 /sys 文件系统下的任何位置都没有 PCI 条目。

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

    我在 AM572x 上禁用了 PCIe 的 Linux、您能否向我们发送 Linux 要加载的 DSP 固件(在/lib/firmware 下)以供我们试用。 DSP 固件需要配置 PCIe PRCM 和 RC 模式、还需要配置 OB/IB 转换并开始链路训练。 我们可以将另一个 AM572x EVM 设置为运行独立 PCIe 代码的 PCIe EP 以进行调试(您的固件应与我们的 EP 链接、然后我可以检查转换以了解为何无法在 RC 侧写入 DDR)。

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

    早上好、

     我有一个固件就绪。 它将自身配置为 RC、并尝试在 Gen2模式下链接1个通道。 它不会配置任何条形图、也不会在 EP 上进行出站转换、因为这取决于 EPS 软件。 如果 EP 写入 PCIe 地址0x90000000、则应写入本地 RCS 地址0x90100000。

    如果需要其他信息、请告诉我。

    e2e.ti.com/.../csxp.7z

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

    我已尝试使用您的 DSP 固件。 在 RC 侧、当入站映射到 OCMC (0x4080_0000)时、我可以看到 EP 使用 C66x 写入的模式。 当入站映射到 DDR3 0x9010_0000时、我可以从 A15 (使用 devmem2或 CCS 存储器视图)中看到该模式、但我无法从 DSP CCS CPU/物理存储器视图中看到该模式。 这是您的问题吗(您是否使用 A15或 C66x 来处理从 EP 接收到的数据)?

    当您构建 DSP 固件时、有一个用于资源表的头文件、您可以与我们共享该文件吗?

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

    您好!

      感谢进行测试-我查看了 Remoteproc 驱动程序代码、不得不了解实施会忽略分割结构的 PA 成员(我认为这就是 FW_RSC_ADDR_ANY 宏的作用)。 幸运的是、它已更新。

    我一直认为资源表是一个“只写”结构,因此 Remoteproc 必须尝试跟踪它获得的信息。

    现在、我通过读取镂空的 PA 成员成功计算了 PCIe 入站地址转换的基础。

    现在了解 Linux CMA 空间中的动态分配我想知道如何在 OCMC 空间中分配分割? 如何指示 Remoteproc 使用特定 CMA 区域进行特定分割? 我的目标是对某些数据使用 OCMC 存储器区域、以利用多个并行存储器接口、并在 DSP 内核附近存储频繁需要的数据。  

    再次感谢您的帮助、

                    Tim

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

    "我现在通过读取镂空的 PA 成员成功计算了 PCIe 入站地址转换的基础。"===您的意思是有 FPGA --- PCIe ---- DSP 写入 AM572x DDR 的操作已经开始?

    对于其余的问题、我们正在进行研究。

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

    Eric、

     是的、它现在可以工作了! 我想通过在资源表中注明如下内容、使 remoteproc 编程 DSP-MMU 以进行1:1地址转换:

    struct fw_RSC_caveout{
    uint32类型;
    uint32 da;
    uint32 pA;
    uint32 len;
    uint32标志;
    uint32保留;
    char name[32];
    };
    
    struct fw_RSC_caveout ocmc2_cout ={
    TYPE_CARVEOUT、
    OCMC2_RAM、
    OCMC2_RAM、
    OCMC2_RAM_SIZE、
    0、
    0、
    "DSP_MEM_OCMC2"、
    }; 

    我假设在这个分割中、如果我写入例如全局地址 0x40400000、MMU 会将1:1转换为内部 DSP 地址0x40400000。 但我了解到、无论 FW_RSC_carvout 结构的'PA'成员如何、Remoteproc 驱动程序都会将镂空放置在 Linux 找到 CMA 区域的任何位置。 请注意:切勿假设任何情况。 )

    因此、实际上、通过 PCIe 写入全局 DDR 存储器地址的工作从第一分钟开始、但从 DSP 的角度来看、我一直在寻找错误的地址。

    仍然渴望了解是否有意使用 OCMC 内存进行分割...  

    您能 再看一下这个主题吗? 此通知功能似乎已损坏、但我仍有疑问...

    非常感谢、

            Tim

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

    仍然没有答案?

    请给我一个生命体征来告诉我正在进行中的操作。 我们的运行时间已经过了、我们不想使用 Linux remoteproc 代码来进行开发。 另请参阅 我并行启动的此线程、因为它似乎是与此线程的原始意图不同的问题。

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

    您好!

    昨天、我尝试修改 rsc_table.h 以将代码分配到 OCMC 中、它使用了 M4、工作正常(以前在 DDR 中运行)。 不确定随附的对 you.e2e.ti.com/.../rsc_5F00_table.h 是否有用

    e2e.ti.com/.../rsc_5F00_table.h.ori

    此致、Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不明白。 为了实现这一点、您在 rsc_table.h 中做了哪些更改?!
    据我所知、所使用的物理内存仅由运行 Remoteproc 的 Linux 设备树中的 CMA 定义。
    我正在使用处理器 SDK RT 3.1.0.6、不知道在后续版本中是否更改了 Remoteproc 实施。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊、好的、现在我知道 RSC_Table.ori 是最初的。
    所以你说我必须定义一个 devmem,但给它一个类型的分割?!
    这对我来说似乎很奇怪、但我会尝试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、

      我尝试使用 type=carveout 的 devmem 条目 、结果与使用具有相同类型的 carveout 条目时的结果基本相同。

    这是我的应用程序有关资源的输出。 最后一个条目显示存储器已映射到 DDR-CMA:

    [ 0.0000][0000_0022]信息:资源表:
    [ 0.0000][0000_0091]信息:Carveout #0:DSP_MEM_TEXT 0x00100000 x 0x99100000 -> 0x90000000
    [ 0.0000][0000_0207]信息:Carveout #1:DSP_MEM_DATA 0x00000x 0.00000_30000000][0000_000_000_000_0003][0x0000_000_000_30000000_000_30000000_000]
    信息:[D0023][0000_000_000_000_000_30000000_000_000_000_000_000_000_0003][000_000_000_000_000_000_0003][D00000_000_000_000_0003
    DSP_MEM_IPC_DATA 0x00100000 x 0x9A100000 -> 0x9F000000
    [0.0000][0000_0559]信息:Devmem #0:DSP_MEM_IPC_VRING 0x00100000 x 0x99000000 -> 0xA0000000
    [0.0000][0000_0677]信息:Devmem #1:0x00000_EVM_080000000[0x0000_EVM_080000000][0xA0000_EVM_EVM_080000000][0x0000_EVM_0800_EVM_080000000][0x0000_EVM_0800_EVM_EVM_0800]信息
    :0x0000_0800_080000000][0x0000_EVM_0800_0800_0800_080000000][0xA0000
    DSP_TILER_MODE_0_1 0x08000000 x 0x70000000 -> 0x70000000
    [0.0000][0000_1032]信息:Devmem #4:DSP_TILER_MODE_2 0x08000000 x 0x78000000 -> 0x78000000 [0.0000000]
    [0000_1152]信息:Devmem #5:DSP_10000000_10000000[0x0000_10000000_10000000][PCIe_000_10000000][0x0000_10000000_10000000_10000000]
    [PCIE
    信息:0x0000_10000000_000][0000_10000000_10000000_000][10000000_000_10000000][PCIe_000_10000000_000][PCIE 信息:0x0000_ DSP_PCIe_SS1_CFG 0x00800000 x 0x51000000 -> 0x51000000
    [ 0.0000][0000_1506]信息:Devmem #8:DSP_PERASE_L4CFG 0x01000000 x 0x4A000000 -> 0x4A000000
    [ 0.0000][0000_1629]信息:Devmem #9:DSP_PER100000000 x 0x48000000 - 0x48000000 [0x48000_000_000][0x48000000
    = 0x48000_000_000]信息:0x4800000_000_000_000_000_000_000_000_000_[0x48000][0x48000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_000_[0x48000][0x4
    DSP_PERFETY_L4PER3 0x00800000 x 0x48800000 -> 0x48800000
    [ 0.0000][0000_2002]信息:Devmem #12:DSP_PERFETY_L4EMU 0x01000000 x 0x54000000 -> 0x54000000
    [ 0.0000][0000_2125]信息:Devm#13:DSP_PERFETY_DM6400x 0x000000 -
    0x40000000 [0x40000000_EMC0000_000][0x40000.000_000_000][0x40000000_EMC0000.000][0x40000.000_000_000_000_000_0x40000.000_000]信息:0x40000.000_000_0x 

    这是我的器件树(请注意、我稍微改进了结构、因此它包含在头文件和代码文件中。

    #ifndef _core_resources_H_
    #define _core_resources_H_
    
    #include 
    
    #define CORE_CARVEOUT_NUM 4
    #define CORE_DEVMEM_NUM 15
    
    #define CORE_RESOURCES_NUM (CORE_CARVEOUT_NUM + CORE_DEVMEM_NUM + 2)
    
    struct csxp_resource_table{
    struct resource_table base;
    
    uint32_t offset[core_resources_NUM];/*应与实际定义中的"num"匹配*
    
    /* rpmsg vdev 条目*/
    结构 FW_RSC_vdev rpmsg_vdev;
    struct fw_rsc_vdev_vring rpmsg_vring0;
    struct fw_rsc_vdev_vring rpmsg_vring1;
    
    /*分割条目*/
    struct FW_RSC_carveout cout[core_CARVEOUT_NUM];
    /*跟踪条目*/
    结构 FW_RSC_TRACE 跟踪;
    /* devmem 条目*/
    结构 FW_RSC_devmem devmem[core_DEVMEM_NUM];
    };
    
    extern struct csxp_resource_table ti_ipc_remoteproc_ResourceTable;
    
    
    #ifdef __cplusplus
    extern "C"{
    #endif
    
    UINT32_t core_loc2globb (uint32_t addr);
    void core_print_mem_entries (void);
    
    #ifdef __cplusplus
    }
    #endif // extern "C"*
    
    
    
    
    /#endif //_core_resources_h_*
    

    #include 
    
    #include "util.h"
    #include "core_resources.h"
    #include "logging.h"
    
    
    /* DSP 内存映射*/
    #define L4_DRA7XX_BASE 0x4A000000
    
    #define L4_PERIODIFY_L4CFG (L4_DRA7XX_BASE)
    #define DSP_PERASE_L4CFG 0x4A000000
    
    #define L4_PERASE_L4PER1 0x48000000
    #define DSP_PERIODISAFETY_L4PER2
    
    0x48400000
    #define DSP_PERL4_PERL448000
    
    #define L4_PERL4_RAFETY_L448000 #define 0x484_PEREMU
    外设#define 0x48000 #define #define DSP_PERL4_PERL4_PERL4_PERL4_PERL4_
    
    0x54000000
    #define DSP_PERASIN_L4EMU 0x54000000
    
    #define L3_PERASIN_DMM 0x4E000000
    #define DSP_Peripheral_DMM 0x4E000000
    
    #define L2_SRAM 0x00800000
    #define L2_SRAM_SIZE 0x00048000
    
    #define OCMC2_RAM 0x40400000
    #define OCMC2_RAM_SIZE 0x00100000
    
    #define PCIe_MSI_MEMORY_BASE 0x02000000
    #define PCIe_MSI_MEMORY_SIZE SZ_1M
    
    #define PCIe_SS1_MEMORY_BASE 0x20000000
    #define PCIe_SS1_MEMORY_SIZE SZ_256M
    
    #define L3_PCIe_SS1_CFG_BASE 0x51000000 #define PCIe_SS1_MEMORY_SS1_BASE_0x1000000
    #define 0x1000000 #define SS1_SS1_BASE_1_CFG_BASE_BASE_BASE_BASE_SHORT_BASE 0x
    
    0x52000000
    #define DSP_PERSS_ISS 0x52000000
    
    #define L3_tiler_MODE_1 0x70000000
    #define DSP_TILER_MODE_1 0x70000000
    
    #define L3_tiler_MODE_2 0x78000000
    #define DSP_TILER_MODE_2 0x78000000
    /*与平铺区域共同定位以更轻松地清除*/
    #define DSP_MEM_IOBUFS 0x8000000
    
    #define DSP_MEM_TEXT 0x90000000
    #define DSP_MEM_DATA 0x90100000
    #define DSP_MEM_HEAP 0x90E00000
    #define DSP_MEM_CMEM 0x60000000
    
    //0x85900000
    #define DSP_SR0_virt 0xBFD00000
    #define DSP_SR0 0xBFD00000
    
    #define DSP_MEM_IPC_DATA 0x9F000000
    #define DSP_MEM_IPC_VRING 0xA0000000
    #define DSP_MEM_RPMSG_VRING0 0xA0000000
    #define DSP_MEM_RPMSG_VRING1 0xA0004000
    #define DSP_MEM_VRING_BUFS0 0xA0040000
    #define DSP_MEM_VING_BUFS1 0xA0080000
    
    #define DSP_MEM_IPC_VRING_SIZE SZ_1M
    #define DSP_MEM_IPC_DATA_SIZE SZ_1M
    
    #define DSP_MEM_IOBUFS_SIZE (SZ_1M * 90)
    
    #define DSP_MEM_TEXT_SIZE (SZ_1M * 1)
    #define DSP_MEM_DATA_SIZE (SZ_1M * 13)
    #define DSP_MEM_HEap_SIZE (SZ_1M * 2)
    #define DSP_MEM_CMEM_SIZE (SZ_1M * 192)
    
    /*
    分配固定的 RAM 地址以简化固定的 MMU 表。
    //
    //*此地址源自当前的 IPU 和离子分割*/
    #define PHYS_MEM_IPC_VRING 0x99000000
    
    /*需要与 IPU 的相同*/
    #define PHYS_MEM_IOBUFS 0xBA300000
    #define PHYS_MEM_CMEM 0xA0000000
    
    /*
    虚拟队列的大小(以支持的缓冲区数量表示,
    *并且必须是2的幂)
    */
    #define DSP_RPMSG_VQ0_SIZE 256
    #define DSP_RPMSG_VQ1_SIZE 256
    
    个/*翻转位、其索引代表我们支持的功能*/
    #define RPMSG_DSP_C0_features 1
    
    
    extern char ti_trace_sysmin_Module_State_0_outbuf__A;
    #define TRACEBUFADDR (UINT32)&ti_trace_SysMIN_Module_State_0_outbuf__A
    
    #pragma DATA_SECTION (ti_IPC_remote4096_ResourceTable、".resource_table"
    
    
    )#proc_remote_remote_remote_data_ipc_table (t_remote_tec_table_ipc_table)
    1、 /*我们是实现此功能的第一个版本*/
    core_resources_NUM、 /*表中的条目数*/
    0、0、 /*保留、必须为零*/
    /*条目的偏移量*/
    {
    offsetof (struct csxp_resource_table、rpmsg_vdev)、
    offsetof (struct csxp_resource_table、cout[0])、
    offsetof (struct csxp_resource_table、cout[1])、
    offsetof (struct csxp_resource_table、cout[2])、
    offsetof (struct csxp_resource_table、cout[3])、
    offsetof (struct csxp_resource_table、trace)、
    offsetof (struct csxp_resource_table、devmem[0])、
    offsetof (struct csxp_resource_table、devmem[1])、
    offsetof (struct csxp_resource_table、devmem[2])、
    offsetof (struct csxp_resource_table、devmem[3])、
    offsetof (struct csxp_resource_table、devmem[4])、
    offsetof (struct csxp_resource_table、devmem[5])、
    offsetof (struct csxp_resource_table、devmem[6])、
    offsetof (struct csxp_resource_table、devmem[7])、
    offsetof (struct csxp_resource_table、devmem[8])、
    offsetof (struct csxp_resource_table、devmem[9])、
    offsetof (struct csxp_resource_table、devmem[10])、
    offsetof (struct csxp_resource_table、devmem[11])、
    offsetof (struct csxp_resource_table、devmem[12])、 
    offsetof (struct csxp_resource_table、devmem[13])、 offsetof (struct csxp_resource_table、devmem[14]) }、 /* rpmsg vdev 条目*/ { TYPE_VDEV、virtio_ID_RPMSG、0、 RPMSG_DSP_C0_features、0、0、2、 {0、0}、 /*无配置数据*/ }、 /*两个振铃*/ {DSP_MEM_RPMSG_VRING0、4096、DSP_RPMSG_VQ0_SIZE、1、0}、 {DSP_MEM_RPMSG_VRING1、4096、DSP_RPMSG_VQ1_SIZE、2、0}、 { { TYPE_CARVEOUT、 DSP_MEM_TEXT、0、 DSP_MEM_TEXT_SIZE、0、0、"DSP_MEM_TEXT"、 }、 { TYPE_CARVEOUT、 DSP_MEM_DATA、DSP_MEM_DATA、 DSP_MEM_DATA_SIZE、0、0、"DSP_MEM_DATA"、 }、 { TYPE_CARVEOUT、 DSP_MEM_HEAP、0、 DSP_MEM_heap_size、0、0、"DSP_MEM_heap"、 }、 { TYPE_CARVEOUT、 DSP_MEM_IPC_DATA、0、 DSP_MEM_IPC_DATA_SIZE、0、0、"DSP_MEM_IPC_DATA"、 } }、 { TYPE_TRACE、TRACEBUFADDR、0x8000、0、"TRACE:DSP"、 }、 { { TYPE_DEVMEM、 DSP_MEM_IPC_VRING、PHYS_MEM_IPC_VRING、 DSP_MEM_IPC_VRING_SIZE、0、0、"DSP_MEM_IPC_VRINing"、 }、 { TYPE_DEVMEM、 DSP_MEM_IOBUFS、PHY_MEM_IOBUFS、 DSP_MEM_IOBUFS_SIZE、0、0、"DSP_MEM_IOBUFS"、 }、 { TYPE_DEVMEM、 DSP_MEM_CMEM、PHYS_MEM_CMEM、 DSP_MEM_CMEM_SIZE、0、0、"DSP_MEM_CMEM"、 }、 { TYPE_DEVMEM、 DSP_TILER_MODE_1、L3_TILER_MODE_1、 SZ_128M、0、0、"DSP_TILER_MODE_0_1"、 }、 { TYPE_DEVMEM、 DSP_TILER_MODE_2、L3_TILER_MODE_2、 SZ_128M、0、0、"DSP_TILER_MODE_2"、 }、 { TYPE_DEVMEM、 PCIe_MSI_MEMORY_BASE、PCIe_MSI_MEMORY_BASE、 PCIe_MSI_MEMORY_SIZE、0、0、"DSP_PCIe_MSI"、 }、 { TYPE_DEVMEM、 PCIe_SS1_MEMORY_BASE、PCIe_SS1_MEMORY_BASE、 PCIe_SS1_MEMORY_SIZE、0、0、"DSP_PCIe_SS1_MEM"、 }、 { TYPE_DEVMEM、 L3_PCIe_SS1_CFG_base、DSP_PCIe_SS1_CFG_base、 SZ_8M、0、0、"DSP_PCIe_SS1_CFG"、 }、 { TYPE_DEVMEM、 DSP_Peripheral_L4CFG、L4_Peripheral_L4CFG、 SZ_16M、0、0、"DSP_PERIOD_L4CFG"、 }、 { TYPE_DEVMEM、 DSP_Peripheral_L4PER1、L4_Peripheral_L4PER1、 SZ_2M、0、0、"DSP_PERSS_L4PER1"、 }、 { TYPE_DEVMEM、 DSP_Peripheral_L4PER2、L4_Peripheral_L4PER2、 SZ_4M、0、0、"DSP 外设_L4PER2"、 }、 { TYPE_DEVMEM、 DSP_Peripheral_L4PER3、L4_Peripheral_L4PER3、 SZ_8M、0、0、"DSP 外设_L4PER3"、 }、 { TYPE_DEVMEM、 DSP_Peripheral_L4EMU、L4_Peripheral_L4EMU、 SZ_16M、0、0、"DSP_Peripheral_L4EMU"、 }、 { TYPE_DEVMEM、 DSP_Peripheral_DMM、L3_Peripheral_DMM、 SZ_1M、0、0、"DSP_Peripheral_DMM"、 }、 { TYPE_CARVEOUT、 OCMC2_RAM、OCMC2_RAM、 OCMC2_RAM_SIZE、0、0、"DSP_MEM_OCMC2"、 }、 } }; uint32_t core_loc2globb (uint32_t addr) { int i; if (addr < 0x20000000)// GPMC space -内核特定的本地地址*/ 返回(1UL << 30)|(CSL_chipReadReg (CSL_CHICE_DNUM)<< 24)|(addr & 0x00FFFFFFUL); 对于(I = 0;I < ARRLEN (ti_IPC_remoteproc_ResourceTable.cout);i++) { if (addr - ti_ipc_remoteproc_ResourceTable.cout[i].da < ti_ipc_remoteproc_ResourceTable.cout[i].len) return addr - ti_ipc_remoteproc_ResourceTable.cout[i].da + ti_ipc_remoteproc_ResourceTable.cout[i].PA; } for (i = 0;i < ARRLEN (ti_ipc_remoteproc_ResourceTable.devmem); i++) { if (addr - ti_ipc_remoteproc_ResourceTable.devmem[i].da < ti_ipc_remoteproc_ResourceTable.devmem[i].len) return addr - ti_ipc_remoteproc_ResourceTable.devmem[i].da + ti_ipc_remoteproc_ResourceTable.devmem[i].pa; } return addr; } void core_print_mem_entries () { int i; struct fw_RSC_carveout * cout; struct fw_RSC_devmem * DMEM; LogMsgPush (LM_CSXP、LL_Info、"ResourceTable:\n"); for (i = wf_rsc_remoti);cproc = 0+、cout_remoti (cout+) LogMsgPush (LM_CSXP、LL_Info、"\tCarveout #%d:%s 0x%08X x 0x%08X -> 0x%08X\n"、I、COUT->NAME、COUT->Len、COUT->PA、 COUT->da); 对于(I = 0、DMEM =&ti_ipc_remoteproc_ResourceTable.devmem[0]; I < ARRLEN (ti_ipc_remoteproc_ResourceTable.devmem); i++、DMEM++) LogMsgPush (LM_CSXP、LL_Info、"\tDevmem #%d:%s 0x%08X x 0x%08X -> 0x%08X\n"、I、DMEM->name、DMEM->len、DMEM->PA、 dmem->da); }

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

    您好!

      我对这里的沉默有点困惑。 您是否有任何关于我的问题的活动? 很高兴有线索知道是否值得等待回复...

    最棒的

        Tim

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

    很抱歉、我对此不是很了解。 您的目标是添加一个条目、以便从 OCMC 而不是 DDR 分配一些内存缓冲区。 然后您添加了 devmem 条目并键入"caveout"、然后它已经起作用了。 不是吗? 您说过:[0.0000][0000_2247]信息:Devmem #14:DSP_MEM_OCMC2 0x00100000 x 0x9A200000 -> 0x40400000这仍然来自 DDR?

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

    Eric、

     "您的目标是添加一个条目、从 OCMC 而不是 DDR 分配一些内存缓冲区。 '

    没错。

     “然后你添加了 devmem 条目,键入是分割,然后它已经起作用了。 '

    遗憾的是、这是不正确的。 当我尝试将 OCMC 映射为 DEVMEM 类型的 DEVMEM 并将数据段放置在 IT remoteproc 中时、无法加载程序段:

    [74.268170] OMAP-rproc 40800000.dsp:分配的保留存储器节点 dsp1_CMA@99000000
    [74.280798] remoteproc2:40800000.dsp 可用
    [74.287296] remoteproc2:注意:remoteproc 仍在开发中并被视为实验。
    [74.296986] remoteproc2:二进制格式尚未最终确定、并且尚不能保证向后兼容性。
    [74.535471] remoteproc2:加电40800000.dsp
    [74.540320] remoteproc2:启动 FW 映像 dra7-dsp1-fw.xe66、大小为6289932
    [74.563617] omap_hwmod:mu0_dsp1:_wait_target_disable 失败[74.5mu.x993mu
    :[74.5mu.40mu.0004mu.074mu.mu.0004mu.000] mu.mu.mu.mu.mu074mu.mu.074mu.mu.00042000]
    
    
    无法加载程序段:-22
    [74.641688] omap_hwmod:mu1_dsp1:_wait_target_disable 失败
    [74.655405] omap_hwmod:mu0_dsp1:_wait_target_disable 失败
    [74.661302] remotipe_boot()-rmsg_boot()失败
    ,注册
    了4.6742]
    

    当我尝试将 OCMC 映射为 CARVEOUT 类型的 DEVMEM 并在其中放置一个数据段时、Remoteproc 会加载程序、但将分割线放置到 CMA 区域中、这意味着会忽略 devmem 结构的物理地址成员、Remoteproc 会再次使用 DDR RAM。

    [ 0.0000][0000_0018]调试:资源表:
    [ 0.0000][0000_0131]调试: Carveout #00:0x00100000 x 0x99100000 -> 0x90000000 DSP_MEM_TEXT
    [ 0.0000][0000_0358]调试: Carveout #01:0x00D00000 x 0x99200000 -> 0x90100000 DSP_MEM_DATA
    [ 0.0000][0000_0582]调试: Carveout #02:0x00200000 x 0x99F00000 -> 0x90E00000 DSP_MEM_HEAP
    [ 0.0000][0000_0809]调试: Carveout #03:0x00100000 x 0x9A100000 -> 0x9F000000 DSP_MEM_IPC_DATA
    [ 0.0000][0000_1043]调试: Devmem #00:0x00100000 x 0x99000000 -> 0xA0000000 DSP_MEM_IPC_VRING
    [ 0.0000][0000_1272]调试: Devmem #01:0x05A00000 x 0xBA300000 -> 0x80000000 DSP_MEM_IOBUFS
    [ 0.0000][0000_1495]调试: Devmem #02:0x0C000000 x 0xA0000000 -> 0x60000000 DSP_MEM_CMEM
    [ 0.0000][0000_1712]调试: Devmem #03:0x08000000 x 0x70000000 -> 0x70000000 DSP_TILER_MODE_0_1
    [ 0.0000][0000_1944]调试: Devmem #04:0x08000000 x 0x78000000 -> 0x78000000 DSP_TILER_MODE_2
    [ 0.0000][0000_2171]调试: Devmem #05:0x00100000 x 0x02000000 -> 0x02000000 DSP_PCIe_MSI
    [ 0.0000][0000_2389]调试: Devmem #06:0x10000000 x 0x20000000 -> 0x20000000 DSP_PCIe_SS1_MEM
    [ 0.0000][0000_2617]调试: Devmem #07:0x00800000 x 0x51000000 -> 0x51000000 DSP_PCIe_SS1_CFG
    [ 0.0000][0000_2844]调试: Devmem #08:0x01000000 x 0x4A000000 -> 0x4A000000 DSP_Peripheral_L4CFG
    [ 0.0000][0000_3080]调试: Devmem #09:0x00200000 x 0x48000000 -> 0x48000000 DSP_Peripheral_L4PER1
    [ 0.0000][0000_3317]调试: Devmem #10:0x00400000 x 0x48400000 -> 0x48400000 DSP_Peripheral_L4PER2
    [ 0.0000][0000_3556]调试: Devmem #11:0x00800000 x 0x48800000 -> 0x48800000 DSP_Peripheral_L4PER3
    [ 0.0000][0000_3796]调试: Devmem #12:0x01000000 x 0x54000000 -> 0x54000000 DSP_Peripheral_L4EMU
    [ 0.0000][0000_4039]调试: Devmem #13:0x00100000 x 0x4E000000 -> 0x4E000000 DSP_Peripheral_DMM
    [ 0.0000][0000_4275]调试: Devmem #14:0x00100000 x 0x9A200000 -> 0x40400000 DSP_MEM_OCMC2
    

     '您说过:[0.0000][0000_2247]信息:Devmem #14:DSP_MEM_OCMC2 0x00100000 x 0x9A200000 -> 0x40400000这仍然来自 DDR?'

    是的、调试输出格式为 size x physical address -> device address (MMU 映射)。 即使在资源表中使用 devmem 条目:如果我将其类型设置为 CARVEOUT remoteproc、则使用与使用具有相同类型的分割条目相同的内存分配机制。 含义:它使用 DDR 存储器中的 CMA 区域进行分配、并忽略资源条目的物理地址成员。

    但我最近的测试提出了一个基本问题:使用 OCMC 是否值得? 我进行了一些内存测试、并在 DDR 和 OCMC 上看到相同的 DMA 带宽。 只有在随机访问时、我才会看到使用 OCMC 的性能稍微提高。 我搜索它、但想获得:对于 am572X、DSP L1、L2、OCMC 和 DDR3、是否有一些有关内存带宽的基准数据?

    最棒的

           Tim

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可能太晚了、我不确定我是否完全理解已经完成/尝试了哪些操作、但我可以在几乎相同的设置下分享我的经验。 我还有一个 DSP 内核、它直接将 PCIe 用作与 FPGA 进行通信的 RC、作为 EP。 FPGA 具有内部 DMA 功能、因此、当 FPGA 为 DSP 准备好数据时、它通过 PCIe 发送数据、DSP 获得 MSI 中断。 我的原始计划是将数据发送到 OCMC RAM、但似乎该 RAM 已缓存。 因此、每次传输后、我都必须使高速缓存无效才能使 DSP 能够查看 FPGA 放入 OCMC RAM 的数据。 我想使用 OCMC RAM 的原因是 L2SRAM 不够大、无法容纳我的目标缓冲区。 (我们收集一组 FPGA 数据包、然后在稍后处理。) 缓存无效似乎真的会减慢速度、因此我当前的工作解决方案是在 L2SRAM (非缓存区域)中创建一个足够大的缓冲区、以便从 FPGA 接收一个数据包、然后在 MSI 中断从 L2SRAM 缓冲区复制到 DDR3缓冲区时。 这在没有手动缓存操作的情况下似乎可以正常工作。 此外、在资源表中不需要任何 Linux 交互、也没有什么特别之处。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、关于加载程序段失败:-22错误。 我想当您在 DSP 存储器中定义 DSP 正常程序/数据区域之外的区域时、会发生这种情况。 Remote proc 尝试初始化该区域、就像任何 DSP 存储器一样、但我不确定所有设置是否都已完成、因此失败。 我的解决方案是完全不在 DSP 中声明缓冲区。 相反、声明指向要使用的存储器区域的指针。 这样、DSP 映像实际上不包含该存储器中的任何段、并且远程处理器不会尝试对其进行初始化。 我认为您可以使用 L2SRAM、因为 MMU 不需要从 DSP 访问它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Christopher、

     感谢您的分享!

    我们将决定我们是否按照您的方式进行交易-将 FPGA 作为请求者、将 MSI 作为完整信号。 但是、由于我们的总有效载荷约为4MB、因此我们将以 DDR RAM 为目标。

    我关闭了预取区域的高速缓存:L2-RAM 和 OCMC。 鉴于从某些内存区域获取 memproc 分配分割区时出现的问题、我已经使用指向 OCMC 的指针以及资源表中的 OCMC DEVMEM 条目。 这种方法运行良好、但必须在运行时进行内存分配管理。 让编译器执行它的目的会更安全。

    我很惊讶、即使没有资源表条目、也可以通过指针访问 OCMC。 我的印象是、始终 必须进行地址转换、否则会发生地址转换错误。 remoteproc 对 DSP MMU 所做的工作有点阴暗。 我将在运行时查看它、可能有一个我不知道的旁路区域。

    但是,除了这一点之外,你的方面有哪些已实现的带宽,Chistopher?

    不过、我仍然对有关 am572x 上 OCMC 和 DDR 的内存基准测试感兴趣... )

    最棒的

          Tim

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

    很抱歉、Tim 我们没有进行任何最大带宽测试。  该系统的性能非常好、至少可以满足我们的时间轴、数据传输、因此我们还没有研究实际的 PCIe 传输速率。