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.

[参考译文] Linux IPC:如何在 OMAPL138上的 ARM 上运行 Linux 时为缓存配置 DSP 存储器映射

Guru**** 2925550 points

Other Parts Discussed in Thread: SYSBIOS, OMAP-L138

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/651383/linux-ipc-how-to-configure-dsp-memory-map-for-cache-with-linux-running-on-arm-on-omapl138

Thread 中讨论的其他器件:SYSBIOSOMAPL138OMAP-L138

工具/软件:Linux

大家好、我正在尝试创建一个类似于 IPC IPC_3_46_00_02中所示示示示例的设计

我已将资源表文件添加到 DSP 应用、并且能够运行 ex02_MessageQ 示例。

我已经安装了 SDK 4.0.0.4 for Linux、并检查 DTS Filr 以查看 CMA 池的设置为0xc3000000的位置、并且位置有两个缓冲区:

#define RPMSG_VRING0_DA 0xc3000000
#define RPMSG_VRING1_DA 0xc3004000

我遇到的问题如下:

IPC 中的示例 ex02禁用位置0xc3000000的高速缓存、并且整个 DSP 应用程序位于同一堆中。 我想将缓存用于 DSP 应用、并希望仅为 IPC 通信创建一个新堆。

我修改了资源表、如下所示:

#define DATA_DA1         0xc5000000

#ifndef DATA_SIZE
# define DATA_SIZE (SZ_1M * 15)
#endif

结构 my_resource_table{
struct resource_table base;

uint32 offset[4];

/* rpmsg vdev 条目*/
struct fw_RSC_vdev rpmsg_vdev;
struct fw_rsc_vdev_vring rpmsg_vring0;
struct fw_rsc_vdev_vring rpmsg_vring1;

/*数据分割条目*/
struct fw_RSC_carveout data_cout;

/*数据分割条目*/
struct fw_RSC_carveout data_cout1;

/*跟踪条目*/
结构 FW_RSC_TRACE 跟踪;
};
extern char XDC_runtime_sysmin_Module_State_0_outbuf__A;
#define TRACEBUFADDR (UINT32)&XDC_Runtime_SysMIN_Module_State_0_outbuf__A
#define TRACEBUFSIZE 0x8000

#pragma DATA_SECTION (ti_ipc_remoteproc_ResourceTable、".resource_table")
#pragma DATA_ALIGN (ti_ipc_remoteproc_ResourceTable、4096)

struct my_resource_table ti_ipc_remoteproc_ResourceTable ={
1、/*我们是实现此功能的第一个版本*/
4、/*表中的条目数*/
0、0、/*保留、必须为零*/
/*条目的偏移量*/

offsetof (struct my_resource_table、rpmsg_vdev)、
offsetof (struct my_resource_table、data_cout)、
offsetof (struct my_resource_table、data_cout1)、
offsetof (struct my_resource_table、trace)、
}、

/* rpmsg vdev 条目*/

TYPE_VDEV、virtio_ID_RPMSG、0、
RPMSG_DSP_features、0、0、0、2、 {0、0}、
/*无配置数据*/
}、
/*两个振铃*/
{RPMSG_VRING0_DA、4096、RPMSG_VQ0_SIZE、1、0}、
{RPMSG_VRING1_DA、4096、RPMSG_VQ1_SIZE、2、0}、


TYPE_CARVEOUT、DATA_DA、DATA_DA、DATA_SIZE、0、 "DSP_MEM_DATA"、
}、


TYPE_CARVEOUT、DATA_DA1、DATA_DA1、DATA_SIZE、0、 0、"DSP_MEM_Data1"、
}、


TYPE_TRACE、TRACEBUFADDR、TRACEBUFSIZE、0、"TRACE:DSP"、
}、
};

这添加 了地址 为0xc5000000的额外 TYPE_CARVEOUT

并在 DTS Linux 文件中进行了类似的更改:

