Linux内核或BIOS如何将PCIe 端点设备内存映射到systems 空间?有什么API可以实现吗?假设在为PCIe端点设备编写Linux设备驱动程序时,如何将PCIe设备内存映射到MMIO空间?还是在枚举期间,设备已经被BIOS映射到MMIO,而我需要做的就是使用ioremap()将设备MMIO重新映射到内核虚拟地址的空间?
平台: Linux on x86
我发现我的MMIO读/写延迟不合理地高。我希望有人能给我一些建议。
在内核空间中,我编写了一个简单的程序来读取PCIe设备的BAR0地址中的4字节值。该设备是一块PCIe英特尔10G网卡,插在我的至强E5服务器上的PCIe x16总线上。我使用rdtsc来测量MMIO读取的开始和结束之间的时间,代码片段如下:
vaddr = ioremap_nocache(0xf8000000, 128); // addr is the BAR0 of the device
rdtscl(init);
ret = readl(vaddr);
rmb();
rdtscl(end);
我期望(end,i
我们看到了这个答案:Direct communication between two PCI devices 这对回答这个问题有很大的帮助。但我们想试一试,看看是否还有回旋的余地。 因此,我们正在制作具有自定义驱动程序的自定义PCIe卡。唯一不在我们控制范围内的就是卡所插入的服务器芯片组。如果我们控制我们插入的是哪两块电路板,并且这两块电路板都被编程为相互通信,那么“原始”数据就没问题。并且设备驱动程序意识到对直接通信的渴望。你能找到一种直接传输数据的方法吗?变得有创意了?