首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将PCIe端点设备内存映射到系统内存映射(MMIO)?

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

Stack Overflow用户
提问于 2019-11-13 07:46:36
回答 1查看 1.4K关注 0票数 1

Linux内核BIOS如何将PCIe 端点设备内存映射到systems 空间?有什么API可以实现吗?假设在为PCIe端点设备编写Linux设备驱动程序时,如何将PCIe设备内存映射到MMIO空间?还是在枚举期间,设备已经被BIOS映射到MMIO,而我需要做的就是使用ioremap()将设备MMIO重新映射到内核虚拟地址的空间?

平台: Linux on x86

EN

回答 1

Stack Overflow用户

发布于 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树,以查看是否可以看到设备。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58832448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档