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
我的问题是:
- 是否有必要在 Cortex-A72 上启用 SCU,如何实现?
- 使用 dma 访问设备时还需要注意什么?
我找到了解决问题的方法:
在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。
我正在为 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
我的问题是:
- 是否有必要在 Cortex-A72 上启用 SCU,如何实现?
- 使用 dma 访问设备时还需要注意什么?
我找到了解决问题的方法: 在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。