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/AM5728:ARM 和 IPU 共享内存问题

Guru**** 2587365 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/626185/linux-am5728-arm-and-ipu-shared-memory-problem

器件型号:AM5728

工具/软件:Linux

您好!

TI 正在 努力在 ARM 和 IPU1之间共享存储器、但 IPU 调用 Resource_physToVirt()函数失败! 它说 IPU 无法获取物理地址0xa0000000。

此处为日志:

root@am57xx-EVM:~/tl-arm-dsp-IPu-cmem-example.cat /sys/kernel/debug/remoteproc/remoteproc0/trace0
[0][0.000]看门狗已禁用:TimerBase = 0x68824000 ClkCtrl = 0x6a005568
[0][0.000]看门狗被禁用:TimerBase = 0x68826000 ClkCtrl = 0x6a005570
[0][0.000] 19个资源条目、位于0x3000
[0][0.000][t=0x000889ed] xdc.runtime.Main:-->主要:
[0][0.000]使用主机在61上注册 rpmsg-proto:rpmsg-proto 服务
[0][0.000][t=0x001897e7] xdc.runtime.Main: NameMap_sendMessage:host 53、port=61
[0][0.000]看门狗已禁用:TimerBase = 0x68824000 ClkCtrl = 0x6a005568
[0][0.000]看门狗被禁用:TimerBase = 0x68826000 ClkCtrl = 0x6a00550
[0][0.000][t=0x001ba77d] xdc.runtime.Main:--> smain:
[0][0.000][t=0x001db38f]服务器:SERVER_CREATE:服务器就绪
[0][0.000][t=0x001e5d03]服务器:<- Server_create:0
[0][0.000][t=0x001edc61]服务器:--> Server_exec:
[0][9.106][t=0xdde0ba15]服务器:Server_exec:找不到 PHY 0xa0000000的资源
[0][9.106]
[0][9.106][t=0xdde1eec1]服务器:Server_exec: processed cmd=0x2000000
[0][9.106][t=0xdde2e8bb]服务器:<- Server_exec:0
[0][9.107][t=0xdde38aad]服务器:--> Server_delete:
[0][9.107][t=0xdde49a13]服务器:<- Server_delete:0
[0][9.107][t=0xdde5f61d]服务器:SERVER_CREATE:服务器就绪
[0][9.107][t=0xdde6b5f7]服务器:<- Server_create:0
[0][9.107][t=0xdde74ceef]服务器:--> Server_exec:
root@am57xx-EVM:~/tl-arm-dsp-IPu-cmem-examples#

使用相同的代码、ARM 和 DSP1/DSP2是 Work Find。

我已经在 rsc_table_ipu.h 和 config.Bld 中添加了 cmem 配置。

我将 IPU 内存配置加倍是不对的。您能帮助处理它吗?

我的项目中的文件如下:

IPU 服务器:

e2e.ti.com/.../3683.Server.c

IPU RSC_TABLE:

e2e.ti.com/.../1134.rsc_5F00_table_5F00_ipu.h

CONFIG_Bld:

e2e.ti.com/.../config_5F00_bld.txt

主机代码:

e2e.ti.com/.../App.c

顺便说一下、另一个文件来自 ex02messageq 项目。

BR、

