我有一个关于在PCIe上使用突发读取和写入的问题。我有一个通过PCIe连接到CPU的fpga。我有一个简单的驱动程序,仅用于测试。驱动程序向fpga读写数据。 fpga包含一个sram核心,在其中写入和读取数据。读取和写入运行良好,但如果我从设备读取,则不会出现突发现象。如果我将数据写入fpga,并且使用ioremap_wc()映射BAR,则突发工作良好。但是,如果我从fpga读取,则cpu只会进行单次访问而不会突发。我发现我必须将内存标记为写回,以便能够在读和写传输时缓存数据,但是如果我使用/ proc / mtrr标记我的地址写回,则在读和写时不会爆发。 PCI标头中的BAR被标记为可预取。你们中有人知道如何实现突发以在pci总线上进行读写吗?我希望任何人都可以帮助我。
最佳答案
在PICe总线上获得突发传输的最佳方法是使用DMA控制器而不是处理器I / O。如果您的FPGA是PCIe总线主控器,则可以对其进行编程以传输数据。否则,大多数平台都内置了DMA控制器。
我希望写合并执行与未缓存读取相同的读取。但是,即使您使用ioremap_cache(),您的平台也可能不会突发PIO读取。它可能取决于您的处理器,执行读取的指令和系统逻辑。