1.
IO访问
一段历史:
早期的PC,只有64KB的IO空间
到了PCI协议出现的时候,IO空间只留下两段,0x800-0x8FF, 0xC00-0xCFF
因些,根本不可能将系统中的所有PCI FUNCTION 配置空间都放到这两段IO空间中去
另外一点,当时的内存空间,似乎也不是很够用,所以,也没有说将PCI FUNCTION的配置空间映射到内存空间中去
所以,PCI SPEC的制定者,设计了一种通过IO间接访问的方式来访问PCI FUNCTION 配置空间的方式
2.
IO访问
由一个地址寄存器,与一个数据(写的数据,或者读回来的数据)寄存器来实现这个需求
分别是IO空间(RC 的HOST TO PCI BRIDGE, IO PORTS)的:
CONFIGURATION ADDRESS PORT: 0xCF8-0xCFB
CONFIGURATION DATA PORT: 0xCFC-0xCFF
首先,先将目标地址(BDF)与(读写数据的在配置空间的地址偏移,单位为DWORD)写入地址寄存器
然后,再将数据写入,或者读出数据寄存器
所以,每一个配置空间的访问,需要两次IO访问
《---有一个问题,需要之后确认:
为什么写了这组寄存器,就能产生对PCI FUNCTION配置空间的读、写呢?
看下面
3.
地址寄存器的构成:
1:0 : 00
7 : 2 : TARGET DWORD
10:8: TARGET FUNCTION
15:11: TARGET DEVICE
23:16: TARGET BUS
30:24: RESERVED
31: ENABLE(表示是普通的IO,还是CONFIGURATION REQUEST方式的WRITE/READ)
4.
两个新概念(对我来说,没学PCIE之前,不知道的)
SECONDARY BUS NUMBER: 是BUS NUMBER,即由这个BRIDGE构成的直接BUS的NUMBER
SUBORDINATE BUS NUMBER: 是由这个BRIDGE,与一系列其下面的BRIDGE,构成的,最大数值的BUS NUMBER
这样,就构成了一个范围
5.
RC的HOST TO PCI BRIDGE,对应一条VIRTUAL BUS, 它的SECONDARY BUS NUMBER = 0
《----
之前说过,RC有一个HOST TO PCI BRIDGE,对就BUS 0(VIRTUAL BUS), 其上接了一个或多个VIRTUAL PCI TO PCI BRIDGE, 对就的是BUS 1---m
而SWITCH也有一个VIRTUAL PCI TO PCI BRIDGE, 也对应一条VIRTUAL BUS, 其上也接了一个或多个VIRTUAL PCI TO PCI BRIDGE, 对应的也是BUS x--z
《---——
6.
一个CONFIGURATION REQUEST被发到一个BRIDGE后
BRIDGE将会判断,是否在它所对应的SECONDARY BUS NUMBER与SUBORDINATE BUS NUMBER的范围内
有以下几种情况
一,如果目标等于SECONDARY BUS NUMBER, 则该BUS上的设备为该REQUEST的接受(TYPE 0 CONFIGURATION REQUEST)者,
二, 如果目标在于SECONDARY BUS NUMBER, 小于等于SUBORDINATE BUS NUMBER, 则该REQUEST将以TYPE 1的形式,一级一级传递下去
三,不在范围内,则没有REQUEST的传递
7.
不管是单PROCESSOR(单RC),还是多PROCESSOR(多RC)的情况
CONFIGURATION ADDRESS PORT与CONFIGURATION DATA PORT只有一组