2024年1月21日发(作者:)
【我所认知的BIOS】—>PCI SCAN
LightSeed
2009-5-12
1、PCI梗概
Study到现在已经快一年了,目前我自己理解,觉得PCI device在整个计算机的应用中是很重要,及其重要的一个东东。整由于它重要,所以可能一节我还讲不完,分几次把我所理解的PCI相关东东都总结一下。PCI是外设元件互连标准(Peripheral Component Interconnect)那幺我们平时说的PCI device就是符合这个标准的设备。(^.^废话)这个标准由英代尔(Intel)公司1991年推出的用于定义局部汇流排的标准。此标准允许在电脑内安装多达10个遵从PCI标准的扩展卡。最早提出的PCI汇流排工作在33MHz频率之下,传输带宽达到133MB/s(33MHz * 32bit/s),基本上满足了当时处理器的发展需要。随着对更高性能的要求,1993年又提出了64bit的PCI汇流排,后来又提出把PCI汇流排的频率提升到66MHz。目前广泛采用的是32-bit、33MHz的PCI汇流排,64bit的PCI插槽更多是应用于伺服器产品。从结构上看,PCI是在CPU和原来的系统汇流排之间插入的一级汇流排,具体由一个桥接电路实现对这一层的管理,并实现上下之间的介面以协调资料的传送。
2、现实中的PCI
平时我们说XX买了一个不错的PCI显卡,YY买了一个PCI to USB的适配器,那幺它们都爲什麽会有个PCI三个字呢?是因为他们都是插在PCI插槽上,普通主板上的PCI插槽如图1.1
图1.1普通的PCI插槽
3、PCI设备要运作,我们应该怎幺做?
PCI设备要运作,那幺就需要PCI SCAN。
******************引用 start**********************
[Why need PCI SCAN]
现在的computer system泰半由许多PCI devices所组成,因此,BIOS POST中另一个重要的task is : PCI_SCAN !!!
它代表的是: BIOS会扫瞄 whole system,找出所有的PCI devices; initial them and
build a linked list of PCI devices.在此list中的每一个node都代表一个PCI device,且含有其characteristics !
Ex. Vendor ID,Device ID, PFA,Option ROM exist or NOT,...etc.
一旦建好此表,以后的 tasks随时都可以参考!!!
所以, after PCI_SCAN,有两件事完成了:
1. PCI device initialization;device config registers(Part A) are correctly set ...
2. One data structure is built to describe the PCI devices in whole system(建在memory中)
这也是属于kernel code part ^_^ ( system一般很少 hang at )
******************引用 end***********************
以上引用自<小华的部落格>
连接:/2007/10/
到这里可能多半的人都会想到那幺怎幺去scan这些PCI device呢?
4、PCI device scan
4.1PCI设备的configuration space是什麽
顾名思义,PCI设备的configuration space是用来配置PCI device的。我们平时在BIOS修改的某些寄存器就是修改这个里面的东东。这个space是严格按照PCI spec来做的,查看详细的说,请参见PCI spec2.3的chapter 6 page 195。图4.1是配置空间的位置说明,截于PCI spec。
图4.1 PCI配置空间的map
4.2怎幺判断PCI device存在
扫描PCI device一般都是这样,读取PCI设备的configuration space中vendor
ID和device ID,判断他们是否为0xFFFF。若是,则说明该PCI device是不存在的。(因为每个PCI device的制造商都会把他们的ID填入这个位置,而且是read
only的。)
4.3怎幺访问PCI设备的configuration space
用CF8和CFC两个端口来访问,爲了能够不失真我引用了spec里的原文来说明。“Two DWORD I/O locations are used to generate configuration transactions
for PC-ATcompatible systems. The first DWORD location (CF8h) references a
read/write registerthat is named CONFIG_ADDRESS. The second DWORD address
(CFCh) references a read/write register named CONFIG_DATA”从CONFIG_ADDRESS和 CONFIG_DATA其实就很容易看出了,当我们向CF8端口(CONFIG_ADDRESS)写入规定的格式地址时,便可以从CFC端口(CONFIG_DATA)读回相应的数据。
4.4 PCI scan的技巧
这里两个小技巧:
①
在读回的端口,你可以取其中的任何一个byte或者word甚至整个double
word
②
爲了提高扫描的效率,其实可以先查看header type这个寄存器中的bit7。Bit7的0与1表示该PCI设备是否是single function的,若single function
device那幺这个时候就可以直接scan下一个PCI设备啦。
4.5访问举例
图4.1是向CF8端口写入的地址格式,截图于spec page 32
图4.1
以下是一段访问配置空间的code。
mov eax, 80020500h ;bus 2 device 1 function 1 register 0
mov dx, 0cf8h
out dx, eax
mov dx, 0cfch
in eax, dx
以此类推,变可以把PCI device的整个configuration space都读取出来。效果图见图4.2
图4.2用ADU显示出来的PCI configuration space数据截图
以上是我对PCI scan的理解。不足之处还望各位指正。


发布评论