Memory management PCIe端点设备内存如何映射到系统内存映射(MMIO)?

Memory management PCIe端点设备内存如何映射到系统内存映射(MMIO)?,memory-management,linux-device-driver,pci,pci-e,ioremap,Memory Management,Linux Device Driver,Pci,Pci E,Ioremap,Linux内核或BIOS如何将PCIe端点设备内存映射到系统MMIO空间?有什么API可以实现它吗? 假设在为PCIe端点设备编写Linux设备驱动程序时,如何将PCIe设备内存映射到MMIO空间?或者,在枚举过程中,设备已经由BIOS映射到MMIO,而我需要做的只是使用ioremap()将设备MMIO重新映射到内核虚拟地址空间中,这是真的吗 平台:x86上的Linux这个答案有两个部分 BIOS的角色 BIOS(通常基于UEFI)将执行某种深度优先搜索(DFS)并枚举所有子级,因为PCIe是自

Linux内核BIOS如何将PCIe端点设备内存映射到系统MMIO空间?有什么API可以实现它吗? 假设在为PCIe端点设备编写Linux设备驱动程序时,如何将PCIe设备内存映射到MMIO空间?或者,在枚举过程中,设备已经由BIOS映射到MMIO,而我需要做的只是使用ioremap()将设备MMIO重新映射到内核虚拟地址空间中,这是真的吗


平台:x86上的Linux这个答案有两个部分

BIOS的角色

BIOS(通常基于UEFI)将执行某种深度优先搜索(DFS)并枚举所有子级,因为PCIe是自枚举总线。由于它具有世界视图(设备、总线、处理器),它将向BAR寄存器写入地址(可以是BAR0或其中的多个)。这将是系统将使用的地址,它实际上会将这些请求从Host Agent(x86/Intel平台上的HA)路由到根端口,再路由到PCIe交换机,一直路由到端点

这些元素中的每一个都跟踪属于它们自己或它们的一个子设备的地址范围(例如交换机可能是根端口的子设备)

设备驱动程序的角色

OS/内核将提供一个助手例程工具包,驱动程序作者将使用该工具包访问设备寄存器。通常,驱动程序可能遵循触发例程

这是一些示例驱动程序伪代码,只是为了帮助说明这个想法

1.pci\u资源\u标志(pdev,0)和IORESOURCE\u MEM

检查资源区域是否有效,此处检查条0

2.pci请求区域(pdev,“区域”)

拥有资源/区域的所有权

3.drv->registers=pci\u iomap(pdev,0,您想要的大小\u到\u映射)

这将为您提供内核虚拟地址到设备寄存器的映射


注意:如果BIOS未枚举,可以通过Linux重新扫描PCIe树以查看是否可以看到设备。

BIOS可能映射PCIe设备,也可能不映射PCIe设备(它们支持热插拔)。无论如何,Linux操作系统都有一个算法来实现这一点。