PCI总线的配置
2.4 PCI总线的配置
PCI总线定义了两类配置请求,一个是Type 00h配置请求,另一个是Type 01h配置请求。PCI总线使用这些配置请求访问PCI总线树上的设备配置空间,包括PCI桥和PCI Agent设备的配置空间。
其中HOST主桥或者PCI桥使用Type 00h配置请求,访问与HOST主桥或者PCI桥直接相连的PCI Agent设备或者PCI桥[1];而HOST主桥或者PCI桥使用Type 01h配置请求,需要至少穿越一个PCI桥,访问没有与其直接相连的PCI Agent设备或者PCI桥。如图2‑8所示,HOST主桥可以使用Type 00h配置请求访问PCI设备01,而使用Type 01h配置请求通过PCI桥1、2或者3转换为Type 00h配置请求之后,访问PCI总线树上的PCI设备11、21、22、31和32[2]。
当x86处理器对CONFIG_DATA寄存器进行读写操作时,HOST主桥将决定向PCI总线发送Type 00h配置请求还是Type 01h配置请求。在PCI总线事务的地址周期中,这两种配置请求总线事务的不同反映在PCI总线的AD[31:0]信号线上。
值得注意的是,PCIe总线还可以使用ECAM(Enhanced Configuration Access Mechanism)机制访问PCIe设备的扩展配置空间,使用这种方式可以访问PCIe设备256B~4KB之间的扩展配置空间。但是本节仅介绍如何使用CONFIG_ADDRESS和CONFIG_FATA寄存器产生Type 00h和Type 01h配置请求。有关ECAM机制的详细说明见第5.3.2节。
处理器首先将目标PCI设备的ID号保存在CONFIG_ADDRESS寄存器中,之后HOST主桥根据该寄存器的Bus Number字段,决定是产生Type 00h配置请求,还是Type 01h配置请求。当Bus Number字段为0时,将产生Type 00h配置请求,因为与HOST主桥直接相连的总线号为0;大于0时,将产生Type 01h配置请求。
在地址周期中,HOST主桥使用配置读写总线事务,将CONFIG_ADDRESS寄存器的内容拷贝到PCI总线的AD[31:0]信号线中。CONFIG_ADDRESS寄存器与Type 01h配置请求的对应关系如图2‑11所示。

从图2‑11中可以发现,CONFIG_ADDRESS寄存器的内容基本上是原封不动的拷贝到PCI总线的AD[31:0]信号线上的[3]。其中CONFIG_ADDRESS的Enable位不被拷贝,而AD总线的第0位为必须为1,表示当前配置请求是Type 01h。
当PCI总线接收到Type 01配置请求时,将寻找合适的PCI桥[4]接收这个配置信息。如果这个配置请求是直接发向PCI桥下的PCI设备时,PCI桥将接收个Type 01配置请求,并将其转换为Type 00h配置请求;否则PCI桥将当前Type 01h配置请求原封不动的传递给下一级PCI总线。
如果HOST主桥或者PCI桥发起的是Type 00h配置请求,CONFIG_ADDRESS寄存器与AD[31:0]的转换如图2‑12所示。

