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

simple_symbols

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

例如,假设我有一个CPU,该CPU带有一个PCI总线和一个PCI外围设备。我知道CPU将在总线0上查找(默认情况下),并且将检查在功能0上查找的所有设备号。如何确定外设的设备号?

吉尔·汉密尔顿

在原始的PCI框架(“常规PCI”)和PCI-X中,设备对应于“插槽”,每个插槽都具有连接到同一并行总线的自己的连接器。每个插槽都有一个唯一的ID引脚,该引脚在枚举过程中有效。枚举本质上是在询问(对于每个插槽):“嘿,此插槽中有东西吗?” 该设备通过响应该信号将数据驱动到总线上来做出响应。缺乏响应意味着没有设备。

设备也可以是“桥”,这意味着它形成了从属总线。该总线将具有一个单独的ID(从上游分配),并将具有自己的一组插槽,这些插槽将被独立枚举。

PCI-Express(PCIe)完全不同。PCIe并不是真正的总线,就像设备之间共享的资源一样。取而代之的是,每个设备都具有与其上游设备(以及任何下游设备)的单独点对点串行连接,并且如果具有下游设备,则意味着它也充当网桥的角色。将PCIe视为LAN。每个网桥都类似于一个交换机,该交换机具有连接到其他设备的一堆端口。其他设备可以是终端设备,也可以是其他交换机(即PCIe桥接器)。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章