您的位置:首页 > 移动开发 > IOS开发

【我所認知的BIOS】—>PCI SCAN

2011-12-15 17:17 4717 查看

转自: /article/2826639.html

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 this stage...)

******************引用 end***********************

以上引用自<小華的部落格>

連接:http://biosengineer.blogspot.com/2007/10/bios-pci-scan-9.html

到這裡可能多半的人都會想到那麼怎麼去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 0, function 5(这里原本我写错了,是网友goldencrest帮我纠正了过来,谢谢!)

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

22楼 匿名用户 2010-03-03 09:31发表 [回复]

Lightseed:可否说一说PCI to PCI bridge的相关内容呢?
21楼 lightseed 2010-01-26 18:15发表 [回复]

to wcc1982:

我觉得你应该好好看看chipset的datasheet,你挨着挨着查查看,他们有冲突的么?肯定没有嘛,你可以这样理解,这不同的设备都是在LPC这个PCI设备下实现了。(LPC的配置空间里可以改变某些设备的操作地址,比如XXX base address)从这个方面说,笼统理解更为合适,因为实现的功能较多,而且方式还不一,还不好用一种标准的说法去定义。
20楼 wcc1982 2010-01-26 14:49发表 [回复]

我是想问一下,为什么这么多device(RTC ,DMA,8259 etc)共用这一个D31:F0 的 256 bytesPCI空间?

问了一下别的朋友,说它们是共用这一个PCI空间,只是分别用它不同的offset,lightseed是否也这样认为呢?
19楼 lightseed 2010-01-26 14:09发表 [回复]

to wcc1982:

ICH的全称是I/O Controller Hub,不知道能否解答你的问题。
18楼 wcc1982 2010-01-26 13:25发表 [回复]

To Lightseed!

可否请教一下,为什么南桥里面有很多device都是D31:F0呢?

RTC D31:F0

DMA D31:F0

8259 D31:F0

8254 D31:F0

。。。。。。。。
17楼 testcase 2009-11-26 11:28发表 [回复]

感谢博主的回答,昨天下了不少spec,原来全部的答案都在这些spec中。之前不知道还有这么个东西。

其实这些都应该是基础知识
16楼 lightseed 2009-11-25 11:07发表 [回复]

to testcase:

我说说我的理解吧,在CPU送出address给后,北桥负责把这些地址开关开向谁。其实0CF8这些port都是很legacy的了,是固定打开给操作PCI用的IO。这个地址的decode就是北桥在做的动作。(你还可以查阅一下NB的datasheet,其中有好多页都是在说地址解析的。)至于你最后那个问题,真的呃,不是三言两语就给你说的清楚的。

(简单点说)北桥把命令(或数据)放到IO上后,PCI的总线也会对地址进行解析,一层一层往下走。当相应PCI设备完成操作后,又把数据放回到CFC上,然后再又一系列过程传回北桥等等。。实际过程可比这复杂多了。你多看看spec,和相关的资料,应该就知道了。我也只能是简单描述一下。希望对你有用。
15楼 testcase 2009-11-25 09:42发表 [回复]

请救一个问题,关于扫描PCI总线,0cf8h和0cfch是哪个部件的IO Port呢,它是如何完成我们交给它的任务的呢?
14楼 goldencrest 2009-10-08 00:58发表 [回复]

你太客气了。

你的文章写得很好,我觉得读过之后很有收获。谢谢分享。
13楼 lightseed 2009-10-07 20:35发表 [回复]

to goldencrest :

不好意思,我以前在写这篇文章的时候没有详细演算一遍,刚刚演算了一下确实是我当时写错了,今天你纠正了过来。谢谢!我会注明是你帮我纠正过来的。
12楼 goldencrest 2009-10-07 14:36发表 [回复]

不好意思,下面是我的理解,

1) byte 0, 这里是0x0,bit 2-7也就是0,所以register number是0, 是对的

2) byte 1, 这里是0x05, bit 8-10是 101b,所以function number是5; bit 11-15是0,所以device number是0,byte 2,这里是0x02,所以bus number是2,

请帮忙指正一下,哪里理解得不对。 谢谢!
11楼 lightseed 2009-10-07 12:47发表 [回复]

to goldencrest :

看来你还没有理解图4.1那个图的意思哦。再结合pci 的spec你再好好理解一下。这个东西并不难,主要是你还没有理解,多看两遍就了解了。
10楼 goldencrest 2009-10-07 08:17发表 [回复]

mov eax, 80020500h ;bus 2 device 1 function 1 register 0

这里注释应该是指 bus 2, device 0, function 5?
9楼 lightseed 2009-09-11 16:58发表 [回复]

wuxupeng999,

继续加油吧,只要坚持我想没有磨不细的铁杵
8楼 wuxupeng999 2009-09-11 13:01发表 [回复]

看完了,正在学BIOS方面的知识,很多还看不懂,了解得东西太少了。。感谢楼主。
7楼 lightseed 2009-08-24 12:41发表 [回复]

匯流排你翻译过来看看,就是总线的意思。
6楼 Magicyan2008 2009-08-24 09:46发表 [回复]

应该是桥之类的东东吧。
5楼 Magicyan2008 2009-08-24 09:45发表 [回复]

匯流排是什么东东,知道简体和繁体有差距,可我看繁体小说的(说频)时候怎么没感觉出来,一看专业点的就感觉出来了。
4楼 fengxinzi4 2009-07-26 16:56发表 [回复]

能不能给我发点文档啊
3楼 lightseed 2009-07-22 09:07发表 [回复]

呃。。。。qqhao 过誉了。文档的话,目前还太少,以后我全部整理出来后,如果有人需要的话我再发给他(她)吧,现在都还太凌乱了。能够得到您的肯定,对于我一小辈来说,我很荣幸啦。继续add oil
2楼 qqhao 2009-07-21 16:38发表 [回复]

图文并茂好呀,要是有文档直接下载就更好了,真是造福BIOS 人啊...
1楼 lightseed 2009-05-27 09:18发表 [回复] [引用] [举报]

我发觉一个问题,我每篇文章里都有N张图片,为了能够图文并茂。结果上传的时候就麻烦了。不晓得可以不可以直接上传文档。这样的话直接下载就可以看了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: