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:IPU 的 CMA 页面对齐

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/632538/linux-am5728-cma-page-alignment-for-ipu

器件型号:AM5728
主题中讨论的其他器件:DRA752

工具/软件:Linux

大家好、我一直在使用基于 AM5728的设计、我们对 AM57x EVM 的主要更改之一是、我们只使用256MB RAM (地址范围为0x80000000至0x90000000)、而不是2GB。  因此、我们在 PSDK4内核配置中禁用了 ARM LPAE。  我已经用一个最小的映像(PSDK4中的 Arago 文件)让电路板引导到 Linux 终端、并且我正在着手开发我们计划使用的其余片上外设、从 IPU (用于 IVA-HD 解码器)开始。  由于我们计划的应用是多媒体密集型的、因此我打算使用与 EVM 相同的内存空间量(如果这已经过多、我会很感激)。  但是、我将会遇到该错误

[引用] CMA 区域的对齐不正确[/引用]

我从 https://stackoverflow.com/questions/4888067/how-to-get-linux-kernel-page-size-programmatically 上注意到 、可以通过将"/proc/meminfo:Mapped"除以"/proc/vmstat:nr_Mapped"来找到页面大小、在我的案例中、结果为

[引述]

root@am57xx-EVM:~# cat /proc/meminfo | grep mapped
映射:9520KB
root@am57xx-EVM:~# cat /proc/vmstat | grep nr_mapped
NR_MAPPED 2371

[/报价]

9520kB/2371 = 4KB

与 ARM 为 ARMv7的有效非 LPAE 页面大小指定的匹配项:  

我的.config 文件还指定 CONFIG_CMA_alignment 值= 8、这意味着256页对齐、即4KB * 256 = 1MB 内存对齐。

我提出 IPU 的策略是将 CMA 缓冲区的开头放置在可被1MB 除的空间、然后使用与 EVM 相同的缓冲区长度。  我的定位策略与 EVM 类似、我将其放置在 RAM 顶部附近、U-Boot 放置器件树的位置下方(在我的情况下、这意味着我的 CMA 缓冲区必须结束于0x8def4000以下)。

我的 CMA 缓冲区为:  

ipu2_CMA_pool:ipu2_CMA@8a600000{
compatible ="shared-DMA-pool";
reg =<0x0 0x8a600000 0x0 0x3800000>;
reusable;
status ="确定";
};

ipu1_CMA_pool:ipu1_cma@88600000{
compatible ="shared-DMA-00000"



;reg = 0x860000";ature= 0x8600000";ature=0x8600000"= 0x8600000" 

进行了比较

ipu2_CMA_pool:ipu2_CMA@95800000{
compatible ="shared-DMA-pool";
reg =<0x0 0x95800000 0x0 0x3800000>;
reusable;
status ="确定";
};

dsp1_CMA_pool:dsp1_CMA@






@99000000{compatible ="shared-DMA-pool";0x000000 = 0x400000000;i400000-reg



= 0x400000-reuse_pool = 0x000000;i400000-rk = 0x400000-rg";i4000-rgr = 0x400009000000 = 0x400000-rgr = 0x400009000000;i4000-rk = 0x40000ngr = 0x40000ngr = 0x40000ngr;i40000gr;
};

dsp2_CMA_pool:dsp2_CMA@9f000000{
compatible ="shared-DMA-pool";
reg =<0x0 0x9f000000 0x0 0x800000>;
可重复使用;
status ="确定";
};
}; 

但是、当我尝试引导时、我会收到上面提到的错误。  相关日志部分如下所示:  

[引述]

##当前堆栈结束于0x8df11a00 *内核:cmdline 映像地址= 0x82000000
##跳过 init Ramdisk
##无初始化 Ramdisk
RAMDISK START = 0x00000000、RAMDISK END = 0x00000000
* FDT:cmdline 映像地址= 0x88000000
##在88000000时检查'FDT'/'FDT Image'
错误的拟合格式:无说明
* FDT:原始 FDT blob
###展开的设备树 blob、88000000
使用0x88000000处的 FDT blob 进行引导
0x88000000大小为0x00018dbe 时的 TO_FULL_TREE
argc=3的初始值
argc=3的最终值
未指定## FIT 配置
使用:FDT
## initrd 高= 0x90000000、copy_to_ram = 1.
RAMDISK LOAD START = 0x00000000、RAMDISK LOAD END = 0x00000000
##设备树(88000000)... 88018dbd (len=114110 [0x1BDBE])
正在将设备树加载到8def4000,结束8df0fdbd... 好的
argc=3的初始值
argc=3的最终值
更新属性"/ocp/ethernet@48484000/slave@48480200/mac-address"= D4 36 39 fc 4b 3e.
更新属性"/ocp/ethernet@48484000/slave@48480200/ local-mac-address"= D4 36 39 fc 4b 3e.
更新属性"/ocp/ethernet@48484000/slave@48480300/mac-address"= D4 36 39 fc 4b 3f
更新属性"/ocp/ethernet@48484000/slave@48480300/local-mac-address"= D4 36 39 fc 4b 3f
##正在将控制权转移到 Linux (地址82000000)...

