1.4 PCIe——地址空间划分及地址转换

由于不同厂商的PCIE控制器有不同的地址转换方式,但大致原理类似,本文将以某大型EDA厂商的pcie控制器为例辅以解释。该控制器机制和PowerPC体系架构下的PCIe控制器类似。

一、 PCI地址空间划分

1.1 存储器域和PCI总线域

PCI spec规定了PCI设备必须提供的单独地址空间,因此PCIe设备的地址空间和CPU可以访问的地址空间是分开的。
根据王齐老师的**《PCI Express体系结构导读》**一书,后者可以被定义为存储器域,该域包括CPU内部的寄存器、主存空间,即CPU域和DRAM域(在可以接入显卡等设备的处理器系统中,CPU域并不能包含所有的DRAM域);而前者可以被定义为PCI总线域。二者之间的地址转换通过PCIe HOST主桥来实现。
存储器域和PCI域相互访问需要先进行地址映射,即当CPU要访问PCI外部设备时(正向映射),需要先访问该设备在存储器域的地址,之后经过HOST主桥转换为PCI总线域的物理地址,然后通过PCI总线事务进行数据访问;而当PCI设备访问主存储器时(反响映射),首先通过PCI总线事务访问PCI总线域的地址空间,然后经过HOST主桥转换为存储器域的地址后,再对这些空间进行数据访问。

1.2 PCI总线域划分

在PCI体系结构中一共支持两种地址空间,因此PCI总线域又可以进一步划分为Memory Address Space(MMIO 存储器映射空间)和Configuration Address Space(配置空间)。

1.2.1 MMIO空间

MMIO(Memory mapping I/O)即内存映射I/O,它是PCI规范的一部分,I/O设备被放置在内存空间而不是I/O空间。从处理器的角度看,内存映射I/O后系统设备访问起来和内存一样。
这样如果访问AGP/PCI-E显卡上的帧缓存,BIOS可以对PCI设备使用读写内存一样的汇编指令完成,简化了程序设计的难度和接口的复杂性。
I/O作为CPU和外设交流的一个渠道,主要分为两种,一种是Port I/O,一种是MMIO(Memory mapping I/O)。

1.2.2 配置空间

配置空间(configuration space),前64个字节(其地址范围为0x00~0x3F)是所有PCI设备必须支持的(有不少简单的设备也仅支持这些),此外PCI/PCI-X还扩展了0x40~0xFF这段配置空间,在这段空间主要存放一些与MSI或者MSI-X中断机制和电源管理相关的Capability结构。
第三节中将详述。

二、地址转换

outbound/inbound机制

部分PCIe控制器的设计中采用inbound和outbound寄存器组来保存存储器域和PCIe域的地址转换关系。

  • outbound寄存器组
    outbount寄存器实现存储器域地址向PCIe域地址的转换

只有当CPU读写访问的地址范围在outbound寄存器组管理的地址空间内时,HOST主桥才能接收CPU的读写访问,并将CPU在存储器域上的读写访问转换为PCI总线域上的读写访问,然后才能对PCI设备进行读写操作

  • inbound寄存器组
    inbound寄存器实现PCIe的地址向CPU域地址的转换

三、PCIe设备mem空间

当处理器访问PCI设备的地址空间时,首先需要访问该设备在存储器域的地址空间,并通过HOST主桥蒋这个存储器域的地址空间转换为PCI总线域的地址空间后,在使用PCI总线事务将数据发送给PCI设备。
同样,PCI设备访问存储器域的地址空间,类似进行DMA操作时,首先访问该存储器地址空间所对应的PCI总线地址空间,之后通过HOST主桥将PCI地址转换为存储器地址

3.1 访问机制——地址路由

3.2 地址映射方式

存储器访问的地址映射方式如下:
PCIe总线域地址 = 请求访问的存储器域地址 - MMIO基地址 + bar基址(RP)

计算结果PCIe总线域地址在PCIe总线上广播,当该地址在某PCI设备的bar地址空间范围内,则访问该设备的地址空间。

参考Xilinx PCIe IP的存储访问地址映射方式:PCIE原理:PCIE地址是如何映射的

四、PCI设备的config配置空间

上文提到,PCI总线域的地址空间分为配置空间、memory空间和IO空间,对于配置空间的访问,一般有两种访问机制,一种是通过特定寄存器访问,另外一种是通过ECAM的方式访问。
无论是哪种访问方式,都需要对所有的PCI设备进行编码以避免冲突,通常以三段编码来区分PCI设备,即Bus Number, Device Number和Function Number,可以简称为BDF。通过BDF可以唯一确定某一PCI设备。
由于PCIe总线树上可能存在Bridge接终端设备,或者直接接ep设备,因此对二者的配置空间访问请求也有所不同,对上述设备分别是用Type1和Type0配置请求。

4.1 访问机制

4.1.1 通过特定寄存器寻址访问

PCI总线规定访问第三节的配置空间的总线事务,即配置读写总线事务,使用ID号进行寻址。
以PowerPC架构的MPC8548处理器来说,与PCI设备配置空间相关的寄存器由CFG_ADDR(可读写)、CFG_DATA(可读写)和INT_ACK(只读)寄存器组成,驱动程序等系统软件使用CFG_ADDR和CFG_DATA寄存器访问PCI设备的配置空间,而使用INT_ACK寄存器访问挂接在PCI总线上的中断控制器的中断向量。
对于x86架构来说,一般通过CONFIG_ADDRESS和CONFIG_FATA寄存器

  • CFG_ADDR寄存器
    CFG_ADDR寄存器和CFG_DATA寄存器用来访问PCI设备的配置空间,其中用CFG_ADDR寄存器保存PCI设备的ID号和寄存器号。该寄存器有字段:
  1. enable位
    当该位为1时,host主桥使能对PCI设备配置空间的访问,当HOST处理器对CFGPDAT寄存器访问时,HOST主桥将对该机存起访问转换位PCI哦诶值读写总线事务并发送的PCI总线上。

  2. Bus Number
    记录PCI设备的总线号,总线号在HOST主桥时确定,PCI总线可以使用PCI桥扩展PCI总线并形成一颗PCI总线树。在一颗PCI总线树中,总线号由系统软件决定,通常与HOST主桥直接连接的PCI总线编号为0,系统软件使用DFS算法扫描PCI总线树上的所有PCI总线,并依次编号

  3. Device Number
    记录PCI设备的设备号,设备号由PCI设备的IDSEL信号与PCI总线地址先的连接关系确定

  4. Function Number
    记录PCI设备的功能号,功能号与PCI设备的具体设计相关。一个PCI设备最多有8个功能设备,且每一个功能设备都有各自的PCI配置空间,二在绝大多数PCI设备中只有一个功能设备。

  5. Register Number
    记录PCI设备的配置寄存器号

4.1.2 ECAM

增强配置访问机制,ARM使用ECAM的方式访问PCIe配置空间。ECAM是一个将配置空间映射到MEMORY空间的规则。硬件根据ECAM的方式将某个Memory空间映射给PCI配置空间,CPU访问对应的memory空间即可以操作PCIe配置空间,其地址空间映射如下:
在这里插入图片描述
在ACPI规范中,需要通过MCFG表上报ECAM的地址映射。完成映射后,CPU发出的地址如果落在ECAM的范围内, 根据对应的bdf就可以访问到对应ep的配置空间了。

五、PCIe设备IO空间

通常对于memory空间和IO空间分开的架构才需要使用PCIe的IO空间,例如x86架构,其访问IO空间有专门的指令in/out等。
详情参考链接:PCI的Memory Mapped IO vs Port IO

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KGback

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值