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
为了访问PCI配置空间,根据不同的文章使用I/O端口地址0xCF8,0xCFC。
mov eax, dword 0x80000000
mov dx, word 0x0CF8
out dx, eax
mov dx, word 0x0CFC
in eax, dx
上述代码中eax的值是0x12378086,意思是vendor ID = 0x8086和device ID = 0x1237。
这里有个问题。
Q1.我已经看到这种方法只适用于PCI配置空间。那么,访问PCIe配置空间的另一种方法是什么?
“不能使用遗留的PCI方法(通过端口0xCF8和0xCFC)访问此扩展配置空间”
但其他一些文章