译码方式
PCI设备使用“地址译码”方式接收存储器读写总线请求
在PCI总线中定义了两种“地址译码”方式,一个是正向译码,一个是负向译码。
正向译码
当HOST主桥通过存储器或者I/O读写总线事务访问其下所有PCI设备时,PCI总线0下的所有PCI设备都将对出现在地址周期中的PCI总线地址进行译码
如果这个地址在某个PCI设备的BAR空间中命中时,这个PCI设备将接收这个PCI总线请求
这种方式也是大多数PCI设备所采用的译码方式
负向译码
PCI总线上的某些设备,如PCI-to-(E)ISA桥并不使用正向译码接收来自PCI总线的请求,
PCI总线0上的总线事务在三个时钟周期后,没有得到任何PCI设备响应时(即总线请求的PCI总线地址不在这些设备的BAR 空间中),PCI-to-ISA 桥将被动地接收这个数据请求。
可以进行负向译码的设备也被称为负向译码设备
在PCI总线中有两种负向译码设备,PCI-to-E(ISA)桥和PCI桥
只有PCI桥连接Dock插座时,PCI桥的Primary Bus才使用负向译码方式。
这个PCI桥的Secondary Bus在接收Dock设备的请求时仍然使用正向译码方式
从PCI域到memory域
即一个总线事务是从PCI桥的Secondary Bus到Primary Bus
该总线事务使用的地址没有在PCI 桥所有的Memory Base 窗口命中时,表明当前总线事务不是访问该PCI桥管理的PCI子树中的设备
PCI桥将接收当前总线事务,并根据实际情况决定是否将这个总线事务转发到Primary Bus。
处理器到PCI设备的数据传送
处理器向PCI设备11进行存储器写的数据传送为例
存储器域将0xF300-0008 这个地址发向HOST主桥
0xF000-0000~0xF7FF-FFFF 这段地址已经由HOST主桥映射到PCI总线域地址空间,所以HOST主桥认为这是一个对PCI 设备的访问
HOST主桥将首先接管这个存储器写请求
HOST 主桥将存储器域的地址0xF300-0008转换为PCI总线域的地址0x7300-0008
通过总线仲裁获得PCI总线0的使用权,启动PCI存储器写周期
将这个存储器写总线事务发送到PCI总线0上
值得注意的是,这个存储器读写总线事务使用的地址为0x73 00-0008,而不是0xF300-0008。
PCI 总线 0 的PCI 桥1发现0x7300-0008在自己管理的地址范围内,于是接管这个存储器写请求
通过总线仲裁逻辑获得PCI总线1的使用权,并将这个请求转发到PCI总线1上
PCI 总线 1的PCI设备11发现0x7300-0008在自己的BAR0寄存器中命中,于是接收这个PCI写请求,并完成存储器写总线事务
PCI 设备的DMA操作
PCI设备11向存储器进行DMA写的数据传送过程
首先 PCI设备11通过总线仲裁逻辑获得PCI总线1的使用权,之后将存储器写总线事务发送到PCI总线1上
这个存储器写总线事务的目的地址是PCI总线域 的地址空间0x9000-0000~0x9000-FFFF
这个地址是主存储器在PCI总线域的地址映像
PCI 总线1上的设备将进行地址译码,确定这个写请求是不是发送到自己的BAR空间
首先 PCI 桥 1、2和PCI设备11对这个地址同时进行正向译码
PCI桥1发现这个PCI 地址并不在自己管理的PCI总线地址范围之内
此时PCI桥1将接收这个存储器写总线事务
因为PCI 桥1所管理的PCI总线地址范围并不包含当前存储器写总线事务的地址,所以其下所有PCI 设备都不可能接收这个存储器写总线事务。
PCI 桥 1 将这个存储器写总线事务 转发到上游总线。
首先通过总线仲裁逻辑获得PCI总线0的使用权
然后将这个总线事务转发到PCI总线0
HOST主桥发现0x9000-0000~0x9000-FFFF这段PCI总线地址空间与存储器域的存储器地址空间0x1000-0000~0x1000-FFFF 对应
将这段 PCI 总线地址空间转换成为存储器域的存储器地址空间,并完成对这段存储器的写操作
存储器控制器将从HOST主桥接收数据,并将其写入到主存储器
PCI桥提升效率的方式
Combining
PCI 桥可以将接收到的多个存储器写总线事务合并为一个突发存储器写总线事务
当 PCI 桥接收到一组物理地址连续的存储器写访问时,如对PCI设备的某段空间的DW1、2和4进行存储器写访问时,PCI桥可以将这组访问转化为一个对DW1~4的突发存储器写访问,并使用字节使能信号C/BE[3: 0]#进行控制
Merge
PCI 桥可以将收到的多个对同一个DW地址的Byte、Word进行的存储器写总线事务,合并为一个对这个DW地址的存储器写总线事务
PCI 规范允许PCI桥进行Merge操作的存储器区域必须是可预读的,而可预读的存储器区域必须支持这种Merge操作。
Merge操作可以不考虑访问顺序
Collapsing
PCI 桥可以将对同一个地址进行的Byte、Word和DW 存储器写总线事务合并为一个存储器写操作。
当PCI桥收到一个对“DW地址X”的Byte3进行的存储器写总线事务,之后又收到一个对“D W地址X”的Byte、Word或者DW存储器写总线事务时,而且后一个对DW地址X进行的存储器写仍然包含Byte3时,如果PCI桥支持Collapsing方式,就可以将这两个存储器写 合并为一个存储器写。
通常情况下,对PCI设备的同一地址的两次写操作代表不同的含义
因此绝大部分的场景,不支持这种方式