保留存储器{
#address-cells =<1>;
大小单元格=<1>;
范围;

DSP_CMA_POOL:DSP_CMA@c3000000{
兼容="共享 dma-pool ";
reg =<0xc3000000 0x1000000>;
可重复使用;
状态="正常";
};
DSP_CMA_pool1:DSP_CMA_IPC@c5000000{
兼容="共享 dma-pool ";
reg =<0xc5000000 0x1000000>;
可重复使用;
状态="正常";
};

};

在 DSP.cfg 中,我还添加了:

VAR Cache = xdc.useModule('ti.sysbios.family.c64p.Cache');
cache.MAR192_223 = 0x00000008;

仅为 DSP 应用启用0xc3000000的缓存、并为 REST 禁用缓存(0xc5000000)。

当尝试从 Remoteproc 引导 DSP 时、我收到以下错误:

root@omapl138-lcdk:/sys/bus/platform/drivers/davinci-rproc echo davinci-rproc.0 > bind
davinci-rproc davi-rproc.0:分配的保留存储器节点 DSP_CMA@c3000000
remoteproc remoteproc0:DSP 可用
root@omapl138-lcdk:/sys/bus/platform/drivers/davinci-rproc remoteproc remoteproc0:为 DSP 加电
remoteproc remoteproc0:引导固件映像 rproc-dSP-FW、大小5604612
davinci-rproc davi-rproc.0:分配 DMA 内存失败:len 0xf00000
Remoteproc Remoteproproc0:无法处理资源:-12

我要做的就是:

