我正在开发一个嵌入式PCIe系统,其中两个SoC连接在一起,主机是Root Complex,Slave是端点。主机将运行Linux。
通常,主机SoC提供内存窗口,其中映射端点BAR。这允许主机上的卡驱动程序读取/写入从站上的IO或内存。通常,Slave将包含内置在PCIe IP中的DMAC,它与PCIe地址和本地地址一起使用。主机将通过写入内存窗口来设置此DMAC。
就我而言,Endpoint没有内置于PCIe IP的DMAC,但确实有一个系统DMAC。那么,有两个问题......
任何帮助表示赞赏!
答案 0 :(得分:1)
BAR位于传统的配置空间内。因此,只能通过CfgRd或CfgWr达到该寄存器。这些TLP(事务层数据包)只能来自RC。那么EP怎么知道RC的有效内存地址是什么?棘手的问题,PCI-Express规范没有答案。实际上,有些地区比其他地区更有可能被分配,所以你可以做出有根据的猜测。
访问BAR需要至少2个TLP:请求(CfgWr或CfgRd)和相应的完成(分别为Cpl或CplD)。
我希望有所帮助,
答案 1 :(得分:0)
在考虑了这一点之后,我认为答案很明确......
在我的情况下,Endpoint没有内置的PCIe-DMAC,Endpoint只能使用PCIe窗口访问RC内存。通常,这些窗口用于RC以访问EP存储器(如BAR所详述)。但是,没有什么可以阻止端点使用相同的机制来访问RC内存。唯一的问题是设置之一。在这种情况下,RC必须告诉端点它应该使用的PCIe地址和大小。这与使用PCIe-DMAC的情况没有什么不同。
答案 2 :(得分:0)
PCIe EP中有一种称为地址转换的东西。例如: