PCI enumerate
By Lightseed
10/06/2010
这篇文章本是很久以前写的,最近感觉比较懒惰今天才贴出来。近两年开始EFI越来越流行了,可以说逐渐有颠覆legacy bios的趋势。处于对知识的渴望和追求我也最近对EFI有了一些简单的了解,我打算在后续的文章中做一个关于EFI的专题,基于EDK来写blog应该不错。毕竟它是开源的嘛,如果以AMI的EFI来写文章我估计可能会涉及到商业机密的问题。希望能像网上那个《linux的那些事儿》那样做成一个一个的小专题。也希望如果有兴趣的朋友或者BIOSER能够和我联系,咱们一起研究哈。期待您的加入。。。先说说我的打算,PCI,IDE等这些比较重要的东西都各自做一个小专题。至于其他的嘛暂时还没想到。形式以code为例子直接加注或者说明。
另外之前有关于ACPI的文章,但是看了看,真的觉得没啥好说的,都是架构上的一些东西。估计要说的话,肯能也就要结合到实际的代码,我再斟酌斟酌用什么形式来表达出来会比较好。
1、PCI bridge的工作原理
在PCI的架构中,引入了PCI bridge的概念来扩展使用更多的PCI设备。其他的基本东西就不多讲了,开门见山先分析在PCI bridge处理总线上访问的原理。
1.1PCI总线的两种方式
PCI总线上有两种访问方式,分别是Type0和Type1。且bridge会通过比对自己的secondary bus number和subordinate bus number后做出后续的反应是type0还是type1的配置。
1.2详细说说type1,
当总线上CPU发出了一个访问PCI的动作,(假设说CPU用的是type0的方式,经过bridge1后被其配置成了type1)那么PCI bridge会去做比对,这时就出现了三种情况:
①如果此总线序号不在bridge的secondary bus number和subordinate bus number之间则忽略掉它。
②如果此总线序号与bridge的secondary bus number相同则将其转换成类型0 配置命令。
③如果此总线序号位于bridge的secondary bus number与subordinate bus number之间则将它不作改变的传递到二级总线接口中。
总之就是通过这中方式找到PCI总线上的对应的PCI设备,然后访问之~。
2、PCI 在枚举过程
2.1PCI的bus number必须遵循的一个规则
在我们当前的主板上面PCI to PCI bridge是基本上都会有的,整个PCI系统要能够正确地被解析访问到,PCI的bus number必须遵循一个规则:
All PCI buses located behind a PCI-PCI bridge must reside between the seondary bus number and the subordinate bus number.
有了这个规则,那么不管是BIOS还是linux