ARM Cortex-A72 上 DMA 设备访问的缓存配置

Cache configuration for DMA device access on ARM Cortex-A72

我正在为 raspberry pi 编写操作系统。 我的自定义 sdhost 控制器 (emmc2) 的 sdcard 驱动程序有问题 树莓派 4(Cortex-A72、ARMv8-A、bcm2711 芯片组)。 不使用 sdma 一切正常。用sdma,读可以,但是写扇区后,sdcard上的数据有时会出现无效数据。

对于 sdma 数据传输,我使用具有设备类型内存属性 (nGnRnE) 的传输缓冲区。当我使用新的数据缓冲区进行 dma 写入传输时,sdcard 上的数据是正确的。但是当我为下一次写入重新使用相同的缓冲区时,sdcard 上的扇区部分包含来自先前缓冲区内容的数据。

这可能是缓存一致性问题。我已启用所有缓存(I 和 D)。 ARM的手册里面有讲到SCU(snoop control unit),不知道有没有关注过SCU

我的问题是:

我找到了解决问题的方法: 在raspberry pi4(bcm2711芯片)上,写入dma引擎寄存器的物理地址必须是legacy master地址。传统主地址在 0xC0000000-0xFFFFFFFF 范围内。所以我必须将 0xC0000000 添加到写入 sdhci 控制器寄存器的物理地址值中。

可在此处找到文档: https://datasheets.raspberrypi.org/bcm2711/bcm2711-peripherals.pdf 1.2.地址映射 1.2.4.遗留主地址

另一个 SCU 问题的答案是:启用缓存后,无需在 Raspberry Pi 4 上启用 SCU。