2009年10月24日 星期六

BIOS - PCI篇

在PCI Device有幾種定址方式Memory AddressI/O Address SpacesConfiguration Address Space

而在Configuration Space會有Configuration Space Header的格式,會有幾個基本的ID: Device IDVendor IDSubsystem IDSubsystem Vendor ID

而大部分的PCI的這四個ID都一定要填,除了,PCI Spec 3.0的Subsystem Vendor ID and Subsystem ID的這一個小節所提到的,「Implementation of these registers is required for all PCI devices except those that have a base class 6 with sub class 0-4 (0, 1, 2, 3, 4), or a base class 8 with sub class 0-3 (0, 1, 2, 3).」

除了base class為6且sub class為0-4或base class為8時且sub class為0-3,這一些的Subsystem ID與Subsystem Vendor ID可以不填之外,其它都要填!

而這個時候,要了解到base class與sub class的儲存的位置在哪裡?它就位於Configuration Space Header的Offset 09h起連續3個DWORD就是Class Code,而由低到高分別三個DWORD是「The upper byte (at offset 0Bh) is a base class code」「The middle byte (at offset 0Ah) is a sub-class code」「The lower byte (at offset 09h) identifies a specific register-level programming interface
另外一提的是,在PCI的最基本單位為1 DWORD = 2 bytes

而這一次出的作業就是把需要填Subsystem ID與Subsystem Vendor ID的所有PCI的七個資料列出來分別是Four ID:「Device ID」「Vendor ID」「Subsystem ID」「Subsystem Vendor ID」與Three number:「Bus number」「Device number」「Function number

[2010.04.13 補充]


要如何存取PCI哩~
有兩個存取方式
1. 透過Index I/O
2. 透過Memory Access

在0x40-0x255之後的位址,就是給PCI Device使用的區塊~所以,我們PCI spec也沒有辦法知道是如何使用那一些區域

參考資料:
封存檔:作業系統的 PCI ID 使用規格書
pci driver
在 PCI 匯流排列舉期間停止似乎 CEPC 乙太網路開機載入器
Class Code Table
PCI_LIB 3.0
UEFI 2_3
關於PCI的probing

沒有留言: