工具/软件:
我正在尝试使用 SDK9.03、在 AM57x 上从使用 CMEM 过渡到使用 DMA-heap/dma-bufs。
现有应用程序在用于 DSP1 的 OCMC 中有一个内存 CMEM 区域、此内存在 DSP 和 ARM 之间共享。 存储器分为不同的区域、并且当特定区域的控制从一个处理器转移到另一个处理器时、DSP 和 ARM 会使缓存无效。 就 CMEM 而言、有一个存储器区域、但 DSP 和 ARM 使用的大约 40 多个不同的较小区域。
我已经尝试使用 dma-heap、添加了一个保留的内存区域、并看到了相应的/dev/dma_heap/my_reserved_memory 器件文件。 alloc ioctl 可用于获取 dma-buf、同步 ioctls 可用于控制整个保留存储器区域的高速缓存。 这对于简单的演示来说是可以的、但对于现有应用来说是不够的。
我希望 alloc ioctl 实际上可以分配一部分保留的内存,但这似乎不是这样的情况。 只有一个存储器块、不清楚如何将其分成几个部分。 同步 ioctls 似乎仅在 dma-buf 的整个存储器块上运行。
可以指定多个保留的存储器区域(最多 7 个具有默认内核代码、或者更改为#define 和重建内核的存储器)、但似乎必须在设备树中放入比预期更多的信息。
是否可以指定池详细信息以便 dma-heap 池是多个块而不是一个块? 似乎 genalloc 系统有一定的能力支持这种设备,但 carveout-dma-heap 代码似乎没有利用这一点。
Linux 用户程序如何无需在器件树中指定低级详细信息即可获得对存储器特定区域的缓存控制? 这是 cmem 实现的。 如何使用 dma-heap 和 dma-bufs 来实现这一点? 我是否误解了 dma-heap/dma-buf 的功能? 是否 唯一可用的 替代方案是保留 40 多个 DMA 堆内存区域?