PCI总线规定访问配置空间的总线事务,称为配置读写事务。不同于存储访问事务使用存储地址访问,而是使用ID号来寻址访问PCI配置空间。
PCI设备的ID号由总线号(BUS NUMBER)、设备号(DEVICE NUMBER)和功能号(FUNCTION NUMBER)组成。
对于PowerPC的嵌入式应用,PCI设计往往很简单,直接使用CPU上HOST主桥引出的PCI总线,一般不会出现多级PCI总线。所以总线号也很好确定。
一条PCI总线的设备号由PCI设备的IDSEL信号与PCI总线地址线的连接关系确定,即每一个PCI插槽的总线号和设备号都是固定的。这是硬件工程师决定的,可以询问他们。
PCI功能号与PCI设备的具体设计相关。在一个PCI设备中最多有8个 功能设备,而且每一个功能设备都有各自的PCI配置空间,而在绝大数PCI设备中只有一个功能设备。HOST主桥使用寄存器号,访问PCI设备配置空间的某个寄存器。
在MPC83xx处理器的HOST主桥中,与PCI设备配置空间相关的寄存器由CFG_ADDR、CFG_DATA和INT_ACK寄存器组成。系统软件使用CFG_ADDR和CFG_DATA寄存器访问PCI设备的配置空间,而使用INT_ACK寄存器访问挂接在PCI总线上的中断控制器的中断向量。
MPC83xx处理器使用CFG_ADDR寄存器和CFG_DATA寄存器访问PCI设备的配置空间,其中用CFG_ADDR寄存器保存PCI设备的ID号,该寄存器的各个字段的详细说明如下所示:
Enable位:当该位为1时,HOST主桥能对PCI设备配置空间的访问,当HOST处理器对CFG_DATA寄存器进行访问时,HOST主桥将对这个寄存器的访问转换为PCI读写总线事务并发送到PCI总线上。
Bus Number字段:记录PCI设备所在的总线号。
Device Number字段:记录PCI设备的设备号。
Function Number字段:记录PCI设备的功能号。
Register Number字段:记录PCI设备的配置寄存器号。
对于MPC83xx系列处理器,在访问PCI设备的配置空间时,首先需要在CFG_ADDR寄存器中设置这个PCI设备对应的总线号、设备号、功能号和寄存器号,然后使能Enable位。之后当处理器对CFG_DATA寄存器进行读写访问时,HOST主桥将这个存储器读写访问转换为PCI配置读写请求,并发送到PCI总线上。如果Enable位没有使能,处理器对CFG_DATA的访问不过是一个普通的I/O访问,HOST主桥并不能将其转换成PCI配置读写请求。
注意,PowerPC处理器中,CFG_DATA寄存器保存的数据采用大端方式,而PCI设备的PCI配置寄存器采用小端对齐。所以要注意字节序转换。
PowerCP处理器读取INT_ACK 时,HOST将这个读操作转换成PCI总线中断响应事务。
下图就是PCI设备必须支持的64个字节的配置空间,范围为0x00-0x3f:
很多PCI设备仅仅支持64字节的配置空间。PCI和PCIe配置空间的区别如下:
PCI/PCI-X和PCIe设备还扩展了0x40和0xFF这段配置空间,这段空间主要存放一些与MSI或者MSI-X 中断机制相关的Capability结构。其中所有能够提交中断请求的PCIe设备,必须支持MSI或者MSI-X 中断机制相关的Capability结构。
PCIe设备还支持0x100 -0xFFF这段扩展配置空间。PCIe设备的扩展配置空间最大为4KB,在PCIe总线的扩展配置空间中,存放PCIe所独有的一些Capability结构,而PCI设备不能使用这段空间。
在x86处理器中,使用CONFIG_ADDRESS寄存器与CONFIG_DATA寄存器访问0x00-0xFF,而使用ECAM方式访问0x000-0xFFF这段空间;而在PowerPC处理器中,可以使用CFG_DATA和CFG_ADDR寄存器访问0x000-0xFFF。
PCI-x和PCIe总线规范要求其设备必须支持Capabilities结构。在PCI基本配置空间中有一个Capabilities Pointer寄存器,存放指向Capabilities结构链表的头指针。一个PCIe设备可以包含多个Capability结构,包括电源管理、与PCIe总线相关的结构、与中断请求相关的结构、PCIe Capability结构和PCIe 扩展Capability结构。