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.

[参考译文] SK-AM62A-LP:如何缩小或移除 IO TLB's 存储器大小?

Guru**** 2399305 points
Other Parts Discussed in Thread: AM62L

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1485153/sk-am62a-lp-how-could-we-smaller-or-remove-the-io-tlb-s-mem-size

器件型号:SK-AM62A-LP
主题中讨论的其他器件:AM62L

工具与软件:

尊敬的 TI:
使用 sdk10.01时、我发现软件 IO TLB 将 在 DDR 中分配64MB。 有必要吗?
由于我们的 DDR 大小仅为1GB、因此我们需要减小或移除该模块。
我如何禁用此模块?


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

    您好!

    我们需要花一点时间来研究软件 IO TLB。

    同时、

    1) 1)您是否 对 MCU R5F 进行编程?

    如果没有、则可以通过删除 mcu_r5fss0_core0_dma_memory_region 和 mcu_r5fss0_core0_memory_region 释放16MB 。 有关更多信息、请参阅 AM62Ax Academy 多核模块页面"禁用远程内核的方法"
    https://dev.ti.com/tirex/explore/node?node=A__AQ-QpkgF8ZwPsjGPTEQLPA__AM62A-ACADEMY__WeZ9SsL__LATEST 

    2) 2)您是否使用 edgeAI、摄像头/成像或者利用 C7和 DM R5F 内核的任何其他功能?

    如果是、您正在使用哪些功能?

    此致、

    Nick

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

    是的、我们使用 edgeai 和摄像头成像。 所以我们需要更大的 DDR 存储器。 但我们仍使用 MCU R5F。那么、有没有其他方法来缩小软件 IO TLB?

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

    您好!

    我们将在这段旅程中共同学习。 您可以随时向该主题中添加任何感兴趣的内容。

    有关软件 IO TLB 的更多信息  

    此代码的实际用途是什么?

    这是生成这些打印的驱动程序:
    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/kernel/dma/swiotlb.c?h=ti-linux-6.6.y-cicd

    这是一个 软件反弹缓冲池、适用于需要 DMAable 存储器(连续、低存储器或其他约束)但没有可用 IOMMU 的器件。 那么... 这实际上意味着什么?

    当处理器中的某个对象想将 DMA 传输到某个无法访问的位置(例如、一个32位处理器尝试访问64位存储器地址、即"低内存"用例、其中回弹缓冲器需要位于0xFFFFFFF_FFFF 之前)时、使用"回弹缓冲器"。 我不确定是否有其他常见用例)。

    DMA 事务向回弹缓冲区复制数据、然后 Linux 本身在回弹缓冲区和不可访问的位置之间复制数据。 这显然需要更长的处理时间、因此如果使用 DMA 的外设或处理器可以自行访问目标位置、则不使用该选项。

    比较

    https://docs.kernel.org/core-api/swiotlb.html

    https://www.kernel.org/doc/gorman/html/understand/understand012.html 

    那么... 我们在您的 AM62Ax 设计中是否需要此内存分配?  

    现有 AM62x/AM62L/AM62Ax/AM62Px/AM64x/AM65x 上没有任何 IOMMU。 因此、如果系统中具有32位地址的某个部分试图以 DMA 方式访问大于0xFFFFF_FFFF 的地址、则理论上可以调用该驱动程序并使用该存储器。

    但是、您只使用1GB DDR。 因此、您的外设等最多只需要访问0x8000_0000 + 0x4000_0000 = 0xC000_0000、它仍处于32位空间中。

    据我所知、AM62Ax 上的 DMA 和外设都应该能够访问该32位存储器空间。 因此我不希望任何 TI 驱动程序实际使用软件 IO TLB 存储器区域。 (此断言可能是错误的-如果您遇到 DMA 问题、您可以始终重新启用该存储器区域、以查看行为是否得到解决)。

    如何修改此分配?  

    您可以使用 swiotlb= 内核命令行上的参数指定退回缓冲区的大小。 这里的单位是"平板"、我不确定它到底有多大。 您可以尝试在 swiotlb=1时跳过、看看会发生什么。

    https://www.kernel.org/doc/html/v6.6/admin-guide/kernel-parameters.html

    请注意、您仍然可以优化 MCU R5F 内核的存储器分配  

    更多详细信息、请参阅 AM62Ax Academy 多核模块的"存储器优化"部分。

    其他内存分配情况如何?  

    我希望能够更加明确地说明存储器区到底是如何使用的。 例如、如果我们确实需要 分配576MB 的 CMA、或者如果我们确实需要 edgeai_core_backs 为200MB+。

    此致、

    Nick

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

    尊敬的 TI:

    在 uboot 中添加命令 swiotlb=1。 但似乎 swiotlb 仍在 DDR 中使用64Mb mem。 此命令似乎没有用处。



    或者、如果我们无法禁用它、我们可以进行其他更改以更改其大小?

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

    请尝试通过内核命令行参数将该值传递给 Linux。 仅设置一个名为 swiotlb=1的 u-boot 变量是不够的。

    我今天不在办公室,但我会在本周晚些时候回来。

    此致、

    Nick

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

    我添加  

    CONFIG_CMDLINE="swiotlb=1"
    在  arch/arm64/configs/defconfig 中。  
    但 dmesg 似乎表明 IOTLB 仍然有64MB 内存。
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    如何将 swiotlb 添加到内核命令行

    在 uboot 中、请添加此行:

    setenv args_mmc 'run finduuid;setenv bootargs swiotlb=1 console=${console} ${optargs} root=PARTUUID=${uuid} rw rootfstype=${mmcrootfstype}'
    
    then you can check args_mmc with
    printenv

    其他说明  

    看起来驱动程序设置了 1MB 的最小分配。 我不确定是否有办法完全消除这个内存区域。

    请注意、TI 尚未对该修改进行全面测试、以确保不会出现任何中断。 能否确保代码按预期继续运行取决于您。

    您可以使用以下命令检查已从 Linux 终端将哪些参数传递到 Linux 中:

    $ cat /proc/cmdline

    是否有其他地方可以减少内存分配?  

    1) MCU R5F 是否使用在 MCU_r5fss0_core0_memory_region 中分配的整个15MB? 如果没有、请按上述方法减小存储器分配的大小

    2) 2) edgeai_RTOS_IPC_MEMORY_REGION 中似乎有一个16MByte 区域、称为 DDR_MCU_R5F_LOCAL_HEAP。 如果您已经使用固件生成器修改 EdgeAI 存储器分配、并且未在 MCU R5F 代码中使用该区域、则可以修改 python 脚本以将该区域的大小减小16MB。

    3)在 Linux 运行时,您可以调查使用 appMemPrintMemAllocInfo()分配的 edgeai_shared_region 有多少。 我被告知"通常所有的内存都是在设置流水线时分配的、而在流水线启动后保持不变"

    /**
     * \brief Print memory allocation from shared memory region
     *
     */
    void appMemPrintMemAllocInfo(void); 
    
    Header file:
    "usr/include/processor_sdk/app_utils/utils/mem/include/app_mem.h"
    Library:
    usr/lib/libtivision_apps.so

    此致、

    Nick