追踨法蘭克

2012年4月30日 星期一

PCI Configuration Space Register介紹

PCI Configuration Space 依不同的Chipset 會有些許的變更,有些Registers是hardware設定好的,有些在BIOS階段可以設定,有些在OS階段才能設定,但它都有用共同的部分,我們稱之為PCI Configuration Space Header (offset 0x00~0x3F),以下介紹的是常用的offset,知道了這些資訊,我們可以在BIOS中搜尋到該PCI Device做許多設定。

Vendor ID (0x00~0x01): 代表PCI裝置的製造商,是一組獨特的ID,要向PCI SIG訂下它,如Intel
為0x8006. 如果值為0xFFFF,表示該位址沒有裝置。

Device ID (0x02~0x03): 裝置的ID,由製造商所訂定。

Revision ID (0x08): 裝置的版本,由製造商所訂定。0是可被接受的值。

Class Code (0x09~0x0B): PCI裝置的類型,分為Base class、Sub class、Interface三個Bytes,表示如網路裝置、IDE裝置、VGA、Controller、Bridge等。
Header Type (0x0E): PCI Configuration Space Header 的類型,這邊介紹的是type 00 的, 也就是代表一個device, type 01 代表 Bridge, type 02 代表Card Bus, Bit 7 為1 代表multi-function, 否則為single function.

Base Address Register (0x10~0x27): 這邊可以有很多組Register、由它的Bit0,、Bit1、Bit2來決定為Memory Space or IO Space,32 Bits or 64 Bits. 如下圖。


Capabilities Pointer (0x34): PCI延伸的功能,如PCI-E就是這欄位可以判斷或是MSI、AGP等等。它包含一個Pointer,指向另一個offset,0x34的是第一個Pointer,指到最後一個的Pointer為0x00為止,所以可以有多個Capability.



Subsystem Vendor ID and Subsystem ID (0x2C~0x2F): 用來識別add-in Card或Subsystem的ID, 因為Vendor ID和Device ID是有可能相同的。(當class code base class 6, sub class 0-4 或base class 8, sub class 0-3時,為add-in Card或Subsystem,此時Subsystem Vendor IDs可由PCI SIG獲得,而Subsystem ID 為Subsystem Vendor所訂定).
Interrupt Line (0x3C): 中斷腳位最後Route到的IRQ位置,在BIOS階段應設定好它,讓進OS後可以參考它的資訊。

Interrupt Pin (0x3D): 中斷腳位接出的PIN腳(INTA#、INTB#、INTC#、INTD#其中之一)

3 則留言: