Linux内核或BIOS如何将PCIe 端点设备内存映射到systems 空间?有什么API可以实现吗?假设在为PCIe端点设备编写Linux设备驱动程序时,如何将PCIe设备内存映射到MMIO空间?还是在枚举期间,设备已经被BIOS映射到MMIO,而我需要做的就是使用ioremap()将设备MMIO重新映射到内核虚拟地址的空间?
平台: Linux on x86
发布于 2019-11-13 23:01:13
这个答案有两部分。
BIOS的角色
BIOS (通常基于UEFI )将执行某种深度优先搜索(DFS),并枚举所有子节点,因为PCIe是一个自枚举总线。由于它可以看到世界(设备、总线、处理器),它将向条形寄存器(可能是BAR0或多个寄存器)写入一个地址。这将是系统将使用的地址,并且它实际上会将这些请求从主机代理( x86/Intel平台上的HA)路由到根端口,一直路由到PCIe交换机到端点。
这些元素中的每一个都跟踪属于自己或它们的一个子设备的地址范围(例如,交换机可能是根端口的子端口)。
设备驱动程序角色
OS/Kernel将提供一个助手例程工具包,驱动程序作者将使用这些例程访问设备寄存器。通常情况下,驱动程序可能会遵循折叠例程。
这是一些示例驱动程序伪代码,只是为了帮助说明这个想法。
1. pci_resource_flags(pdev,0) & IORESOURCE_MEM
检查资源区域是否有效,此处检查栏0。
2. pci_request_regions(pdev,"region")
对资源/区域拥有所有权
3. drv->= pci_iomap(pdev,0,SIZE_YOU_WANT_TO_MAP)
这将为您提供内核虚拟地址到设备寄存器映射。
注意:如果BIOS不枚举,可以通过Linux重新扫描PCIe树,以查看是否可以看到设备。
https://stackoverflow.com/questions/58832448
复制相似问题