PCI 枚举中如何确定设备?(总线/设备/功能)

PCI 枚举中如何确定设备?(总线/设备/功能)

我对 PCI 总线/设备/功能枚举感到困惑。查看 Wikipedia 页面PCI 配置,我发现对于给定的总线,主设备将使用功能 0 请求所有设备的供应商 ID 和设备 ID。如果返回所有 0xFF,则表示没有设备,枚举继续。如果找到有效的设备 ID 和供应商 ID,则表示有一个 PCI 单元,并且将对其进行枚举。我不确定 bus.device.function 中的设备是如何确定的。

例如,假设我有一个带有一条 PCI 总线和一个 PCI 外设的 CPU。我知道 CPU 会查看总线 0(默认情况下),并会检查功能 0 上的所有设备编号。外设的设备编号是如何确定的?

答案1

在原始 PCI 框架(“传统 PCI”)以及 PCI-X 中,设备对应于“插槽”,每个插槽都有自己的连接器连接到同一并行总线。每个插槽都有一个唯一的 ID 引脚,该引脚在枚举期间被置位。枚举本质上是在询问(针对每个插槽):“嘿,这个插槽中有什么东西吗?”设备通过响应此信号将数据驱动到总线上来做出响应。没有响应意味着没有设备。

设备也可以是“桥接器”,这意味着它构成了一条下级总线。该总线将具有单独的 ID(由上游分配),并具有自己的一组独立枚举的插槽。

PCI-Express (PCIe) 则完全不同。PCIe 并不是真正的总线——就像设备间共享的资源一样;相反,每个设备都有自己独立的点对点串行连接,连接到其上游设备(以及任何下游设备——如果它有下游设备,则意味着它也充当桥梁)。将 PCIe 视为 LAN。每个桥都类似于交换机,具有一组连接到其他设备的端口。其他设备可能是终端设备,也可能是其他交换机(即 PCIe 桥)。

PCIe 的设计方式使其概念框架和寻址(以及提供给软件的行为)与 PCI 和 PCI-X 兼容。但实现方式却完全不同。例如,在枚举设备时,由于它是点对点的,因此在枚举的每个点需要确定的唯一问题是“那里有什么?”由于每个设备都有自己独立的一组线路,因此设备 ID 基本上都是硬编码的(因此每个桥,包括顶层“根复合体”,告诉每个设备将具有其设备 ID)。

在所有情况下,总线/设备/功能的“功能”部分都严格在外设内处理。例如,双端口 NIC 控制器通常有两个功能,每个端口一个。它们可以独立配置和操作,但从 CPU 到功能的数据路径对两者而言是相同的。

相关内容