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


8

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

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

Answers:


6

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

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

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

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

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


1
答案有点令人困惑:1)在PCI中,“设备号”实际上是“插槽号”(这很有意义),2)您说“ PCIe完全不同”,并且“因为每个设备都有自己独立的电线集” ,设备ID基本上都是硬编码的”,这意味着电线(=插槽)的集合具有硬编码的ID,因此它与PCI中的相同。现在,问题是何时发生“硬编码”?交换机/网桥在重置时是否重新分配ID?
xealits

2
是的 可以用更好的措辞。关键是在PCI中,该卡位于共享总线上,但“知道”它所在的插槽,并且仅在声明其插槽特定的引脚时才响应。在PCIe中,网桥具有N套不同的“电线”。因此,桥设备对每组电线都有一个离散的插槽号。从桥的角度来看,该插槽有一个确定的数目。它只需要确定那里是否有东西。卡本身知道它在哪个插槽中。一旦桥接器确定那里有东西,它就会告诉该设备其插槽号是多少。
吉尔·汉密尔顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.