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.

[参考译文] AM5728:CMEM 问题

Guru**** 2551110 points
Other Parts Discussed in Thread: AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/604490/am5728-cmem-issues

器件型号:AM5728

我在 am5728上使用 ti-processor-sdk-linux-am57xx-evm-03.03.00.04

并希望为捕获视频分配缓冲区。 我的 DTS:

保留存储器{
#address-cells =<0x2>;
#size-cells =<0x2>;
范围;

ipu1_CMA@9d000000{
compatible ="shared-dma-pool";
reg =<0x0 0x9d000000 0x0 0x2000000>;
可重用;
status ="确定";
Linux、phandle =<bbb5>;
phandle =<bbb5>;phandle =<bb5>;
};

ipu2_CMA@95800000{
compatible ="shared-dma-pool";
reg =<0x0 0x95800000 0x0 0x3800000>;
可重复使用;
status ="正常";
linux、phandle =<0xba>;
phandle =<0xba>;
};

dsp1_CMA@99000000{
兼容="共享 dma-pool";
reg =<0x0 0x99000000 0x0 0x4000000>;
可重复使用;
状态="正常";
Linux、phandle =<0xC2>;
phandle =<0xC2>;
};

dsp2_CMA@9f000000{
兼容="共享 dma-pool";
reg =<0x0 0x9f000000 0x0 0x800000>;
可重复使用;
状态="正常";
Linux、phandle =<0x127>;
phandle =<0x127>;
};

cmem_block_mem@a0000000{
reg =<0x0 0xa0000000 0x0 0xA000000>;
无映射;
状态="确定";
Linux、phandle =<0x131>;
phandle =<0x131>;
};

myblock:cmem_block_mem@aa000000{
reg =<0x0 0xaa000000 0x0 0x2000000>;
无映射;
状态="确定";
};

cmem_block_mem@40500000{
reg =<0x0 0x40500000 0x0 0x100000>;
无映射;
状态="确定";
Linux、0x132>
;phandle = 0x132>
};
};


