【摘要】:PCIe总线规范将这种“对PCIe设备配置空间”的读写访问方式称为ECAM机制。CPU可以直接对这段特殊的存储器域地址空间进行访问,从而访问PCIe设备的配置空间。使用ECAM机制与使用CONFIG_ADDRESS和CONFIG_DATA这对寄存器,间接访问PCIe设备的配置空间有较大的不同。其中raw_pci_ops函数指针使用0xCF8和0xCFC两个I/O端口寄存器访问PCI总线配置空间,而raw_pci_ext_ops函数使用ECAM方式访问PCI总线配置空间。虽然Montevina平台提供了256MB的PCIe设备使用的配置空间,但是这些空间的实际利用率较低。
x86处理器使用了两种机制访问PCIe设备的扩展配置空间。首先x86处理器提供了两个I/O端口寄存器,CONFIG_ADDRESS和CONFIG_DATA寄存器,使用这两个寄存器访问EP配置空间的方法与访问PCI设备类似,详见第2.2.4节。然而这两个寄存器只能访问PCI设备的基本配置空间,即PCIe设备配置空间的前256个字节,而之后的扩展配置空间需要通过ECAM方式进行访问。
在Montevina平台中,PCIe设备配置空间的基地址保存在PCIEXBAR寄存器中,这段地址空间的大小为256MB,且为256MB对界。当CPU对PCIe设备配置空间[17]进行读写访问时,MCH将这个存储器读写请求转换为PCI配置读写总线周期后,再发送到相应的PCIe设备中。PCIe总线规范将这种“对PCIe设备配置空间”的读写访问方式称为ECAM机制。
ECAM机制的主要原理是,将处理器系统中所有PCIe设备的配置空间映射到一段地址连续的存储器域的地址空间中。CPU可以直接对这段特殊的存储器域地址空间进行访问,从而访问PCIe设备的配置空间。
使用ECAM机制与使用CONFIG_ADDRESS和CONFIG_DATA这对寄存器,间接访问PCIe设备的配置空间有较大的不同。ECAM机制是一种直接寻址方式,在x86处理器系统中,只有使用ECAM方式才可以访问PCIe设备的扩展配置空间。而其他处理器,如Power-PC处理器,即便不使用ECAM方式,也可以访问PCIe设备的扩展配置空间,在MPC8548处理器的PEX_CONFIG_ADDR寄存器[18]中,设置了EXT_REGN字段(由4位组成),该字段可以与REGN字段组成一个10位的字段,从而可以访问所有扩展的PCIe设备配置空间。
Linux系统定义了raw_pci_re ad和raw_pci_write两个函数,对PCI设备配置空间进行读写,这两个函数的实现在./arch/x86/pci/c ommon.c文件中,如源代码5-1所示。
源代码5-1 raw_pci_read和raw_pci_write函数
由以上代码,可以发现当raw_pci_read/write函数访问的配置寄存器号大于256B时,该函数将调用raw_pci_ext_ops函数,否则调用raw_pci_ops函数。其中raw_pci_ops函数指针使用0xCF8和0xCFC两个I/O端口寄存器访问PCI总线配置空间,而raw_pci_ext_ops函数使用ECAM方式访问PCI总线配置空间。
在Linux x86系统中,raw_pci_ext_ops函数相当于pci_mmcfg函数,而pci_mmcfg函数指针分别指向两个函数,为pci_mmcfg_read和pci_mmcfg_write函数。这两个函数使用直接寻址方式(即ECAM方式)访问当前处理器系统中所有PCIe设备的扩展配置空间,其函数原型在./arch/x86/pci/mmc onfig_32.c文件中。
Montevina平台使用256MB物理空间映射PCI设备的配置寄存器,因为在Montevina平台中有一棵PCI总线树,因此最多具有256条PCI总线,每一条PCI总线最多可以挂接32个PCI设备,每一个设备最多有8个Function,而在每一个Function中最大的PCI总线配置寄存器空间为4KB。
因此将一棵PCI总线树上所有PCI设备的配置空间采用一一映射的方式对应到存储器域空间时,共需要1MB空间,而一个HOST主桥可以管理的PCI总线为256条。为此Montevi-na平台共提供了256MB大小的空间,其基地址在PCIEXBAR寄存器中,这段存储器域的地址空间与PCI总线的配置寄存器的对应关系如表5-3所示。
表5-3 PCIEXBAR空间与PCI总线配置寄存器的对应关系
(www.chuimin.cn)
当CPU对PCIEXBAR地址空间进行访问时,MCH或者ICH将根据上表所示的规则,将这次存储器访问转化对PCI总线的某个设备进行的配置读写访问。如果当CPU对PCIEX-BAR+0x0811-0000这个地址进行访问时,MCH将这次地址访问转换为对Bus号为0x81(A[27∶20]为0x81),Device号为1(A[19∶15]为1),且Function号为0的PCI设备配置空间的访问,访问的寄存器为0x0(A[11∶2]为0)。
虽然采用ECAM方式可以访问之前使用CONFIG_DATA和CONFIG_ADDRESS寄存器不能访问的PCI扩展配置寄存器空间,但是也带来了一些问题。在一个处理器系统中,同一条PCI总线上的Device Number不一定连续,而且在多数PCI设备中也不会有8个Function,这将造成PCIEXBAR空间会留有许多空洞。虽然Montevina平台提供了256MB的PCIe设备使用的配置空间,但是这些空间的实际利用率较低。
PowerPC处理器也可以使用ECAM方式映射PCI配置空间,如MPC8548处理器可以使用PCIe桥中的Outbound寄存器(PEXOWARn)将PCI配置空间映射到存储器域。此外PowerPC处理器还可以使用PEX_CFG_DATA和PEX_CFG_ADDR这两个寄存器访问扩展PCIe设备的配置空间。其中PEX_CONFIG_ADDR寄存器的结构如图5-5所示。
图5-5 PEX_CONFIG_ADDR寄存器的结构
PEX_CONFIG_ADDR寄存器保存当前PCIe设备在处理器系统中的ID号,该寄存器的各个字段的描述如下。
●Enable位。该位为1表示使能HOST处理器对PCI配置空间的访问,当HOST处理器对PEX_CONFIG_DATA寄存器进行访问时,HOST主桥将对这个寄存器的访问转换为PCI配置读写周期并发送到PCI总线上。
●BUSN字段记录PCI设备所在的总线号。
●DEVN字段记录PCI设备的设备号。
●FUNCN字段记录PCI设备的功能号。
●EXTREGN和REGN字段,共10位,记录PCI设备的配置寄存器号。PowerPC处理器使用这两个字段组成10位地址空间,从而可以访问PCIe设备使用的全部配置空间。
从原理上讲,x86处理器也可以使用这种方式访问扩展的PCI配置空间,但是x86处理器没有采用这种方式,而是使用ECAM机制访问扩展的配置空间。这种方式将不可避免地在存储器域占用一段专用的地址空间。而这段地址空间的使用效率较低,因为在一条PCI总线上,PCIe设备不会使用所有的设备号,而且每一个PCIe设备也不会使用所有的Function号,因此在这段地址空间中,有许多空间没有被充分利用。
相关推荐