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

时间:2019-11-13 07:46:36

标签: memory-management linux-device-driver pci pci-e ioremap

Linux内核 BIOS 如何将 PCIe 端点设备内存映射到系统 MMIO < / strong>空间?是否有任何API可以实现? 假设在为PCIe端点设备编写Linux设备驱动程序时,如何将 PCIe 设备内存映射到MMIO空间?还是真的在枚举过程中已通过BIOS将设备映射到MMIO,我需要做的只是将设备 MMIO 重新映射到内核虚拟地址 ioremap ()使用空格?

平台:x86上的Linux

1 个答案:

答案 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树以查看是否可以看到设备。