pci总线扫描操作一(pci桥操作)


cpu和pci总线相连时通过pci桥片,也就是在查找设备时,主要是桥片产生的命令,然后进行设备的查找。

一,怎么看手册

两个手册:
a,PCI Local Bus Specification Revision 3.0
b,PCI-to-PCI Bridge Architecture Specification Version 1.2
a文档是讲解pci总线的本地总线(local bus)操作的
b文档是讲解pci桥的操作的。
首先看的是a,但是没有看明白,云里雾里的,之后再看的b。
建议也是先看a文档的第六章,之后看b文档的第三章,反过来再看a文档的第三章。
这样对pci的扫描就比较清楚了。
仅做建议,毕竟每个人的习惯不同。

二,看一下两个header配置空间

这里只是贴出来配置空间,方便用到的时候h查看,其中每个配置的代表的具体意思看手册就好了。


三,配置命令类型

共有两种配置命令格式:


当对pci设备进行配置时,需要定位要配置的设备在哪个总线上以及配置设备的哪个配置空间,这就产生了上面两个格式的配置命令。
具体的用法呢,还是比较简单的。
当host或master发出一个配置命令时,如果这个设备就是挂载在当前的这个总线上,那就直接使用命令格式中的type0,如果是在当前总线上,就使用命令格式type1,告诉要配置的是哪条总线上的哪个设备。

type0命令只是在本地总线进行操作,不会传递到其他总线上,如果要查找的设备在其他总线上,那就会被master-abort终止。
type1命令会在不同的总线上进行传播,直到找到对应设备所在桥片后转换为type0格式,并且除了pci桥其他设备不会对type1进行响应。


四,bus号device号怎么决定设备地址

bus号只是判断是否在这个桥下面的总线上,
device号则是跟硬件连线有关系。
不同的device号解析时会按照下面表格中信息来进行解析,不会变,
这样在把type1命令解析到AD上时(也就是变成地址时),最终会选择到固定一个设备上。

type1转换为AD地址上的值:


这里的only one '1',就是根据上面那个device number对应的值进行填充的。


五,对于这两个配置命令,pci桥会如何进行处理

在这里又分为上次总线(primary interface)传递的配置命令,和下级总线(secondary interface)传递过来的配置命令。

1,primary interface

1)type1到type0的转换

当上级总线传递过来配置命令时,首先把type1中的bus号和这个桥上的secondary bus number和subordinate bus number进行比较,如果和secondary bus号相等,那就把type1配置命令转换为type0格式。转换方式:
第一:把最低两为清零
第二:把device number进行解析,把function number 和register number复制过来,不变化
然后就到secondary bus上进行操作了.(具体怎么操作,下local bus operation的解析)

2)type1的继续传递

当上级总线传递过来配置命令时,首先把type1中的bus号和这个桥上的secondary bus number和subordinate bus number进行比较,并且是在这个之间(不和secondary相等),那就原封不动继续向下传递到secondary bus上

3)不在这个桥以及桥后面的总线上

当上级总线传递过来配置命令时,首先把type1中的bus号和这个桥上的secondary bus number和subordinate bus number进行比较,如果不在这个范围,则这个pci桥对这个配置命令不进行回应。

4)type1到特殊周期(special cycle)的转换

如果type1配置命令符合下面条件,就转换为特殊周期:
第一:bus number和secondary相等
第二:device number全为1
第三:function number全为1
第四:register number全为0
则把这个配置命令转换为special cycle.在特殊周期时,pci设备忽略其上地址,并且在地址周期时,桥片允许AD[31:0]为任何值。且special不能连续传输。

2,二级总线产生配置命令时的操作(secondary interface的操作)

1)type1的继续传递(type1 to type1 forwarding)

当secondary接收到这样一个type1配置命令时,会原封不动的把命令传递给primary bus:
第一:device number全为1
第二:function number全为1
第三:register number全为0
第四:bus number不在secondary bus number 和subordinate bus number之间
在这种情况下,桥片会产生type1配置命令,然后把命令传递到primary bus上,然后遍历其他桥片查找设备。

2)把type1转换为 special cycle

primary bus产生符合下面情况的type1配置写的命令时,桥片会把它转换为special cycle命令,然后传递到secondary bus上。
第一:device number全为1
第二:function number 全为1
第三:register number全为0
第四:bus number和primary number相等


ok,这就是pci的操作过程,再看代码过程中,pci的代码实现就是按照这个流程进行实现的。

猜你喜欢

转载自blog.csdn.net/u010383937/article/details/78677362
PCI