此时处理器对CONFIG_DATA寄存器进行读写时,处理器将CONFIG_ADDRESS寄存器中的Function Number和Register Number字段拷贝到PCI的AD总线的第10~2位;将AD总线的第1~0位赋值为0b00。PCI总线在配置请求总线事务的地址周期根据AD[1:0]判断当前配置请求是Type 00h还是Type 01h,如果AD[1:0]等于0b00表示是Type 00h配置请求,如果AD[1:0]等于0b01表示是Type 01h配置请求。
而AD[31:11]与CONFIG_ADDRESS的Device Number字段有关,在Type 00h配置请求的地址周期中,AD[31:11]位有且只有一位为1,其中AD[31:11]的每一位选通一个PCI设备的配置空间。如第1.2.2节所述,PCI设备配置空间的片选信号是IDSEL,因此AD[31:11]将与PCI设备的IDSEL信号对应相连。
当以下两种请求之一满足时,HOST主桥或者PCI桥将生成Type 00h配置头,并将其发送到指定的PCI总线上。
(1) CONFIG_ADDRESS寄存器的Bus Number字段为0时,处理器访问CONFIG_DATA寄存器时,HOST主桥将直接向PCI总线0发出Type 00h配置请求。因为与HOST主桥直接相连的PCI总线号为0,此时表示HOST主桥需要访问与其直接相连的PCI设备。
(2) 当PCI桥收到Type 01h配置头时,将检查Type 01配置头的Bus Number字段,如果这个Bus Number与PCI桥的Secondary Bus Number相同,则将这个Type 01配置头转换为Type 00h配置头,并发送到该PCI桥的Secondary总线上。
其中Type 00h配置请求可以直接读取PCI Agent设备的配置空间,而Type 01h配置请求在通过PCI桥时,最终将被转换为Type 00h配置请求,并读取PCI Agent设备的配置寄存器。本节重点讲述PCI桥如何将Type 01h配置请求转换为Type 00h配置请求。
首先Type 00h配置请求不会被转换成Type 01h配置请求,因为Type 00h配置请求是发向最终PCI Agent设备,这些PCI Agent设备不会转发这些配置请求。
当CONFIG_ADDRESS寄存器的Bus Number字段为0时,处理器对CONFIG_DATA寄存器操作时,HOST主桥将直接产生Type 00h配置请求,挂接在PCI总线0上的某个设备将通过ID译码接收这个Type 00h配置请求,并对配置寄存器进行读写操作。如果PCI总线上没有设备接收这个Type 00h配置请求,将引发Master Abort,详情见PCI总线规范,本节对此不做进一步说明。
如果CONFIG_ADDRESS寄存器的Bus Number字段为n(n≠0),即访问的PCI设备不是直接挂接在PCI总线0上的,此时HOST主桥对CONFIG_DATA寄存器操作时,将产生Type 01h配置请求,PCI总线0将遍历所有在这条总线上的PCI桥,确定由哪个PCI桥接收这个Type 01h配置请求。
如果n大于等于某个PCI桥的Secondary Bus Number寄存器,而且小于等于Subordinate Bus number寄存器,那么这个PCI桥将接收在当前PCI总线上的Type 01配置请求,并采用以下规则进行递归处理。
(1) 开始。
(2) 遍历当前PCI总线的所有PCI桥。
(3) 如果n等于某个PCI桥的Secondary Bus Number寄存器,说明这个Type 01配置请求的目标设备直接连接在该PCI桥的Secondary bus上。此时PCI桥将Type 01配置请求转换为Type 00h配置请求,并将这个配置请求发送到PCI桥的Secondary Bus上,Secondary Bus上的某个设备将响应这个Type 00h配置请求,并与HOST主桥进行配置信息的交换,转(5)。
(4) 如果n大于PCI桥的Secondary Bus Number寄存器,而且小于等于PCI桥的Subordinate Bus number寄存器,说明这个Type 01配置请求的目标设备不与该PCI桥的Secondary Bus直接相连,但是由这个PCI桥下游总线上的某个PCI桥管理。此时PCI桥将首先认领这个Type 01配置请求,并将其转发到Secondary Bus,转(2)。
(5) 结束。
下文将举例说明PCI总线配置请求的转换原则,并以图2‑8为例说明处理器如何访问PCI设备01和PCI设备31的配置空间。PCI设备01直接与HOST主桥相连,因此HOST主桥可以使用Type 00h配置请求访问该设备。
而HOST主桥需要经过多级PCI桥才能访问PCI设备31,因此HOST主桥需要首先使用Type 01h配置请求,之后通过PCI桥1、2和3将Type 01h配置请求转换为Type 00h配置请求,最终访问PCI设备31。
首先HOST处理器将CONFIG_ADDRESS寄存器的Enable位置1,Bus Number号置为0,并对该寄存器的Device、Function和Register Number字段赋值。当处理器对CONFIG_DATA寄存器访问时,HOST主桥将存放在CONFIG_ADDRESS寄存器中的数值,转换为Type 00h配置请求,并发送到PCI总线0上,PCI设备01将接收这个Type 00h配置请求,并与处理器进行配置信息交换。
其中HOST主桥或者PCI桥使用Type 00h配置请求,访问与HOST主桥或者PCI桥直接相连的PCI Agent设备或者PCI桥[1];而HOST主桥或者PCI桥使用Type 01h配置请求,需要至少穿越一个PCI桥,访问没有与其直接相连的PCI Agent设备或者PCI桥。如图2‑8所示,HOST主桥可以使用Type 00h配置请求访问PCI设备01,而使用Type 01h配置请求通过PCI桥1、2或者3转换为Type 00h配置请求之后,访问PCI总线树上的PCI设备11、21、22、31和32[2]。
当x86处理器对CONFIG_DATA寄存器进行读写操作时,HOST主桥将决定向PCI总线发送Type 00h配置请求还是Type 01h配置请求。在PCI总线事务的地址周期中,这两种配置请求总线事务的不同反映在PCI总线的AD[31:0]信号线上。
值得注意的是,PCIe总线还可以使用ECAM(Enhanced Configuration Access Mechanism)机制访问PCIe设备的扩展配置空间,使用这种方式可以访问PCIe设备256B~4KB之间的扩展配置空间。但是本节仅介绍如何使用CONFIG_ADDRESS和CONFIG_FATA寄存器产生Type 00h和Type 01h配置请求。有关ECAM机制的详细说明见第5.3.2节。
处理器首先将目标PCI设备的ID号保存在CONFIG_ADDRESS寄存器中,之后HOST主桥根据该寄存器的Bus Number字段,决定是产生Type 00h配置请求,还是Type 01h配置请求。当Bus Number字段为0时,将产生Type 00h配置请求,因为与HOST主桥直接相连的总线号为0;大于0时,将产生Type 01h配置请求。
2.4.1 Type 01h和Type 00h配置请求
本节首先介绍Type 01h配置请求,并从PCI总线使用的信号线的角度上,讲述HOST主桥如何生成Type 01配置请求。在PCI总线中,只有PCI桥能够接收Type 01h配置请求。Type 01h配置请求不能直接发向最终的PCI Agent设备,而只能由PCI桥将其转换为Type 01h继续发向其他PCI桥,或者转换为Type 00h配置请求发向PCI Agent设备。PCI桥还可以将Type 01h配置请求转换为Special Cycle总线事务(HOST主桥也可以实现该功能),本节对这种情况不做介绍。在地址周期中,HOST主桥使用配置读写总线事务,将CONFIG_ADDRESS寄存器的内容拷贝到PCI总线的AD[31:0]信号线中。CONFIG_ADDRESS寄存器与Type 01h配置请求的对应关系如图2‑11所示。

