Linux内核或 BIOS 如何将 PCIe 端点设备内存映射到系统 MMIO < / strong>空间?是否有任何API可以实现? 假设在为PCIe端点设备编写Linux设备驱动程序时,如何将 PCIe 设备内存映射到MMIO空间?还是真的在枚举过程中已通过BIOS将设备映射到MMIO,我需要做的只是将设备 MMIO 重新映射到内核虚拟地址 ioremap ()使用空格?
平台:x86上的Linux
答案 0 :(得分:0)
此答案分为两部分
BIOS的作用
BIOS(通常基于UEFI)将执行某种深度优先搜索(DFS)并枚举所有子代,因为PCIe是自枚举总线。由于具有全局视图(设备,总线,处理器),因此它将地址写入BAR寄存器(可以是BAR0或多个)。这将是系统将使用的地址,它实际上会将这些请求从主机代理(x86 / Intel平台上的HA)路由到根端口,再一直路由到PCIe交换机,直到端点。
每个元素都跟踪哪些地址范围属于其自身或其子设备之一(例如,交换机可能是根端口的子设备)
设备驱动程序的作用
OS / Kernel将提供帮助程序例程的工具包,驱动程序作者将使用该工具包访问设备寄存器。通常,驾驶员可能会遵循以下常规程序
这是一些示例驱动程序伪代码,只是为了帮助说明这个想法
1。 pci_resource_flags(pdev,0)和IORESOURCE_MEM
检查资源区域是否有效,此处检查BAR 0
2。。pci_request_regions(pdev,“区域”)
获得资源/区域的所有权
3。 drv->寄存器= pci_iomap(pdev,0,SIZE_YOU_WANT_TO_MAP)
这将为您提供内核虚拟地址到设备寄存器的映射
注意:如果BIOS没有枚举,则可以通过Linux重新扫描PCIe树以查看是否可以看到设备。