本文主要来自:
https://www.cnblogs.com/DF11G/p/17341493.html
https://blog.csdn.net/alex_mianmian/article/details/120240748
加上自己的理解
背景
遇到iATU源于自己一段DPU的工作经历,需要集成PCIe的IP,S家的PCIe控制器里面有iATU,结果将PCIe地址和Device侧地址终于搞明白了。
iATU的概念
首先网上找来的一段,解释的比较好
iATU:
1、iATU是内部地址转换单元。它将PCI地址转换为设备内部地址。
例如,PCI/PCIe板卡,板卡上有DDR和SoC。并且板卡上具有SoC设备和DDR的内部地址。
这个内部地址空间不同于PCI域的地址。PCI域的地址由主机在扫描板卡时指定(通过bar映射)。
如果主机想要直接访问板卡上的 DDR,需要板卡上的iATU 将PCI地址转换为内部地址。
总之,可以理解为:PCI地址==PCI域的地址
2、iATU映射方向:
iATU可以进行入站和出站映射。
入站映射是PCI地址到内部地址的映射。
出站映射是指向PCI地址的内部地址。
3、iATU映射模式:
在设备上,iATU支持两种映射模式,地址匹配模式和BAR匹配模式。
1)、对于地址匹配模式:
PCI地址------映射------内部地址
这需要PCIe扫描之后,Host分配地址之后,完成的。
PCIe分配地址之后,这时候板卡在PCIe域的地址才确定下来,这时候就需要板卡上的 Soc(如果有的话),进行PCIe地址和板卡地址的映射。
2)、对于BAR匹配模式:
BAR编号------映射------内部地址
一般来说,如果板卡具有SoC,SoC上的Firmware将使用BAR匹配模式配置iATU映射。不要让主机端驱动程序配置它(主机程序也可以实现,这需要将iATU映射到bar的固定地址)。这一般是在设计时就规划好,直接写死。
具体场景分析
待补充