从图2‑11中可以发现,CONFIG_ADDRESS寄存器的内容基本上是原封不动的拷贝到PCI总线的AD[31:0]信号线上的[3]。其中CONFIG_ADDRESS的Enable位不被拷贝,而AD总线的第0位为必须为1,表示当前配置请求是Type 01h。
当PCI总线接收到Type 01配置请求时,将寻找合适的PCI桥[4]接收这个配置信息。如果这个配置请求是直接发向PCI桥下的PCI设备时,PCI桥将接收个Type 01配置请求,并将其转换为Type 00h配置请求;否则PCI桥将当前Type 01h配置请求原封不动的传递给下一级PCI总线。
如果HOST主桥或者PCI桥发起的是Type 00h配置请求,CONFIG_ADDRESS寄存器与AD[31:0]的转换如图2‑12所示。

此时处理器对CONFIG_DATA寄存器进行读写时,处理器将CONFIG_ADDRESS寄存器中的Function Number和Register Number字段拷贝到PCI的AD总线的第10~2位;将AD总线的第1~0位赋值为0b00。PCI总线在配置请求总线事务的地址周期根据AD[1:0]判断当前配置请求是Type 00h还是Type 01h,如果AD[1:0]等于0b00表示是Type 00h配置请求,如果AD[1:0]等于0b01表示是Type 01h配置请求。
而AD[31:11]与CONFIG_ADDRESS的Device Number字段有关,在Type 00h配置请求的地址周期中,AD[31:11]位有且只有一位为1,其中AD[31:11]的每一位选通一个PCI设备的配置空间。如第1.2.2节所述,PCI设备配置空间的片选信号是IDSEL,因此AD[31:11]将与PCI设备的IDSEL信号对应相连。
当以下两种请求之一满足时,HOST主桥或者PCI桥将生成Type 00h配置头,并将其发送到指定的PCI总线上。
(1)
(2)
2.4.2 PCI总线配置请求的转换原则
当CONFIG_ADDRESS寄存器的Enable位为1,系统软件访问CONFIG_DATA寄存器时,HOST主桥可以产生两类PCI总线配置读写总线事务,分别为Type 00h和Type 01h配置读写总线事务。在配置读写总线事务的地址周期和数据周期中,CONFIG_ADDRESS和CONFIG_DATA寄存器中的数据将被放置到PCI总线的AD总线上。其中Type 00h和Type 01h配置读写总线事务映射到AD总线的数据并不相同。其中Type 00h配置请求可以直接读取PCI Agent设备的配置空间,而Type 01h配置请求在通过PCI桥时,最终将被转换为Type 00h配置请求,并读取PCI Agent设备的配置寄存器。本节重点讲述PCI桥如何将Type 01h配置请求转换为Type 00h配置请求。
首先Type 00h配置请求不会被转换成Type 01h配置请求,因为Type 00h配置请求是发向最终PCI Agent设备,这些PCI Agent设备不会转发这些配置请求。
当CONFIG_ADDRESS寄存器的Bus Number字段为0时,处理器对CONFIG_DATA寄存器操作时,HOST主桥将直接产生Type 00h配置请求,挂接在PCI总线0上的某个设备将通过ID译码接收这个Type 00h配置请求,并对配置寄存器进行读写操作。如果PCI总线上没有设备接收这个Type 00h配置请求,将引发Master Abort,详情见PCI总线规范,本节对此不做进一步说明。
如果CONFIG_ADDRESS寄存器的Bus Number字段为n(n≠0),即访问的PCI设备不是直接挂接在PCI总线0上的,此时HOST主桥对CONFIG_DATA寄存器操作时,将产生Type 01h配置请求,PCI总线0将遍历所有在这条总线上的PCI桥,确定由哪个PCI桥接收这个Type 01h配置请求。
如果n大于等于某个PCI桥的Secondary Bus Number寄存器,而且小于等于Subordinate Bus number寄存器,那么这个PCI桥将接收在当前PCI总线上的Type 01配置请求,并采用以下规则进行递归处理。
(1)
(2)
(3)
(4)
(5)
下文将举例说明PCI总线配置请求的转换原则,并以图2‑8为例说明处理器如何访问PCI设备01和PCI设备31的配置空间。PCI设备01直接与HOST主桥相连,因此HOST主桥可以使用Type 00h配置请求访问该设备。
而HOST主桥需要经过多级PCI桥才能访问PCI设备31,因此HOST主桥需要首先使用Type 01h配置请求,之后通过PCI桥1、2和3将Type 01h配置请求转换为Type 00h配置请求,最终访问PCI设备31。
1 PCI设备01
这种情况较易处理,当HOST处理器访问PCI设备01的配置空间时,发现PCI设备01与HOST主桥直接相连,所以将直接使用Type 00h配置请求访问该设备的配置空间,具体步骤如下。首先HOST处理器将CONFIG_ADDRESS寄存器的Enable位置1,Bus Number号置为0,并对该寄存器的Device、Function和Register Number字段赋值。当处理器对CONFIG_DATA寄存器访问时,HOST主桥将存放在CONFIG_ADDRESS寄存器中的数值,转换为Type 00h配置请求,并发送到PCI总线0上,PCI设备01将接收这个Type 00h配置请求,并与处理器进行配置信息交换。
关键词:
PCI总线配
评论