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的理解。不足之处还望各位指正。