正在启动内核...

[0.000000]在物理 CPU 0x0上引导 Linux
[0.000000] Linux 版本4.9.28-geed43d1050 (Tom@tom-ThinkPad-P50s)(gcc 版本6.2.1 20161016 (Linaro GCC 6.2-2016.11))#5 SMP 优先于 Mon Oct16 18:08:23 EDT 2017
[0.000000] CPU:ARMv7处理器[412fc0f2]修订版2 (ARMv7)、CR=10c5387d
[0.000000] CPU:可用的 div 指令:修补分部代码
[0.000000] CPU:PIPT/VIPT 非混叠数据高速缓存、PIPT 指令高速缓存
[0.0000M]、共个:FDT:机器模型:Tom 的定制板
[0.000000]引导控制台[earlycon0]已启用
[0.000000] EFI:从 FDT 获取 EFI 参数:
[0.000000] EFI:未找到 UEFI。
[0.000000]保留的内存:CMA 区域对齐错误
[0.000000]保留的内存:CMA 区域对齐错误
[0.000000] CMA:保留0x8e400000处的24 MIB
[0.000000]内存策略:数据高速缓存 writealloc
[0.000000] OMAP4:将0x8fe00000映射到 DRAM 隔离层的 fe600000
[0.000000] DRA752 ES2.0
[0.000000]% pu:嵌入式13页/CPU @cfd80000 s22092 r8192 d22964 u53248
[0.000000]在区域顺序和移动分组中构建了1个区域列表。 总页数:60352页
[0.000000]内核命令行:console=ttyO2,115200n8 debug arlyprintk=ttyO2,115200n8,keep loglevel=7 log_buf_len=16000 initcall_debug time root=PARTUUUUID=79beccd-02 rootfstype=ext4 rootwait
[0.000000] PID 哈希表条目:1024 (顺序:0、4096字节)
[0.000000]条目高速缓存散列表条目:32768 (顺序:5、131072字节)
[0.000000] inode 高速缓存散列表条目:16384 (顺序:4、65536字节)
[0.000000]内存:114168K/243712K 可用(7168K 内核代码、312K rwdata、2412K rodata、1024K init、292K BSS、 104968K 保留、24576K CMA 保留、0K HIGHMEM)
[0.000000]虚拟内核内存布局:
[0.000000]矢量:0xff0000-0xff1000 (4KB)
[0.000000] fixmap:0xc00000 - 0xc00000 (3072 KB)
[0.000000] vmalloc:0xd0800000 - 0x0x800000 (752MB)
[0.000000]低内存:0xC0000000 - 0xd0000000 (256 MB)
[0.000000] pkmap:bbfe00000 - 0xC0000000 (2 MB)
[0.000000]模块:bbf000000 - bbbfe00000 (14 MB)
[0.000000].text:0xc0008000 - 0xc0800000 (8160 KB)
[0.000000].init:0xc0b00000 - 0xc0c00000 (1024KB)
[0.000000].data:0xc0c00000 - 0xc0c4e360 (313 KB)
[0.000000].bss:0xc0c50000 - 0xc0c992b0 (293 KB)
[0.000000] slub:HWalign=64、order=0-3、MinObjects=0、CPU=2、Nodes=1
[0.000000]可抢占的分层 RCU 实现。
[0.000000]叶扇出的生成时间调整为32。
[0.000000] NR_IRQ:16 nr_IRQ:16 16.
[0.000000] OMAP 时钟事件源:Timer1为32786Hz
[0.000000] ARM_ARCH_TIMER:构建了以6.14MHz (PHY)运行的 cp15计时器。
[0.000000]时钟源:arch_sys_counter:mask:0xffffffffffffffffffffffffff max_cycles:0x16af5adb9、max_idle_ns:440795202250 ns
[0.000006] sched_clock:6MHz 时为56位、分辨率为162ns、每4398046511023ns 换行一次
[0.008308]切换到基于计时器的延迟环路、分辨率为162ns
[0.014950]时钟源:32K_COUNTER:MASK:0xFFFFFFFF max_cycles:0xFFFFFFFF、max_idle_ns:58327039986419 ns
[0.025212] OMAP 时钟源:32768Hz 时为32K_COUNTER
[0.030992]控制台:彩色虚拟设备80x30
[0.035662]警告:'console=ttyO2'已被'ttyS2'替代
[0.042457]这可确保您仍能看到内核消息。 请
[0.048974]更新您的内核命令行。
[0.053373]校准延迟环路(跳过)、使用计时器频率计算的值。 12.29茂物剪(lpj=61475)
[0.064012] pid_max:默认值:32768最小值:301
[0.068957]安装高速缓存散列表条目:1024 (顺序:0、4096字节)
[0.075844] mountpoint-cache 哈希表条目:1024 (顺序:0、4096字节)
[0.084026] CPU:测试写入缓冲器一致性:好的

