PCI SPEC 学习(2)

时间:2024-04-04 19:23:48

PCI 学习(2)

本篇主要是介绍英文SPEC中的第三章的内容

bus command

PCI SPEC 学习(2)
Interpuy Acknowlege:提供一个命令能够隐式的读取中断控制器的地址,该命令个人认为基本用不上。
Special Cycle:在PCI总线上向每一个设备进行一个消息广播。
I/0 read,I/O write:分别是对I/O映射空间的读取与写入。
Memory Read,Memory Write:分别是对内存空间的读和写。
Configuration Read,Configuration write:对配置空间的读和写。
重点说一下 Memory Read,Memory Read Multiple,Memory Read Line的区别,这三个的区别主要是读取的数据大小的区别,因为PCI总线只有32bit,4个btye的AD输入,因此每次只能传输1个DWORD的数据,但是当你需要读取3个DWORD的数据时,你使用Memory Read的命令的话,PCI只会读取完1个DWORD后就会把相应的引脚deasserted,后续的DWORD的读取就需要重新asserted比如FRAME#,TRDY#等引脚信号,这样效率比较低,但是如果你使用Memory Read Line的命令读取时他就可以连续读取Cacheline的长度的数据,这里的Cacheline的长度是由Configuration Space中的Cacheline进行决定的,对于最后一个Memory Read Multiple它读取的数据时可以超过Cacheline的长度的。
其他的就不做过多的解释了
接下来需要注意的就是Prefetchable 和non-prefetchable的区别,也就是指device的设别可否预取的区别,由于我们知道在PCI中如果我们可以在data transfer中预取一整段的数据可以极大的提高数据读取效率,但是例如中断寄存器,状态寄存器等寄存器有着这样的一个特性,就是在访问完成后会自动进行清零等操作,每次读取都会改变其寄存器的值,因此PCI定义了Prefetchable 和non-prefetchable。可预取的数据要满足这两个特点就是
1.在读取完后不得改变数据和数据的状态。
2.可以将多次读取的数据合并成一次读取事务。

Address

传统的设备往往都是直接通过device的I/O端口等读取其I/0空间和内存内存空间,这样访问的效率不搞,因此在现代计算机系统中,将device的I/0 space和Memory space映射到计算的主存储器中,这样计算机就可以直接通过改变存储器的空间,从而得到直接改变设备寄存器空间的作用,这个几个空间如何映射的呢?,这就是PCI总线中最重要Configruation Space所实现的的功能,PCI负责将device上的寄存器映射到主存储器的空间。

I/O Space decode

1.AD[1::0] indicate the least significant valid byte for the transaction. 2.The byte enables indicate the size of the transfer and the affected bytes within the DWORD and must be consistent with AD[1::0].

针对I/O空间解码,SPEC中已经写的很清楚了,如下图所示
PCI SPEC 学习(2)
结合这个图看就很好懂了。

Memory Space decode

在Memory Space decode中AD[31::0]上的AD[1::0]的标志位决定了线性的读取Memory的顺序,如下图所示
PCI SPEC 学习(2)
图中的Linear Increamenting就是简单的线性读取,Cacheline Wrap mode的读取方式就是不按照线性读取的方式,而是乱序的,第二种就无需了解了,因为已经被淘汰了。

Configuration Space decode

配置空间的解码就是整个address的重点部分了。其中位于CPU的最重要的两个寄存器CONFIG_ADDRESS和CONFIG_DATA,他俩分别存放在CF8h和CFCh中。整体的配置流程如下,当我们需要使用那个PCI总线上连接的device时,按照一定的顺序将配置成如下所示。
PCI SPEC 学习(2)
然后host/PCI桥读取CONFIG_ADDRESS上的数据,若Bus Number等于主桥的则直接将CONFIG_ADDRESS转换成Type0的形式
PCI SPEC 学习(2)
PCI SPEC 学习(2)
如图4所示转换成Type0的模式,(如图5所示,在我的理解中,我个人认为Type0的reserved的内容就是图4中PCI AD BUS 中的设备**Number,因此我认为就是直接转换成Type0),接着上文,如果通过Bus number发现该设备不是在PCI local bus上,HOST/PCI Bridge就把数据转换成Tpye1,传递到PCI上的P2P桥上,再进行下次的判断和转换,知道找到该设别,这个过程就涉及到PCI的设备的枚举搜索了,这里不进行缀述,会再写一个博格进行叙述。