cmem{
compatible ="ti、cmem";
#address-cells =<0x1>;
#size-cells =<0x0>;
#pool-size-cells =<0x2>;
status ="确定";

cmem_block@0{
reg =<0x0>;
memory-region =<0x131>;
cmem-buf-pools =<0x1 0x0 0xA000000>;
};

cmem_block@





@1{reg = 0x1>;memory-region =<&myblock>;cmem-buf-pools=<0x6 0x132>;0x4800>;cmemory-region = 0x4800>

;<0x362>;cem-region = 0x4800>

CMEM 负载正常

root@am57xx-evm:~ cat /proc/cmem

Block 0:pool 0:1 bufs size 0xa000000 (请求0xa000000)

pool 0 Busy bufs:

pool 0 free bufs:
ID 0:phys addr 0xa0000000

Block 1:pool 0:6 bufs size 0x96000 (请求0x96000)

pool 0 Busy bufs:

pool 0 free bufs
ID: phys addr 0xabf6a000
id 1:phys addr 0xabed4000
id 2:phys addr 0xabe000
id 3:phys addr 0xabda8000
id 4:phys addr 0x12000 abdid
5:phys addr 0xabc7c000

Block 1:pool 1:6 bufs size 0x3f5000 (0x3buf1




:buf00) fbuf1:请求的 fbuf2:f4800s 地址池0:请求的 fbuf2:fbuf2:fbuf2:bufs phys addr 0xab887000
id 1:phys addr 0xab492000
id 2:phys addr 0xab09d000
id 3:phys addr 0xaaca8000
id 4:phys addr 0xaa8b3000
id 5:phys addr 0xaa4be000

但示例程序不起作用:

CMEM_AllocParams PRMS;
PRMs.alignment = 0;
PRMs.flags = CMEM_NONCACHED;
PRMs.type = CMEM_POOL;
CMEM_INIT();
void* ptr = CMEM_alloc (640*480*2,和 PRMS);

printf ("获取缓冲区%08X\n"、ptr);
CMEM_FREE (PTR、PRMS);
CMEM_EXIT(); 

CMEM 错误:registerAlloc: ioctl CMEM_IOCREGUSERR failed for phys addr 0xa0000000:-1
TIOCL 致命错误:TI 多核工具守护程序(/usr/bin/ti-mctd)未运行。 启动守护程序后重新运行应用程序。 有关详细信息、请参阅用户指南。

尝试运行 ti-mctd 时:

CMEM 错误:分配堆:ioctl CMEM_IOCALLOCHEPCACHED 失败:-1
TI-mctd:/home/gtbldadm/processor-sdk-linux-krogoth-build/build-CORTEX_1/arago-tmp-external-linaro-toolchain/work/am57xx_evm-linux-gnueabi/opencl/1.1.12.0-r0.0/git/host/mct-demon/cmem_allocator.h:94:CmemAllocator::CmemAllocator ():断言`mSMC_ALLOC_DSP_addr_= MSMC_addr'失败。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在进行一些实验之后,在更改 cmem 配置(更改 block0的分区或添加带有 pool 的新块)后,ti-mctd 看起来会发生中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Konstantin、

    在 cmem_alloc()调用中,您没有指定要分配的 wihich 块,它将从第一个可用的块中分配。 即 cmem_block_mem @a0000000。这就是为什么您看到 PHY 地址0xa0000000显示失败的错误。 如果需要从特定池中分配,则需要使用 cme_alloc2()。

    TI-mctd 仅供 OpenCL 使用。 如果您的测试程序只执行 cmem_alloc(),则不需要 ti-mctd。 但是、您会抱怨它没有运行。 这提示我 OpenCL 在某个位置运行。 如果 OpenCL 正在运行、请确保0xa0000000处的资源没有任何冲突。 这可能是为什么 cmem_alloc()一开始失败的原因。

    雷克斯

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

    在我的应用中、我也希望使用 OpenCL、OpenCL 初始化将在稍后的示例代码中进行。

    器件树

    保留存储器{
    #address-cells =<0x2>;
    #size-cells =<0x2>;
    范围;
    
    ipu1_CMA@9d000000{
    compatible ="shared-dma-pool";
    reg =<0x0 0x9d000000 0x0 0x2000000>;
    可重用;
    status ="确定";
    Linux、phandle =<bbbbv8>;
    phandle =<8;phandle =<bbbb0>;
    };
    
    ipu2_CMA@95800000{
    compatible ="shared-dma-pool";
    reg =<0x0 0x95800000 0x0 0x3800000>;
    可重复使用;
    status ="正常";
    linux、phandle =<0xbd>;
    phandle =<0xbd>;
    };
    
    dsp1_CMA@99000000{
    兼容="共享 dma-pool";
    reg =<0x0 0x99000000 0x0 0x4000000>;
    可重复使用;
    状态="正常";
    Linux、phandle =<0xc5>;
    phandle =<0xc5>;
    };
    
    dsp2_CMA@9f000000{
    兼容="共享 dma-pool";
    reg =<0x0 0x9f000000 0x0 0x800000>;
    可重复使用;
    状态="正常";
    Linux、phandle =<0x12a>;
    phandle =<0x12a>;
    };
    
    cmem_block_mem@a0000000{
    reg =<0x0 0xa0000000 0x0 0xc000000>;
    无映射;
    状态="确定";
    Linux、phandle =<0x134>;
    phandle =<0x134>;
    };
    
    cmem_block_mem@b0000000{
    reg =<0x0 bb0000000 0x0 0xc000000>;
    无映射;
    状态="确定";
    Linux、phandle =<0x135>;
    phandle =<0x135>;
    };
    
    cmem_block_MEM2@40500000{
    reg =<0x0 0x40500000 0x0 0x100000>;
    无映射;
    状态="确定";
    };
    
    };
    
    cmem{
    compatible ="ti、cmem";
    #address-cells =<0x1>;
    #size-cells =<0x0>;
    #pool-size-cells =<0x2>;
    status ="确定";
    
    cmem_block@0{
    reg =<0x0>;
    memory-region =<0x134>;
    cmem-buf-pools =<0x1 0x0 0xc000000>;
    };
    cmem_block@1{
    reg = 0x1>;
    memory-region =<0x135>;
    cmem-buf-pools =<0x6 0x6000;0x360>};0x3600>
    
    

    CMem 负载正常、所有缓冲器在引导后都是空闲的

    root@am57xx-evm:~ cat /proc/cmem
    
    Block 0:pool 0:1 bufs size 0xc000000 (请求0xc000000)
    
    pool 0 Busy bufs:
    
    pool 0 free bufs:
    ID 0:phys addr 0xa0000000
    
    Block 1:pool 0:6 bufs size 0x96000 (请求0x96000)
    
    pool 0 Busy bufs:
    
    pool 0 free bufs
    ID: phys addr 0xbbf6a000
    id 1:phys addr bed4000
    id 2:phys addr bed4000
    id 3:phys addr 0xbbda8000
    id 4:phys addr 0xbbd12000
    id 5:phys addr 0xbbc7c000
    
    Block 1:pool 1:6 bufs size 0x3f5000 (0x3bd12000 id) f1
    
    :fbudf c6000:请求的
    
    空闲池
    ID 0:budf phys addr 0xbb887000
    id 1:phys addr 0xbb492000
    id 2:phys addr 0xbb09d000
    id 3:phys addr 0xbaca8000
    id 4:phys addr 0xb8b3000
    id 5:phys addr 0xb4be000 

    但 ti-mctd 无法在启动时启动、OpenCL 代码不起作用:

    3月30日00:57:16 am57xx-EVM systemd[1]:正在启动 TI 多核工具守护程序...
    
    
    `m30 00:57:17 am57xx-EVM ti-mctd[693]:CMEM 错误:分配堆:ioctl CMEM_IOCALLOAPCACHED 失败:-1 3 30 00:57:17 am57xx-EVM ti-mcctd[693]:TI-mcctd:/home/gtbldadm/processor-sdk-linux-krogoth-build/build-CORTEX_1/arago-tmp-external-linaro-toolchain/work/am57xx_evm-linux-gnueabi/opencl/1.1.12.0-r0.0/git/host/mct-demon/cmem_allocat 或.h:94:CSMC_ALADDR= FAILD (d_声明:memalloc_963_声明:memalloc_mem_al= memalloc_al_dated_
    

    尝试手动运行时:

    root@am57xx-evm:~
    
    
    `mti-mctd [341.836543] CMEMK 错误:ioctl:Failed to allocate heap buffer of size 0xc000000 CMEM 错误:allocchap:ioctl CMEM_IOCALLOCHESCAAPCACHED 失败:-1 ti-mctd:/home/gtbldadm/processor-sdk-linux-krogoth-build/build-CORTEX_1/arago-tmp-external-linaro-toolchain/work/am57xx_evm-linux-gnueabi/opencl/1.1.12.0-r0.0/git/host/mct-demon/cmem_allocator.h:94:Cmemallocator::Cmemaldcs_aldcs_als= FAIL_addr_
    已中止(转储内核) 

    我想为使用 cmem (并为其获取 dmabuf)分配缓冲区并将其用于 OpenCL 做什么?

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

    大家好、Konstantn、

    您是否能够运行 ti OpenCL 示例? 当内核启动时、TI-mctd 应该已经启动。 我怀疑您的问题可能与 ti-mctd 未运行有关。 忽略 OpenCL 运行中的 OMAP-nwmod 或 OMAP-mumuoutputs。


    Arago 项目 http://arago-project.org am57xx-EVM ttyS2

    Arago 2016.12 am57xx-EVM ttyS2

    am57xx-EVM 登录:root
    root@am57xx-EVM:~# ps -ef | grep ti-mctd
    根      608    1 0 00:56?        00:00:00 /usr/bin/ti-mctd
    根     1164 1159 01:04 ttyS2   00:00:00 grep ti-mctd
    root@am57xx-EVM:~# cd /usr/share/ti/examples/opencl/vecadd
    root@am57xx-evm:/usr/share/ti/examples/opencl/vecadd。/vecadd
    [479.784259] omap_hwmod:mu0_dsp2:_wait_target_disable 失败
    [479.790170] OMAP-IMU 41501000.MMU:41501000.MMU:版本3.0
    [479.797004] OMAP-iommu 41500.MMU:41500.MMU:3.0版
    [479.812336] OMAP_hwmod:mu0_dsp1:_wait_target_disable 失败
    [479.818243] OMAP-iommu 40d01000.MMU:40d01000.MMU:版本3.0
    [479.824307] OMAP-iommu 40d020.MMU:40d020.MMU:版本3.0
    器件:TI 多核 C66 DSP

    正在卸载8192K 元素的矢量添加...

    内核执行:排队 等待提交:14us
    内核执行:提交至开始:89us
    内核执行:开始 到结束  :29124us

    成功!
    root@am57xx-EVM:/usr/share/ti/examples/opencl/vecadd

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

    尝试更改 CMEM 配置(添加新的存储器区域和带块的池)。 OpenCL 将损坏。

    CMEM 配置时

       cmem{
          兼容="ti、cmem";
          #address-cells =<0x1>;
          大小单元格=<0x0>;
          #pool-size-cells =<0x2>;
          状态="正常";

          cmem_block@0{
             reg =<0x0>;
             MEMORY - REGION =<0x131>;
             cmem-buf-Pools =<0x1 0x0 0xc000000>;
          };

          cmem_block@1{
             reg =<0x1>;
             MEMORY - REGION =<0x132>;
          };
       };

    输出:

    [35.868787]  USB 3-1.1.1:使用 xhci-hcd 的新型高速 USB 器件编号4
    [ 确定 ]启动 TI 多核工具守护程序。
    [ 确定 ]已启动电话服务。
    .

    root@am57xx-evm:/usr/share/ti/examples/opencl/vecadd cat /proc/cmem

    块0:池0:1 bufs 大小0xc000000 (请求0xc000000)

    池0忙缓冲区:
    ID 0:PHY 地址0xa0000000 (缓存)

    池0免费 bufs:
    root@am57xx-evm:/usr/share/ti/examples/opencl/vecadd。/vecadd
    [3852.511708] omap_hwmod:mu0_dsp2:_wait_target_disable 失败
    [3852.517626] OMAP-IMU 41501000.MMU:41501000.MMU:版本3.0
    [3852.525792] OMAP-iommu 41500.MMU:41500.MMU:版本3.0
    [3852.541179] omap_hwmod:mu0_dsp1:_wait_target_disable 失败
    [3852.547083] OMAP-iommu 40d01000.MMU:40d01000.MMU:版本3.0
    [3852.554601] OMAP-iommu 40d020.MMU:40d020.MMU:版本3.0
    器件:TI 多核 C66 DSP

    正在卸载8192K 元素的矢量添加...

    内核执行:队列 提交:15us
    内核执行:提交至开始:49us
    内核执行:开始 到结束  :29110us

    成功!
    root@am57xx-EVM:/usr/share/ti/examples/opencl/vecadd

    但是:当我将器件树中的 CMEM 配置更改为:

    保留存储器{
    (笑声)

          cmem_block_mem@a0000000{
             reg =<0x0 0xa0000000 0x0 0xc000000>;
             无地图;
             状态="正常";
             linux、phandle =<0x131>;
             相位=<0x131>;
          };

          my_cmem:cmem_block_mem@b0000000{
             reg =<0x0 bb0000000 0x0 0xc000000>;
             无地图;
             状态="正常";
          };

          cmem_block_mem@4050000{
             REG =<0x0 0x40500000 0x0 0x100000>;
             无地图;
             状态="正常";
             linux、phandle =<0x132>;
             相位=<0x132>;
          };
       };


       cmem{
          兼容="ti、cmem";
          #address-cells =<0x1>;
          大小单元格=<0x0>;
          #pool-size-cells =<0x2>;
          状态="正常";

          cmem_block@0{
             reg =<0x0>;
             MEMORY - REGION =<0x131>;
             cmem-buf-Pools =<0x1 0x0 0xc000000>;
          };

          cmem_block@1{
             reg =<0x1>;
             memory-region =<&my_cmem>;
             cmem-buf-Pools =<0x1 0x0 0xc000000>;
          };

          cmem_block@2{
             reg =<0x2>;
             MEMORY - REGION =<0x132>;
          };

       };

    重新编译 dtb 并重新引导,我在控制台中看到错误:

    [ 确定 ]已启动允许用户会话。
    [失败]无法启动 TI 多核工具守护程序。
    有关详细信息、请参阅'stemctl status ti-mct-demon.service'。
    [ 确定 ]已开始保存/恢复声卡状态。

    root@am57xx-EVM:~# systemctl status ti-mct-demon.service

    [[0;1;31mb[0m ti-mct-demon.service - TI 多核工具守护程序
      已加载:已加载(/lib/systemd/system/ti-mct-demon.service;已启用;供应商预设:已启用)
      活动:[0;1;31mfailed[0m (结果:核心转储),自 THU 2017-03-3000:57:17 UTC;1min 57s 前
     进程:661 ExecStart=/usr/bin/ti-mctd [[0;1;31m (代码=转储、信号= ABRT)[0m

    3月30日00:57:15 am57xx-EVM systemd[1]:正在启动 TI 多核工具守护程序...
    3月30日00:57:16 am57xx-EVM ti-mctd[661]:CMEM 错误:分配堆:ioctl CMEM_IOCALLOAPCCHEACHED 失败:-1
    3月30日00:57:16 am57xx-EVM ti-mctd[661]:TI-mctd:/home/gtbldadm/processor-sdk-linux-krogoth-build/build-CORTEX_1/arago-tmp-external-linaro-toolchain/work/am57xx_evm-linux-gnueabi/opencl/1.1.12.0-r0.0/git/host/mct-demon/cmem_allocat
    OR.h:94:CmemAllocator::CmemAllocator ():Assertion `mSMC_alloc_DSP_addr_= MSMC_addr'失败。
    3月30日00:57:17 am57xx-EVM systemd[1]:[[0;1;39mti-mct-demon.service:控制进程退出,代码=转储状态=6[0m
    3月30日00:57:17 am57xx-EVM systemd[1]:[[0;1;31m 启动 TI 多核工具守护程序。[[0m
    3月30日00:57:17 am57xx-EVM systemd[1]:[[0;1;39mti-mct-demon.service:单位进入失败状态。[[0m
    3月30日00:57:17 am57xx-EVM systemd[1]:[0;1;39mti-mct-demon.service:失败、结果为"核心转储"。[[0m

    root@am57xx-EVM:~# cat /proc/cmem

    块0:池0:1 bufs 大小0xc000000 (请求0xc000000)

    池0忙缓冲区:

    池0免费 bufs:
    ID 0:PHY 地址0xa0000000

    块1:池0:1 bufs 大小0xc000000 (请求0xc000000)

    池0忙缓冲区:

    池0免费 bufs:
    ID 0:phys addr bb0000000

    root@am57xx-EVM:~# cd /usr/share/ti/examples/opencl/vecadd
    root@am57xx-evm:/usr/share/ti/examples/opencl/vecadd。/vecadd
    CMEM 错误:registerAlloc: ioctl CMEM_IOCREGUSERR failed for phys addr 0xa0000000:-1
    TIOCL 致命错误:TI 多核工具守护程序(/usr/bin/ti-mctd)未运行。 启动守护程序后重新运行应用程序。 有关详细信息、请参阅用户指南。
    已中止(转储内核)

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

    让我来演示一下 CMEM 模块、然后返回给您。

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

    您好 Konstantin、

      如果添加额外的 CMEM 块、请将其添加到前2个 CMEM 块之后。  OpenCL 将使用前2个 CMEM 块:一个 DDR、一个 OCMC、其余仅供使用。  在下一个 PSDK 版本中、OpenCL CMEM 块使用情况将在 JSON 配置文件中进行寻址、您可以更改该文件。  目前、您可以执行、

    cmem {...
    
    cmem_block@0{ 
    (笑声) // DDR 块

    cmem_block@1{
    (笑声) // OCMC 块

    cmem_block@2{
    (笑声) //您的块

       或者、因为您已经在使用 OpenCL。  如果您只需要在 CMEM 中获取一些存储器、则可以使用 OpenCL 存储器分配(所有存储器分配在 CMEM 块中):

    1) 1)创建 OpenCL 缓冲区、用于主机访问的读取/写入/映射/取消映射、或

    2) 2)使用 TI-extension __malloc_DDR()/__free_DDR(),然后使用 use_host_ptr 属性创建缓冲区以进行 DSP 访问。

    有关详细信息、请参阅我们的 OpenCL 用户指南:

    如果您需要更多的存储器供 OpenCL 使用、只需增加 DTS 文件中的 CMEM 块大小。

    -元

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你能抽出时间。
    在调试模式下重建 cmemk 并比较日志后如何找到解决方案。

    Cmemk 有一些错误:当我创建3个池时、例如:

    cmem{
    (笑声)
    cmem_block@0{
    reg =<0x0>;
    MEMORY - REGION =<0x131>;
    cmem-buf-Pools =<0x1 0x0 0xc000000>;
    };
    cmem_block@1{
    reg =<0x1>;
    MEMORY - REGION =<0x132>;
    };
    cmem_block@2{
    reg =<0x2>;
    memory-region =<&my_cmem>;
    cmem-buf-Pools =<0x6 0x0 0x96000>、<0x6 0x0 0x3f5000>;
    };
    };


    我在/proc/cmem.中看不到 cmem_block@2 这欺骗了我。 今天、我使用 CMEM_LOCAT2在块2中进行了分配、它正常工作。

    我需要用于获取 dmabuf 的 cmem 缓冲区、并且可以在不使用复制的情况下使用 OpenCL。 我尝试从__malloc_ddr()中导出指针的 abuf,但它不起作用。

    www.khronos.org/.../cl_arm_import_memory.txt
    此扩展将是 OpenCL 实现的良好功能。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴 CMEM 部件能够正常工作。 我看了 ARM 扩展、我认为我们基本上有相同的想法、即将预分配的器件存储器导入到 OpenCL 应用程序中、这样就会有零副本。 TI 扩展由__malloc_ddr()和使用 use_host_ptr 属性创建的缓冲区实现。

    我对 dma_buf 不了解太多。 它是否需要在内核空间中进行一些初始化? ARM 扩展似乎区分了 DMA_buf 存储器和主机存储器。 我不知道差异的重要性、因为我对 dma_Buf 不了解太多。 但是、如果您可以通过拥有自己的 CMEM 块来实现相同的效果、我不明白为什么您无法使用 OpenCL 运行时分配的 CMEM 存储器来实现它。 它们毕竟是 CMEM 存储器。 DMA_buf 接口是否可能需要存储器的物理地址而不是虚拟地址? __malloc_ddr()执行 CMEM 内存分配,但将映射的虚拟地址返回到 ARM。 如果 dma_Buf 需要物理地址、则可以调用某些 CMEM API 以获取物理地址。

    -元