Vefone

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

    整个项目:

    e2e.ti.com/.../arm_2D00_dsp_2D00_ipu_2D00_cmem_2D00_example.7z

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

    如果我理解正确、您希望在 Linux 下运行这些 RTOS 二进制文件、对吧?
    您能否共享 am57xx-evm-cmem.dtsi 内容?

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

    您好!

    Yordan、

    cmem 配置如下所示:

    BR、

    Vefone

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    Yordan、这个问题是否有进展? ipu1/IpuAmmu.cfg 的配置如下:
    /*平铺机和 DMM 区域:大页面(512M);可高速缓存*/
    /*配置大页面[3]以将512MB VA 0xA0000000映射到 L3 0xA0000000 */
    Ammu.largePages [3].pageEnabled = Ammu.Enable_Yes;
    Ammu.largePages [3].logicalAddress = 0xA0000000;
    Ammu.largePages [3].平 方已启用= Ammu.Enable_no;
    Ammu.largePages [3].size = Ammu.large_512M;
    Ammu.largePages [3].l1_cacheable = Ammu.cachepolicy_cacheable;
    Ammu.largePages [3].L1_posted= Ammu.PostedPolicy_posted;

    ipu1应该可以访问物理地址0x8000000。 原因是什么?如何解决问题?

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

    因此 ipuAmmu.cfg 文件配置以下内容:
    /*配置大页面[3]以将512MB VA 0xA0000000映射到 L3 0xA0000000 */
    这是 DDR 的一部分、符合 am57xx-evm-cmem.dtsi 文件中的定义:
    cmem_block_mem_0:cmem_block_mem@a0000000{
    reg =<0x0 0xa0000000 0x0 0x0c000000>;
    无地图;
    状态="正常";
    };
    使用 am57xx-beagle-x15-common.dtsi:
    ipu1{(&I)
    状态="正常";
    Memory-region =<&ipu1_CMA_pool>;
    mbox =<&mailbox5 &mbox_ipc3x>;
    计时器=<&timer11>;
    安全装置定时器=<&timer7>、<&timer8>;
    };
    ipu1_CMA_pool:ipu1_CMA@9d000000{
    兼容="共享 dma-pool ";
    reg =<0x0 0x9d000000 0x0 0x2000000>;
    可重复使用;
    状态="正常";
    };

    如何访问地址0x8000000处的 RAM? 您可能需要先进行一些翻译。

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

    您好!

    Yordan、这里是 Host (A15):的代码

    MSG->datain[i]= CMEM_LOPool (CMEM_getPool (PAYLOADSIZE)、&cmemAttrs);
    if (msg->datain[i]== NULL){
    printf ("cmem_alloc()失败(返回的 NULL)\n");
    状态=-1;
    离开;

    MSG->dataInPhys[i]= CMEM_getPhys(msg->datain[i]);

    printf ("用户:%p phys:0x%x\n"、msg->dataain[i]、msg->dataInPhys[i]);

    uint8_t *datain =(uint8_t*) msg->datain[i];

    MSG->inXor[i]= 0;

    对于(j = 0;j < PAYLOADSIZE;j++){
    datain[j]=rand();
    MSG->inXor[i]^= datain[j];

    以下是 IPU1(M4)的代码:

    while (running){

    /*等待入站消息*/
    状态= MessageQ_get (Module.slaveQue、(MessageQ_Msg *)&msg、
    MessageQ_forever);

    如果(状态< 0){
    离开;

    对于(i = 0;i < 1;i++){
    if (Resource_physToVirt(msg->dataInPhys[i]、&virtualAddrIn[i])!= Resource_S_Success){
    Log_Print1 (Diags_info、"Server_exec:找不到 PHY 0x%x\n"、
    MSG->dataInPhys[i]);
    继续;

    Log_print4 (Diags_info、"Server_exec:addrPhy[%d]= 0x%x addrIn[%d]=0x%x"、
    i、msg->dataInPhys[i]、i、virtualAddrIn[i]);

    data_ptr =(uint8_t*) virtualAddrIn[i];

    dataXor = 0;

    对于(j = 0;j < msg->dataByteSize;j++){
    dataXor ^= data_ptr [j];

    log_print2 (Diags_info、"Server_exec:xorIn[%d]=0x%x"、i、dataXor);

    MSG->outXor = dataXOR;

    if (msg->cmd =App_CMD_SHUTDOWN){
    运行= false;

    主机将 msg->dataInPhys 发布到 IPU1、然后 ipu1使用 Resource_physToVirt 函数获取物理地址(0xA0000000)的虚拟地址。现在错误显示 ipu1无法访问0xA0000000、但 ipuAmmu.cfg 已将512Mb VA 0xA0000000映射到 L3 0xA0000000。

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

    您好!