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

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.
工具与软件:
尊敬的 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
您好!
我们将在这段旅程中共同学习。 您可以随时向该主题中添加任何感兴趣的内容。
有关软件 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
您好!
如何将 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