*使用 MessageQ 实现一些堆缓冲区、用于在 DSP 和 Linux 之间进行通信。

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、还有一件我不理解的事情
    如果我将 DTS Linux 中的 CMA 池更改为0xC4000000、并将资源表地址更改为0xc4。 而不是0xc3.. 当我从 Remoteproc 启动 DSP 时、没有出现预期的错误! 但是、似乎不会在 DSP 上运行应用程序!!!

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

    我们将对此进行研究。
    请注意、反馈将因假期而延迟。

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

    CMA 分配通过 DMA API 完成、并且只能将单个池绑定到设备。 您有2个刻蚀区域,但这两个区域都来自相同的 CMA 池,这就是 Remoteproc 抱怨无法分配15MB 空间的原因。

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

    尊敬的 Rex:感谢您的回复。

    好的。 将默认资源表代码更改为地址0xc4000000而不是0xc3000000的情况

    并在 DTS 文件中将 CMA 池的内容设置为0xc4000000

    它仍然不会引导 DSP 软件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还有一件事、我不理解 Rex、
    *如果资源表的 VRING 地址为0xc3000000、CMA 池的地址为0xc3000000的16MB、则 DSP 应用程序入口点是否必须位于0xc3000000地址附近?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mitesh、

    您还需要对 CONFIG-Bld 中的表进行相应的更改。 您能否验证您是否已完成此操作? 如果是、它看起来是什么样子的?

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

    您好、Sahin、

    否、我尚未对 config.bld 文件进行任何更改

    您能告诉我需要添加什么以及该文件的用途是什么吗?

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 config.bld 文件的顶部,显示“//这是生成的文件--请勿编辑*/”
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mitesh、

    CONFIG-Bld 文件定义了 DSP 的存储器布局、需要与资源表中的内容匹配。 例如、在资源表中、因为您具有:

    #define DATA_DA1 0xc5000000和 #define DATA_SIZE (SZ_1M * 15)

    在 CONFIG.BRD 中、将基地址0xC3100000、len:0x800000更改为基地址0xc5000000、len:0xF00000  


    此 MessageQ 示例的 config.Bld 文件可在 IPC_3_46_02_04\examples\OMAPL138_Linux_elf\ex02_MessageQ\DSP 中找到

    有关 config.bld 文件 的更多信息、请参阅此 wiki:processors.wiki.ti.com/.../Config_bld_basics

    此外、是否已将 Resource.customTable 配置参数设置为 true? (请参阅 processors.wiki.ti.com/.../IPC_Resource_customTable)

    此致、
    Sahin

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

    您好、Sahin、是的、我已将其添加到 cfg 文件中。

    /*使用我自己的*/覆盖默认资源表
    VAR 资源= xdc.useModule('ti.ipc.remoteproc.Resource');
    resource.customTable = true;

    已从我当前的项目设计中附加 config.bld 文件。

    e2e.ti.com/.../0652.config.txt

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

    e2e.ti.com/.../8081.linker.txtAlso附加的链接器文件。

    请注意、我已经创建了具有所有存储器映射的自定义平台。

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

    您好、Mitesh、

    通常、对于 IPC、我们所做的是使用我们自己的 config.bld 来修改平台和内存配置。 例如、在 MessageQ 示例中:

    VAR Build = xdc.useModule('xdc.bld.BuildEnvironment');

    Build.platformTable["ti.platforms.evmOMAPL138:dsp"]={

      externalMemoryMap:[

        ["DDR"、{

          名称:"DDR"、空格:"代码/数据"、访问:"rwx"、

          基地址:0xC3100000、len:0x800000、

          注释:"DSP 程序存储器(8MB)"

        }

      ]、

      代码内存: "DDR"、

      数据存储器: "DDR"、

      stackMemory:"DDR"、

      L1DMode:"32K"、

      L1PMode:"32K"、

      L2模式:"32K"

    };

    它采用 ti.platforms.evmOMAPL138平台并将:DSP 附加到该平台以创建新平台,并添加了 DDR 段和高速缓存配置。

    然后、在位于 ex02_MessageQ\DSP\的 makefile 文件中、它使用此定制平台:

    %/linker.cmd %/compiler.opt:$(config)/.config;

    $(config)/.config:Dsp.cfg ./dsp/config.bld

    @$(echo)"#"

    @$(echo)"#Making $@…"

    $(XDC_INSTALL_DIR)/xs --xdcpath="$(SUBST +、;、$(PKGPATH))"\

          xdc.tools.configuro -o $(config)\

          t ti.targets.elf.c674 \

          -c $(ti.targets.elf.c674)\

          -p ti.platforms.evmOMAPL138:dsp \

          -b ./dsp/config.bld -r $(profile)\

          Dsp.cfg

    @$(echo)"">$@

    此致、

    Sahin

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

    您好、Sahin、  

    我面临的问题是... 我已经完成了整个设计、无需对 CONFIG-Bld 文件进行任何更改、设计的最后一部分是添加 IPC 软件包、以100Hz 的频率向 Linux 发送84字节数据。

    对于除 IPC 之外的整个设计、我们使用了缓存选项、并从 DDR 存储器加载和运行。  

    添加 IPC 后、我们意识到 IPC MessageQ 无法在启用缓存选项的情况下工作。 我需要为设计的其余部分启用高速缓存。 我无法更改、并且 DSP 应用的"入口点"位于0xc3100000、根据您之前的评论、我想将 VRING 缓冲器移至0xc2ff8000和0xc2ffc000、SYSBIOS 选择 TYPE_TRACE 地址。   

    我不确定数据缓冲区是否应该位于不可缓存的内存中? "TYPE_CARVEOUT、DATA_DA、DATA_DA、DATA_SIZE、0、 "DSP_MEM_DATA"、但现在它位于缓存存储器0xc3100000中

    在 cfg 文件中:  

    VAR Cache = xdc.useModule('ti.sysbios.family.c64p.Cache');
    /*将0xc3000000 -> 0xc3ffff 设置为高速缓存共享内存 IPC */
    cache.MAR192_223 = 0x00000008;

    因此不会缓存0xc2000000到0xc2ffff。

    我将在适用于 Linux 的 DTS 文件中执行类似的更改:  

    将 CMA 池更改为 len 0x02000000的0xc2000000

    这是否起作用??? 或者、使 IPC 正常工作的唯一方法是编辑 config.Bld 文件??  

    谢谢。

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

    您好、Mitesh、

    我能够从团队那里获得有关您问题的一些反馈:  

    在不更改 CONFIG.Bld 的情况下、您可以在应用程序中使用 SYSBIOS 缓存 API、如另一个线程中提到的 Rahul。

    关于将虚拟缓冲区移动到缓存区域之外:

    Remoteproc 驱动程序从 DTS 的 CMA 池的开头为虚拟环分配内存。 它还从同一 CMA 池分配分割线。 因此、复杂的是将分割部分与 CMA 池的起始部分分开。

    尝试此方法的一种方法是将 DTS 中的 CMA 池设置为整个内存的超集、并将分割区指定为16 MB (以便在16MB 边界中分配)。 这可能需要进行一些实验才能使其正常工作。

    此致、

    Sahin

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

    您好、Sahin、

    那么、您是否认为具有可缓存存储器的 IPC 没有用例?

    我发现这款 OMAPL138设计为 SoC 非常奇怪、但无法与 ARM-DSP 内核通信。 大多数示例都介绍了如何使用共享 RAM、但 Linux-SYSBIOS 通信不支持这些示例。  

    您在上一篇文章中提到的实验、您是否能够尝试一下? 我还有一个问题、DSP 应用 entry_point 是否需要位于分割缓冲区中?

    谢谢

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

    您好、Sahin、附上了 IPC ex02示例。 这应该正常工作、但当我们为 DSP 应用启用缓存时、示例失败。

    e2e.ti.com/.../IPC_5F00_ex02_5F00_messageq.zip

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

    这些日志显示"分配 DMA 存储器失败"、表示您所需的 VING 不是从0xc5000000处的 CMA_POOL 分配、而是从0xc3000000分配。 我相信 Remoteproc 只能在一个池中工作。 是否可以尝试将 CMA_POOL 的池大小增加到0xc3000000、该大小足以容纳 VRING 缓冲区? 但是、需要重新排列资源表、以便 VRING 位于末尾、并在与其他缓存条目不同的页面上对齐。

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

    尊敬的 Rex:

    的确,这就是萨欣和我想的原因,但我无法改变它使它正常工作!

    我们要做的是:  

    *将 VRING 和 TYPE_CARVEOUT 缓冲区设置为0xc3000000、并将 Linux DTI 中的 CMA 池设置为0xc3000000

    *使应用程序的 DSP 条目调用位于启用电缆的0xc4000000中。  

    我们可以这么做吗?  

    谢谢。

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

    您应该能够、但重新排列资源表很棘手。 如果我错了(也适用于 Sahin)、请更正我。 DSP 中的高速缓存在1MB 边界对齐。 只要 VRING 和 DSP 应用在资源表中处于不同的缓存边界、一个应用就可以配置为缓存、另一个应用则在 DSP 中未缓存。 我不熟悉 DSP 编码、而是 Linux 人员。 我仅在使用2个 CMA 池时看到问题。 我将与 Sahin 离线讨论、看看他尝试了什么。

    雷克斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Rex:
    高速缓存与16MB 边界对齐。 (MAR 位192至223)
    我们如何控制 DSP 应用程序进入调用的位置?

    默认情况下、在资源表中、VING 缓冲区从0xc3000000开始、TYPE_CARVEOUT 从0xc3100000开始。

    是否应针对不同的 DSP 起始地址更改此 TYPE_CARVEOUT?

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

    您好、Mitesh、

    我们能够使用以下配置实现此功能:

    在 DTS 中、我们使 CMA 池为32MB、因此它从0xc3000000开始占用2 16MB 边界:

    DSP_CMA_POOL:DSP_CMA@c3000000{
    兼容="共享 DMA-POOL ";
    reg =<0xc3000000 0x2000000>;
    可重复使用;
    状态="确定";
    }; 

    在资源表中:

    #define DATA_DA 0xc3100000
    
    #ifndef DATA_SIZE
    # define DATA_SIZE (SZ_1M * 31)
    #endif
    
    #define RPMSG_VRING0_DA 0xc3000000
    #define RPMSG_VRING1_DA 0xc3004000
    
    #define console_VRING0_DA 0xc3008000
    #define console_VRING1_DA 0xc300C000
    
    #define BUFS0_DA 0xc3040000
    #define BUFS1_DA 0xc3080000 

    在 CONFIG_Bld 中:

    Build.platformTable["ti.platforms.evmOMAPL138:dsp"]={
    externalMemoryMap:[
    ["DDR"、{
    名称:"DDR"、空格:"代码/数据"、访问:"rwx"、
    基地址:0xC4000000、len:0x1000000、
    注释:"DSP 程序存储器(16 MB)"
    }
    ]、 


    由于您没有使用自己的 config.bld 文件、因此只需将入口点更改为0xc4000000即可。

    网址为 DSP.cfg

    //将0xc4000000 -> 0xc4ffff 设置为缓存*/
    cache.MAR192_223 = 0x00000010; 

    Remoteproc 首先分配 Vrings、然后寻找分割区、因此最简单的解决 方案是将分割区保持在0xc3100000、并将其大小增加到31MB、以便我们可以将 DSP 代码放置在下一个边界(0xc4)中并为该边界启用缓存。 正如我们在上面看到的、分割线和 DSP 代码不一定要匹配、只要分割线大于代码、就可以工作。 在这种情况下、0xc31000000-0xc4000000中有15MB 的未使用空间、这是为了满足缓存要求。

    此外、我使用您发送的示例在 OMAP-L138 LCDK 上验证了这一点、我刚刚插入了 config.bld 文件。  

    希望这是有道理的。 如果您有任何疑问、请告知我们。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是个好消息。 今天我将尝试测试这个结果、并将结果发布在这里。 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sahin、刚刚尝试过此操作、但遇到以下错误:

    root@omapl138-lcdk:/sys/bus/platform/drivers/davinci-rproc cp /home/root/IPC_ex02_messageq.out /lib/firmware/rproc-dsp-fw
    root@omapl138-lcdk:/sys/bus/platform/drivers/davinci-rproc echo davinci-rproc.0 > bind
    davinci-rproc davi-rproc.0:分配的保留存储器节点 DSP_CMA@c3000000
    remoteproc remoteproc0:DSP 可用
    root@omapl138-lcdk:/sys/bus/platform/drivers/davinci-rproc remoteproc remoteproc0:为 DSP 加电
    remoteproc remoteproc0:引导固件映像 rproc-dSP-FW、大小为4077460
    davinci-rproc davi-rproc.0:分配 DMA 内存失败:len 0x1f00000
    Remoteproc Remoteproproc0:无法处理资源:-12
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sahin、您提到了 config.bld 文件;

    我已经创建了要使用的定制平台。

    我已附加 platform.xdc 和 config.bld 文件。

    e2e.ti.com/.../Platform.txte2e.ti.com/.../7065.config.txt

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

    您好、Mitesh、

    您是否将 CMA 池增加到32MB? 此外、如果您尚未完成修改 DTS 文件、则需要在修改 DTS 文件后重建器件树二进制文件、请参阅:

    例如、我从内核树根运行以下命令来重建器件树二进制文件(在/home/sahin/ti-processor-sdk-linux-omapl138-lcdk-04.00.00.04/board-support/linux-4.9.28中+gitAUTOINC+e43d1050-geed43d1050)。

    使 arch=arm cross_compile=/home/sahin/ti-processor-sdk-linux-omapl138-lcdk-04.00.00.04/linux-devkit/sysroots/x86_64-arago-linux/usr/bin/arm-linux-gnueabi- da850-lcdk.dtb 

    您可以通过在 Linux 引导时查找以下行来验证 CMA 池是否已增加:  

    保留存储器:创建了0xc3000000处大小为32 MIB 的 CMA 存储器池 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sahin、是的、我重建并安装了内核到 SD 卡。 但运气不好。 将检查 Linux 引导日志。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sahin、我再次重建了 Linux、看起来至少日志 CMA 缓冲区为32K (日志已连接)

    但仍然具有相同的误差;

    e2e.ti.com/.../linuxBoot_5F00_IPC.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sahin 和 Rex、非常感谢大家对此问题的支持。 这是可行的;)
    非常感谢。 (也必须重建 zImage 才能使其正常工作)