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:分配大型 CMEM 缓冲区时出错

Guru**** 2561540 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/621094/linux-am5728-error-allocating-large-cmem-buffer

器件型号:AM5728

工具/软件:Linux

以前我使用 CMEM 创建两个16M 池。 当我将其更改为128M 时、当我尝试加载/启动 DSP 时会出现错误;请参阅下面的内容。 我可以做些什么来成功完成这项工作?

[90.080869] remoteproc2:为40800000.DSP 加电
[90.085760] remoteproc2:引导 FW 映像 dra7-dsp1-fw.xe66、大小为16233880
[90.100167] OMAP_hwmod:mu0_dsp1:_wait_target_disable 失败
[90.106067] OMAP-iommu 40d01000.MMU:40d01000.MMU:版本3.0
[90.111996] OMAP-iommu 40d020.MMU:40d020.MMU:版本3.0
[90.118014] OMAP-rproc 40800000.dsp:dma_alloc_相干 错误:134217728
[90.124705] remoteproc2:处理资源失败:-12
[90.137312] omap_hwmod:mu1_dsp1:_wait_target_disable 失败
[90.150247] OMAP_hwmod:mu0_dsp1:_wait_target_disable 失败
[90.156229] remoteproc2:rproc_boot()失败-12
[90.161225] virtio_rpmsg_bus:virtio0的探测失败,错误-12
[90.168642] remoteproc2:registered virtio0 (type 7)

CMEM 器件树分配:

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

/* 0xf000_0000 - 0xf7ffff */
cmem_block_mem_0:cmem_block_mem@f0000000{
REG =<0x0 0xf0000000 0x0 0x08000000>;
无地图;
状态="正常";
};

/* 0xf800_0000 - 0xffff */
cmem_block_mem_1:cmem_block_mem@f80000{
  reg =<0x0 0xf8000000 0x0 0x08000000 >;
  无地图;
  状态="正常";
};

};

cmem{
  兼容="ti、cmem";
  #address-cells =<1>;
  #size-cells =<0>;

  #pool-size-cells =<2>;

  状态="正常";

  /*池0 - DSP1的 FPGA 缓冲器*/
  cmem_block_0:cmem_block@0{
    reg =<0>;
    memory-region =<&cmem_block_mem_0>;
    cmem-buf-Pools =<1 0x0 0x08000000>;
  };

  /*池1 - DSP2的 FPGA 缓冲器*/
  cmem_block_1:cmem_block@1{
    reg =<1>;
    memory-region =<&cmem_block_mem_1>;
    cmem-buf-Pools =<1 0x0 0x08000000>;
  };

};

内核命令行添加:

memmap=128M$0xf0000000

memmap=128M$0xf8000000

CMEM 信息:

bash-4.3# cat /proc/cmem

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

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

池0免费 bufs:

池-1免费 bufs:

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

