访问配置空间的总线事务通过ID进行寻址,ID号由总线号(Bus)、设备号(Device)、功能号(Function)组成。
总线号:HOST主桥遍历PCI总线时确定。PCI总线可以通过PCI桥来扩展,并形成PCI总线树。在PCI总线树上,有几片PCI桥(包括HOST桥)就有几条PCI总线。总线号的具体编号有扫描程序决定,与HOST桥直接相连的总线号为0,linux中的扫描算法为深度优先算法(DFS),并依次进行编号;
设备号:由PCI设备的IDSEL信号与PCI总线地址的连接关系确定;
功能号:与PCI设备的具体设计有关,一个PCI设备最多8个功能设备,每个功能设备都有各自的PCI配置空间。
在MPC8548中,使用CFG_ADDR、CFG_DATA读写PCI设备配置空间:
CFG_ADDR:Enable + Bus + Device + Function + Register,如果Enable位为1,处理器在对CDG_DATA寄存器进行读写时,HOST桥会根据CFG_ADDR将读写请求转换为PCI配置读写请求并发送到PCI总线上。注意:PCI设备的配置寄存器采用小端模式。
======================PowerPC的域地址转换过程======================
CPU对存储器域访问 -> 地址是否Cache命中(一般外设地址空间是不可Cache的) -> 地址是否outbound窗口命中 -> 转换位PCI总线域地址发送PCI事务,如下图:
PCI设备DMA读写请求 -> 地址是否inbound窗口命中 -> 根据inbound寄存器组的RTT/WTT位决定是否需要进行Cache一致性操作,或者将数据直接写入到Cache中 -> 存储器域地址访问,如下图:
======================x86的域地址转换过程======================
x86处理器的HOST主桥也实现了存储器域到PCI总线域的地址转换,但这个概念在x86处理器中并不明晰,以后分析。