HOST主桥实现(PowerPC MPC9548)
《PCI Express体系结构导读》第2.2章节笔记。
1. 背景简介
MPC8548处理器是Freescale基于E500 V2内核的一个PowerPC处理器,该处理器继承了DDR控制器,多个eTSEC(Enhanced Three-Speed Ethernet Controller)、PCI/PCI-X和PCIe总线控制器等一系列接口。
1.1 Cache
- L1 Cache在E500 V2内核中。
- L2 Cache挂接到FSB总线上。
- 在一些高端PowerPC处理器中,L2 Cache也在内核中,L3 Cache挂接在FSB总线上。
1.2 SoC平台总线
- 挂载所有外部设备。
- 与FSB通过Cache一致性模块连接。
1.3 OCeaN
- OCeaN是连接快速外设使用的交叉互连总线。
- 特点:使用OCeaN互连的总线控制器可以直接通信,而不需要占用SOC平台总线带宽。例如,
PCI总线控制1
的数据报文可以直接发向PCI总线控制器2
。
2. PCI设备配置空间的访问机制
- 配置读写总线事务:读写PCI设备的配置空间。
- 寻址:BDF,即Bus Number, Device Number, Function Number。
- 总线号(Bus Number):HOST主桥遍历PCI总线树的时候确定,由系统软件决定。
- 每个Device最多包含8个Function。
- 每个Function有独立的配置空间。
- Host主桥使用寄存器号访问配置空间的某个寄存器。
2.1 寄存器
2.1.1 CFG_ADDR & CFG_DATA
系统软件使用CFG_ADDR
和CFG_DATA
寄存器访问PCI设备的配置空间。
- CFG_ADDR寄存器保存PCI设备的BDF和寄存器号,具体字段如下:
- Enable位:为1时,HOST主桥使能对PCI设备配置空间的访问,当HOST处理器对
CFG_DATA
寄存器进行访问时,HOST主桥将对这个寄存器的访问转换为PCI配置读写事务并发送的总线上。 - Bus Number:总线号。
- Device Number: 设备号。
- Function Number: 功能号。
- Register Number: 寄存器号。
- Enable位:为1时,HOST主桥使能对PCI设备配置空间的访问,当HOST处理器对
2.1.2 INT_ACK
系统软件使用INT_ACK
寄存器访问挂接在PCI总线上的中断控制器的中断向量,该寄存器只读。
2.2 流程分析
- MPC8548处理器向
CFG_ADDR
寄存器写入BDF和Register Number,并设置Enable
位。如果Enable
位不设置,那么处理器对CFG_DATA
的访问就只是一个普通的I/O访问,HOST主桥不能将其转换为PCI配置读写请求。 - MPC8548处理器向
CFG_DATA
寄存器进行读/写访问,HOST主桥根据CFG_ADDR
生成PCI配置读写事务,并将该事务路由到指定设备。
PCI设备的配置寄存器采用的是小端模式,如果与HOST处理器不同,则要考虑转码。
3. 地址转换
ATMU(Address Translation and Mapping Unit)寄存器组:
- Outbound寄存器组:存储器域->PCI总线域
- Inbound寄存器组:PCI总线域->存储器域
3.1 存储器域->PCI总线域
只有当CPU读写访问的地址范围在outbound寄存器组管理的地址空间之内时,HOST主桥才能接收CPU的读写访问,并将CPU在存储器域的读写访问转换为PCI总线域的读写访问,然后才能对PCI设备进行读写操作。
3.1.1 原理简介
- 初始化阶段,配置Outbound寄存器组,常见的三个信息如下:
- 要映射的存储器域起始地址,也就是想要把哪一段存储器域的地址映射到PCI域。
- 映射到PCI域的起始地址,也就是要把存储器域的地址映射到PCI域的哪一段。
- 映射长度,也就是要映射多长一段地址空间。
- CPU对存储器域某地址x进行读写访问时,硬件首先检测x是否在cache中,如果在cache中,那么直接对cache进行访问。(绝大多数情况下,PCI等外围设备使用的地址空间是不可cache的,所以x不会落在cache中)
- 检查相关配置,判断地址x是否输入PCI总线空间。如果属于PCI空间,则检测x是否在Outbound寄存器组中完成映射,如果已经映射,那么HOST主桥将该访问转换为PCI总线事务,发送到PCI总线上。
3.1.2 Outbound寄存器;POTARn和POTEARn
- PCI总线域的地址。
3.1.3 Outbound寄存器;POWBARn和POWARn
- 存储器域的地址。
- 映射使能。
- 读类型:存储器读,或者IO读。
- 写类型:存储器写,或者IO写。
- 窗口大小,即映射长度,4KB ~ 64GB。
在许多系统软件中,将Outbound窗口两边的寄存器使用“直接相等”的方法进行映射,将存储器域的地址和PCI总线地址设为相同的值。但需要注意,二者虽然值相同,但地址域不同。
3.2 PCI总线域->存储器域
PCI设备进行DMA读写时,只有访问的地址在Inbound窗口中,HOST主桥才能接收这些读写请求,并将其转发到存储控制器。
3.2.1 原理简介
- 初始化时,配置Inbound寄存器组,常见的三个信息如下:
- 源地址,即PCI域地址。
- 目的地址,即存储器域地址。
- 映射长度。
- PCI设备使用DMA操作访问主存储器空间时,首先检查要访问的地址是否在Inbound寄存器组中完成映射,如果未映射,则禁止本次访问。
- 如果Inbound寄存器中有对应映射配置,则HOST主桥将当前访问转换为存储器空间访问。
3.2.2 Inbound寄存器:PITARn
- 存储器域地址。
3.2.3 Inbound寄存器;PIWBARn和PIWBEARn
- PCI总线地址。
3.2.4 Inbound寄存器;PIWARn
- 使能位。
- 预读支持位。
- Cache共享一致性操作配置。
- 窗口大小,即映射长度。
4. 总结
HOST主要需要完成PCI设备的配置及读写访问,那么要实现一个HOST主桥,就需要实现PCI设备配置空间的访问和PCI域/存储器域地址空间的相互映射。