池0忙缓冲区:
ID 0:phys addr 0xf8000000 (非缓存)

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

    您能否在 u-boot 阶段停止电路板、执行 printenv 并共享结果?

    如果存在 mem =##参数、我特别感兴趣。

    您还可以指定您使用的 SDK 版本吗?

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

    [引用用户="Yordan Kovachev"]

    您能否在 u-boot 阶段停止电路板、执行 printenv 并共享结果?

    如果存在 mem =##参数、我特别感兴趣。

    您还可以指定您使用的 SDK 版本吗?  

    [/报价]

    我正在使用 SD 03.03..00.04。 这里是 printenv 输出-请注意、我在这里根本没有"mem="(我删除了"memmap="、因为它没有修复任何内容):

    uBoot_FLAG = 0
    arch = ARM
    args_mmc=run finduid;setenv bootargs console=ttyS2,115200n8 vmalloc=512M root=/dev/mmcblk0p2 rw;rootfstype=ext4 rootwait
    波特率=115200
    电路板=am572x_custom
    Board_name=am572x_custom
    bootcmd=if test ${dofastboot}-eq 1;then echo Boot fastboot requested、resetting dofastboot ...;setenv dofastboot 0;saveenv;echo Booting into fastboot ...;fastboot;fi;run findfdt;运行 envboot;运行 mmcboot;setenv mmcdev 1;setenv strod 1;mmcroot 2;/dev/mmcblk0p2运行 mmcrw vs 1:
    BOOTDELAY=1
    bootdir=/curry_rootfs/boot
    bootenvfile=uEnv.txt
    BootFile=zImage
    BOOTM_SIZE=0x10000000
    bootpart=0:2
    bootscript=echo 正在从 MMC${mmcdev}...;源${loadaddr}运行的 bootscript
    console=ttyS2,115200n8.
    CPU=armv7
    dfu_alt_info_eMMC=rawemmc raw 0 3751936;引导部分1;rootfs 部分1 2;mlo fat 1;ml.raw 0x100 0x100;u-boot.img.raw 0x300 0x400;spl-os-args.img raw 0x80 0x80;spl-os-image-raw 0x100;u-boot.g1;splfat 1;splfat 1 uEnv.txt raw 0xfat 1;spl- raw 0xfat 1;splfat 1
    dfu_alt_info_mmc=boot part 0 1;rootfs part 0 2;mlo fat 0 1;ml.raw 0x100 0x100;u-boot.img.raw 0x300 0x400;spl-os-args.raw 0x80 0x80;spl-os-image.fat raw 0x900;spl-os-os-gfat 1;fat 0 uEnv.txt
    dfu_alt_INFO_QSPI=MLO RAW 0x0 0x010000;mlos.Backup1 RAW 0x010000 0x010000;mlos.Backup2 RAW 0x020000 0x010000;ml.backup3 RAW 0x030000 0x010000;u-boot.img RAW 0x040000 0x10000;u-boot-spl-raw 0x00000 0x0000-08000000 0x0000-0x08000000;u-boot.img RAW RAW 0x10000;u-boot-raw 0x0000-08000-08000-08000-08000000 0x0000 0x0000 0x0000.img RAW 内核0x00000;u-boot-8000-08000-0800nv-0x08000;u-boot-0x08000
    dfu_alt_info_ram=内核 ram 0x80200000 0x4000000;fdt ram 0x80f80000 0x80000;ramdisk ram 0x81000000 0x4000000
    DFU_bufsiz=0x10000
    dofastboot=0
    ENV_file_flag=1
    envboot=MMC dev ${mmcdev};如果 MMC 重新扫描;然后回显在器件${mmcdev}上找到的 SD/MMC;如果运行 loadbootscript;然后运行 bootscript;否则运行 loadbootenv;然后从${bootenvfile}回显 loadenv;运行 memboobootenv;如果运行 memboovenv;然后从${vcmd}ufi;envenvenvip;envip;envenvip;如果运行
    eth1addr=7c:EC:79:A1:0d:0d
    ethact=cpsw
    ethaddr=7c:EC:79:A1:0d:0c
    FDT_addr_r=0x88000000
    fdtaddr=0x88000000
    fdtfile=am572x-custom.dtb
    findfdt=if test $board_name = am572x_custom; then setenv fdtfile am572x-custom.dtb;fi;if test $board_name = am572x_custom_evm; then setenv fdtfile am572x-custom-evm.dtb;fi;if test $fdtfile = undefined;then setenv fdtv-custom-evm_dtb;then setv-custom
    finduuid=part uuid MMC ${mmcdev}:2 uuid
    importbootenv=echo 从 MMC${mmcdev}导入环境...;env 导入-t ${loadaddr}${filesize}
    kernel_addr_r=0x82000000
    loadaddr=0x82000000
    loadbootenv=fatload MMC ${mmcdev}${loadaddr}${bootenvfile}
    loadbootenvfromemmc=加载 MMC ${bootpart}${loadaddr}${bootdir}/${bootvfile}
    loadbootscript=fatload MMC ${mmcdev}${loadaddr}boot.scr
    loadfdt=load MMC ${bootpart}${fdtaddr}${bootdir}/${fdtfile};
    loadimage=load MMC ${bootpart}${loadaddr}${bootdir}/${bootfile}
    mmcboot=MMC dev ${mmcdev};如果测试-e MMC ${mmcdev}uboot.env;那么;否则 saveenv;fi;如果 MMC 重新扫描; 然后回显在器件${mmcdev}上找到的 SD/MMC;如果运行 loadimage;然后运行 loadfdt;回显从 MMC${mmcdev}引导...;运行 args_mmc;bootz ${loadaddr}-${fdtaddr};fi;
    mmcdev=1
    mmcroot=/dev/mmcblk0p2 rw;
    mmcrootfstype=ext4 rootwait
    netargs=setenv bootargs console=${console}${optargets}root=/dev/nfs nfsroot=${serverip}:${rootpath}、${nfsopts}RW IP=DHCP
    netboot=echo Booting from network...;setenv autoload no;dhcp;run netloadimage;run netloadfdt; 运行 netargs;bootz ${loadaddr}-${fdtaddr}
    netloadfdt=tftp ${fdtaddr}${fdtfile}
    netloadimage=tftp ${loadaddr}${bootfile}
    nfsopts=nolock
    partitions=uuid_disk=${uid_gppt_disk};name=rootfs、start=2MiB、size=-、uid=${uid_gppt_rootfs}
    ramdisk_addr_r=0x88080000
    读数地址= 0x88080000
    rootpath=/export/rootfs
    scsidevs=0
    SoC=omap5
    static_ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off
    stderr=串行
    stdin =串行
    stdout=串行
    USBnet_devaddr=7c:EC:79:a0:8c:7c
    usbtty=CDC_ACM
    供应商= TI
    ver = U-Boot 2016.05-00319-g8d0b2ca-m脏(2017年5月23日- 16:32:41 -0400)
    VRAM=16M

    环境大小:4248/65532字节

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Gerard、您好!
    正如 Yordan 提到的、您需要在命令行参数中添加"mim"分配。
    请查看下面的 wiki 页面,该页面介绍了有关 cmem 分配的更多信息:
    processors.wiki.ti.com/.../CMEM_Overview

    此外、当您增加 cmem 分配时、它可能会与 DSP 存储器重叠。 因此、您需要重新排列存储器分配。

    希望这对您有所帮助。

    谢谢、
    Prabhuraj
    Black胡椒 技术
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、请尝试向 u-boot 环境参数或在 am572x_evm.h 中添加 mem=##

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

    [引用 user="Yordan Kovachev"]是的、请尝试在 u-boot 环境参数中或在 am572x_evm.h 中添加 mem=##

    [/报价]

    我已经尝试执行此操作、但在大多数情况下、Linux 内核无法启动。 请注意、此定制板上有4GB 的 DDR 内存。 理想情况下、我想告诉 Linux 它有3.5GB、剩下的0.5GB 用于 DSP。

    当通过 U-Boot 环境添加到 Linux 命令行时、此操作无法引导:

    MEM=1024M@0x8000000

    MEM=1G@0x8000000

    MEM=1536M@0x8000000

    MEM=1536M@0x200000000

    MEM=3584M@0x200000000

    这引导了我、但我不满意、因为它仅为512M:

    MEM=512M@0x8000000

    有什么想法吗?

    谢谢

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

    设备树中配置的 DDR 内存大小是多少? 您是否配置了4GB?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="SAI Prasad"]
    设备树中配置的 DDR 内存大小是多少? 您是否配置了4GB?

    [/报价]

    我可以包含一些与 DDR 存储器相关的特定器件树节点-您感兴趣的是哪些节点?

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

    在我看来、您正在为您的应用程序 DSP1和 DSP2 FPGA 分配前两个块。 请避免使用前2个块、因为它们是为 OpenCL 保留的。 请参阅 e2e.ti.com/.../604490中 CMEM 的说明

    雷克斯