接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(12)
2.3.1 PCI桥
在PCI Agent设备的配置空间中包含了许多寄存器,这些寄存器决定了该设备在PCI总线中的使用方法,本节不会全部介绍这些寄存器,因为系统软件只对部分配置寄存器感兴趣。PCI Agent设备使用的配置空间如图2-9所示:
本回继续讲解在PCI Agent设备的配置空间中包含的其余寄存器:
(3)Header Type寄存器
该寄存器只读,由8位组成。
系统软件需要使用该寄存器区分不同类型的PCI配置空间,该寄存器的初始化必须与PCI设备的实际情况对应,而且必须为一个合法值。
(4)Cache Line Size寄存器
该寄存器记录HOST处理器使用的Cache行长度。在PCI总线中,和Cache相关的总线事务,如存储器写并无效和Cache多行读等总线事务需要使用这个寄存器。值得注意的是,该寄存器由系统软件设置,但是在PCI设备的运行过程中,只有其硬件逻辑才会使用该寄存器。比如,PCI设备的硬件逻辑需要得知处理器系统Cache行的大小,才能进行存储器写并无效总线事务、单行读和多行读总线事务。
如果PCI设备不支持与Cache相关的总线事务,系统软件可以不设置该寄存器。对于PCIe设备,该寄存器的值无意义,因为PCIe设备在进行数据传送时,在其报文中含有一次数据传送的大小,PCIe总线控制器可以使用这个“大小”,判断数据区域与Cache行的对应关系。
(5)Subsystem ID和Subsystem Vendor ID寄存器
这两个寄存器和Device ID及Vendor ID类似,也是记录PCI设备的生产厂商和设备名称。但是这两个寄存器和Device ID及Vendor ID寄存器略有不同。下面以一个实例说明Subsystem ID和Subsystem Vendor ID寄存器的用途。
Xilnx公司在FPGA中集成了一个PCIe总线接口的IP核,即LogiCORE。用户可以使用LogiCORE设计各种各样的基于PCIe总线的设备,但是这些设备的Device ID都是0x10EE,而Vendor ID为0x0007(Xinlnx使用的Device ID号为0x10EE,而LogiCORE的Vendor ID号为0x0007)。
因此,仅使用Device ID和Vendor ID寄存器无法区分这些设备。此时必须使用Subsystem ID和Subsystem Vendor ID。如果Intel也使用LogiCORE设计一款网卡适配器,那么这个基于LogiCORE的网卡适配器的Subsystem Vendor ID寄存器为0x8086,而Subsystem ID寄存器将是0x10xx。
(6)Expansion ROM base address寄存器
有些PCI设备在处理器还没有运行操作系统之前,就需要完成基本的初始化设置。比如显卡、键盘和硬盘等设备。为了实现这个“预先执行”的功能,PCI设备需要提供一段ROM程序,而处理器在初始化过程中将运行这段ROM程序,初始化这些PCI设备。Expansion ROM base address记载这段ROM程序的基地址。
?PCI Agent设备配置空间中包含的其余寄存器请看下回。