我试图了解PCI段(域)如何与多个主机桥相关联?
有人说多个PCI域对应多个主机桥,但有人说这意味着在一个主机桥下有多个根桥。我很困惑,而且我在PCI SIG基本规范中找不到很多有用的信息。
我想知道
(1)假设我在MCFG中设置了3个PCI域,我是否有3个连接3个CPU和总线的主机桥,或者我有3个根桥支持3倍总线但是在一个CPU中共享一个公共主机桥?
(2)如果我有多个主桥(或根桥),这些桥是否共用一个共同的南桥(例如,ICH9),或者它们有不同的桥?
我是初学者,谷歌并没有解决我的问题。如果有人能给我一些线索,我将不胜感激。
答案 0 :(得分:12)
使用的措辞令人困惑
我将尝试使用PCI和PCI Express技术的简短且不完整的摘要来修复我的术语。
跳到最后一节阅读答案。
Conventional PCI bus(以后的 PCI )是围绕bus topology设计的:共享总线用于连接所有设备。
要创建更复杂的层次结构,某些设备可以作为网桥运行:桥接器将PCI总线连接到另一个,辅助,总线。
辅助总线可以是另一个PCI总线(该设备称为PCI-to-PCI bridge,因此称为 P2P )或不同类型的总线(例如,PCI-to-ISA桥接器)。
这将创建以下形式的拓扑:
_____ _______
----------| P2P |--------| P2ISA |------------- PCI BUS 0
‾‾|‾‾ ‾‾‾|‾‾‾
-------------|---------------+----------------- ISA BUS 0
|
-------------+--------------------------------- PCI BUS 1
非正式地,每个PCI总线称为 PCI段 在上图中,显示了两个段(PCI BUS 0和PCI BUS 1)。
PCI定义了三种类型的事务:内存,IO和配置 前两个被认为是必需的知识 第三个用于访问每个设备的配置地址空间(CAS);在此CAS中,可以对设备进行元配置 例如,它在系统内存地址空间中的映射位置。
要访问设备的CAS,设备必须是可寻址的 在电气方面,PCI总线段中的每个PCI插槽(集成或不集成)都是有线的,以创建由三部分组成的寻址方案: device (0-31),功能(0-7),寄存器(0-255) 每个设备最多可以有七个逻辑功能,每个功能的CAS为256字节。
总线编号添加到上面的三元组中,以唯一标识整个总线拓扑中的设备(而不仅仅是在总线段内)。
此四元组称为 ID地址
重要的是要注意这些ID地址是由软件分配的(但是对于设备部分,由布线固定)。
它们是合乎逻辑的,但是,建议从根开始按顺序对总线进行编号。
CPU本身不会生成PCI事务,需要主机桥。
它是一个桥(概念上是主机到PCI桥),它允许CPU执行PCI事务
例如,在x86的情况下,主机桥将其他代理(例如内存,内存映射的CPU组件,传统设备等)未回收的任何内存写入或IO写入传递给PCI总线。
为了生成CAS事务,x86 CPU写入IO端口0xcf8
和0xcfc
(第一个包含ID地址,第二个包含要读/写的数据)。
CPU可以拥有多个主机桥,但没有什么能阻止它,尽管它非常罕见 更有可能的是,系统可以有多个CPU,并且每个系统都集成了主机桥,系统可以有多个主机桥。
对于PCI,每个主机桥建立一个 PCI域:一组总线段 PCI域的主要特征是它与其他PCI域隔离:一个事务不需要在域之间路由。
操作系统可以根据需要分配每个PCI域的总线编号,它可以重复使用总线编号,也可以按顺序分配它们:
NON OVERLAPPING | OVERLAPPING
|
Host-to-PCI Host-to-PCI | Host-to-PCI Host-to-PCI
bridge 0 bridge 1 | bridge 0 bridge 1
|
| | | | |
| | | | |
BUS 0 | BUS 2 | | BUS 0 | BUS 0 |
| | | | | | | | |
+------+ +------+ | +------+ +------+
| | | | | | | | |
| | | | | | | | |
| BUS 1 | BUS 3 | | BUS 1 | BUS 1
不幸的是, PCI域这个词在Linux内核中也有意义,它用于为每个主机桥编号。
就PCI而言,这是有效的,但随着PCI Express的引入,这会让人感到困惑,因为PCI Express有自己的名字,用于" Host Bridge number" (即PCI段组)和术语 PCI域表示PCI express根端口的下游链路。
PCI Express bus(以后的PCIe)是围绕point-to-point拓扑设计的:设备只连接到另一台设备。
为了保持软件兼容性,广泛使用虚拟P2P桥接 虽然PCI总线的基本组件是设备和桥接器,但PCIe的基本组件是设备和交换机 从软件的角度来看,没有任何改变(但是对于添加的新功能)并且以相同的方式枚举总线:使用设备和桥接器。
PCIe交换机是设备之间的基本粘合剂,它具有 n 下游端口。
在内部,交换机具有PCI总线段,对于每个端口,在内部总线段中创建虚拟P2P桥(虚拟形容词存在,因为每个P2P仅响应CAS事务,这足以用于PCI兼容软件) 。
每个下游端口都是PCIe链路
PCIe链路被视为PCI总线段;这可以检查交换机是否为每个下游端口配备了一个P2P网桥(总共有1 + n PCI总线段用于交换机)。
交换机还有一个端口:上游端口
它就像一个下游端口,但它使用减法解码,就像网络交换机一样,它用于接收来自"逻辑外部网络的流量。并路由未知目的地。
因此,交换机需要1 + N + 1个PCI段总线。
设备直接连接到交换机。
在PCI情况下,桥接器将CPU连接到PCI子系统,因此期望交换机将CPU连接到PCIe子系统是合乎逻辑的。
确实如此,使用 PCI complex root (PCR)
PCR基本上是一个具有重要转折的交换机:每个端口都建立一个新的 PCI域。
这意味着不需要将流量从端口1路由到端口2(当然,当有交换机时)。
如前所述,这会产生Linux术语的转变,因为Linux为每个主机桥或PCR分配了一个域号,而根据规范,每个PCR都有多个域。
长话短说:同一个词,不同的含义
PCIe规范使用单词 PCI segment group 来定义每个PCR的编号(简单地说,PCI段组是每个PCR的扩展CAS机制的基址,所以有一个到一个)一个本地映射)。
由于它们的隔离属性,PCR的端口称为 PCIe根端口。
注意强>
术语 Root Bridge 并不存在于规范中,我只能在UEFI Root Bridge IO Specification中找到它作为主机桥和PCR的总称术语(因为它们分享类似的职责)。
主机桥也名为Host Adapter。
(1)假设我在MCFG中设置了3个PCI域,我是否有3个连接3个CPU和总线的主机桥,或者我有3个根桥支持3倍总线但是在一个CPU中共享一个公共主机桥?
如果您有3个PCI域,则可以使用3个主机桥接端口或3个PCIe根端口。
如果通过PCI域你的意思是PCI总线,就PCI总线段而言(无论它们是否隔离),那么你可以使用单个主机桥/ PCR来处理具有3个总线或多个主机桥的拓扑/ PCR处理3条总线的组合 在这种情况下没有具体要求,因为您可以看到它可以使用桥接级联总线。
如果您希望总线不被隔离(因此不要成为PCI域),则需要一个主机桥或一个PCIe根端口。
一组P2P桥(实际或虚拟)将总线连接在一起。
(2)如果我有多个主桥(或根桥),这些桥是否共用一个共同的南桥(例如,ICH9),或者它们有不同的桥?
几年前桥接平台已经逐渐消失,我们现在有一个集成到CPU中的系统代理,它暴露了一组PCIe通道(通常为20+)和一个平台控制器集线器(PCH),通过DMI连接到CPU链接。
PCH也可以集成到与CPU相同的插槽中
从软件的角度来看,PCH暴露了一些似乎来自CPU PCR的通道。
无论如何,如果你有多个主机桥,它们通常位于不同的插座上,但通常只有一个南桥。 但是,这是(并且不是)严格强制性的 现代的英特尔C620 PCH可以在仅端点模式(EPO)中运行,它不用作主PCH(具有固件和引导职责),而是用作一组PCIe端点。
这个想法是主机桥只是将CPU事务转换为PCI事务,这些事务的路由取决于总线拓扑,这本身就是一个非常有创意的话题。
集成此拓扑的组件是另一项创造性任务,最终可能有专用于每个主桥的单独芯片或同时在所有或甚至两者之间共享(或分区)的大单芯片!