[/报价]

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

    您好、Tom、

    设备树文件中的页面大小计算和 CMA 配置似乎正确。 但是:
    CMA 区域对齐不正确
    错误消息文件由./linux/latest/source/drivers/base/dma-contiguous.c 文件打印。
    作为调试的第一步,我建议您先打印 rmem -> basermem -> size mask 的值,然后再打印:


    if ((rmem->base & mask)||(rmem->size & mask)){
    PR_ERR ("保留的存储器:CMA 区域的对齐不正确\n");
    return -EINVAL;


    导致错误的值 rmem->base 或 rmem->size。
    使用补丁解决问题还有一种方法、但 TI 未对其进行测试。 以下是此补丁的链接:
    patchwork.kernel.org/.../

    BR
    Tsvetolin Shulev

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

    啊、是的、我错过了这个。  我将 CMA 缓冲区分别移动到0x88400000和0x8a400000处。  现在、当我启动时、我获得了以下内容:  

    [引述]

    [0.000000]保留存储器:创建了0x88400000、大小为32 mib 的 CMA 存储器池

    [ 0.000000]、共:保留内存:已初始化节点 ipu1_CMA@88400000、兼容 ID shared-dma-pool

    [0.000000]保留存储器:创建了0x8a400000、大小为56 MIB 的 CMA 存储器池

    [ 0.000000]、共:保留内存:已初始化节点 ipu2_CMA@8a400000、兼容 ID shared-dma-pool

    [0.000000] CMA:保留0x8e400000处的24 MIB

    [/报价]

    但是、我注意到我的辅助 CPU 不再启动。  我一直在研究这可能是什么原因、但我不确定它是否与 CMA 有关?  除非我将 CMA 缓冲区分配到 CPU 用来在启动前写入某些信息的空间中。  但我注意到、CPU 启动、然后因超时而无法联机。  我收到消息"CPU1:无法联机"

    在 arch/arm/kernel/smp.c 中:

    /*
    现在将 CPU 带入我们的世界。
    */
    ret = SMP_OPS.SMP_BOOT_secondary (CPU、IDLE);
    如果(ret =0){
    //
    * CPU 已成功启动,请等待它
    *联机或超时。
    //
    wait_for_completion_timeout (&cpu_running、
    mss_to _jiffies (1000));
    
    if (!cpu_online (CPU)){
    pr_crit ("cpu%u:failed to bonline\n"、cpu);
    ret =-eO;
    }
    else{
    pr_err("cpu%u:failed to boot:n"、cpu"
    、}CPU) 

    然后内核 OOPSes 和 dies。

    oops/Panic 日志显示此崩溃与 DMA 有关、这是有道理的、因为这是我唯一更改的内容。  由于一些实验、我注意到当缓冲区较小时、引导会进一步开始。  这让我相信、我不小心将 CMA 缓冲区放置在 CPU1启动所需的一些空间中。  对于 ARM 上的 DMA/CMA/引导内核而言、我是否可以通过某种方式确定这些必要的存储器空间?

    其他问题。  如果我要使用与 EVM 在 PSDK4中相同的存储空间量、这会占用相当大的可用存储器块。  是否需要此尺寸?   

    此外、我还使 CMA 缓冲区变得非常小(每个4MB)、并发现我的主板将启动。  我还附加了相关日志、包括/proc 中有关 CPU 和内存的内容。

    e2e.ti.com/.../g3_5F00_linux_5F00_cma_5F00_allocated.log

    e2e.ti.com/.../g3_5F00_linux_5F00_small_5F00_cma.log