PCI的配置空間

2021-06-12 17:12:08 字數 4421 閱讀 3453

pci的配置空間

主要討論如何去訪問pci配置空間和描述pci裝置的配置空間的定義和使用規則。理論上如何訪問pci配置空間的問題是屬於匯流排操作的一部分,但是和配置空間有著密切聯絡,有必要一起討論。

下圖是pci架構的級聯圖。不同的bus就是通過bridge來連線的。每個pci bus上都可以掛載多個pci裝置,相同bus上的各個裝置是以pci device no.來區分的。所以在邏輯上來講,在pci匯流排系統中的各個pci裝置都會有乙個特定而唯一的邏輯位址---bus_no + device_no + function_no. 匯流排上的邏輯訊號就解碼每個裝置的不同邏輯位址來找到對應的pci裝置,並訪問其配置i空間。

由於pci匯流排在開機之後任何時候都可以去訪問,所以我們可以在post階段或者系統中隨時可以依據裝置的匯流排邏輯位址去訪問該pci裝置,每個pci裝置都會有個唯一對應的匯流排位址的,比如下圖。

這個是在本人電腦上讀到的ehci對應的匯流排位址。busno=0;deviceno=29;functionno=0.所以如果要訪問這個pci裝置-ehci的話,就要使用pci配置空間訪問函式中輸入這個位址。當然如果要訪問配置空間的某個register的話,那麼輸入的引數應該是(busno, deviceno, functionno, register)。

訪問pci配置空間的演算法

理所當然,說到這裡就必然涉及到如何去訪問pci匯流排,其中的演算法是怎樣的呢?pci協議中定義了一組io埠cf8h/cfch。如果要寫程式來訪問配置空間,那麼必須呼叫這組io來實現。主要的形式為:

out cf8h, config_address;

in config_data,cfch;

這裡config_address表示函式需要輸入的四個引數(busno, deviceno, functionno, register)來組合pci匯流排的邏輯配置位址,以32bit表示。

而config_data則是通過內部配置機制而得到的反饋資料,讀到的就是pci裝置中的配置空間register,以32bit表示。

pci配置位址

接下來大家都會關心如何組合得到config_address呢?config_address是32bit表示的,組合形式如下圖所示。

需要說明一下:

pci匯流排上最多支援256個bus;每個bus上最多支援掛載32個device;而每個device則最多支援7個function(關於function部分可以後續討論);而pci配置空間則最多有64個register(32bit)。這些限制從上圖也可以看出來的。

所以一般以8bit來表示busno,5bit表示deviceno,3bit表示functionno,6bit表示registerno。

在寫入cf8h埠之前需要置bit31為『1』。表示使能 pci匯流排配置週期,來實現訪問pci裝置的配置空間。

pci配置空間暫存器

通過pci匯流排的配置週期,得到的config_data是以什麼形式表示的呢?

其實,得到的32bit資料就是我們需要討論的pci配置空間。如下圖:

當然,得到的config_data是32bit表示的,實際情況pci配置空間register可能是byte、word或者dword等。這個都不是問題。

pci配置空間的描述

1、  pci裝置識別

這些register都是唯讀的,所有pci裝置均要定義並使用這些register。程式也是通過讀取這些register獲得裝置名稱和廠商名稱的。

vendor id:     表示該裝置的廠商代號。pci sig會給每個pci裝置廠商分配乙個唯一的id,16bit表示。如果讀到該處為0ffffh,那麼表示對應邏輯位址上沒有裝置存在。

device id:     表示裝置的id號,這是由廠商自由分配的id。

revision id:  由廠商自己定義,可以認為是device id的擴充套件。

header type     區分裝置型別的register。bit7表示該裝置是否是多fuction裝置,若bit7=1表示為多功能裝置(最大功能號位7),反之則是單功能裝置。 而bit[6:0]則表示裝置是否是bridge。00h表示普通pci裝置,type0;如為01h,表示pci bridge。

class code        這部分用來區分裝置的功能性。包含三個byte。0bh為base class code;0ah為sub-class code;09h表示程式設計介面。對於base class code有如下定義:

可以參考

2、  pci裝置的控制register

command:    通過此register來實現pci週期的響應,當0被寫入此register時,裝置邏輯上是不與匯流排」相連」的;而只有配置週期能訪問該pci裝置。如bit0、bit1均為0,則表示該裝置對應的memory空間和io空間是不能訪問的。上電啟動該register為0.

控制該裝置對io空間訪問的響應。0表示不響應io空間的訪問;1表示能訪問io空間訪問。

控制該裝置對memory空間訪問的響應。0表示不響應,1表示響應memory空間的訪問。

控制該裝置成為匯流排上的master。0表示不能產生pci訪問,1表示可以當做master來主動產生pci 訪問行為。

控制裝置產生特殊的操作週期,具體不詳。

控制裝置能使用memory write and invalidate。該裝置必須是master,才能產生memory write and invalidate 指令。詳情參看pci spec 的chapter3

針對vga裝置來說的,enable vga裝置訪問的palette 暫存器,並能偵測palette data。

使能裝置響應parity errors

使能wait週期,實現控制裝置的address/data stepping。stepping可以理解為單步?步進?

使能seer#的驅動功能

針對master 裝置來說的,在仲裁的問題中比較重要。置1表示支援到所有target的fast back-to-back 傳輸。

fast back-to-back表示在完成乙個傳輸週期之後沒有wait cycle,而是直接開始下乙個資料傳輸。包括兩個情況:對同乙個target操作back2back;對不同的target操作back2back。由於pci匯流排是並行匯流排設計,所有的裝置都是併聯掛載在匯流排上,所有仲裁機制必須很好的處理好fast back2back問題。

10-15

reserved

3、  pci裝置的狀態register

無需多言,可以按照字面上來理解。

4、  中斷相關register

interrupt line:        8bit的register表示裝置所分配的irq號。可讀寫的暫存器,在post階段會被bios寫入乙個pci irqrouting分配的中斷。如果沒有被使用則用『ffh』表示。

interrupt pin:         8bit的register表示裝置使用的中斷pin腳。1-4分別表示inta#、intb#、intc#、intd#。這個是唯讀暫存器。

5、  base address

pci裝置一般都會需要分配memory空間或者io空間。這些空間的基位址就儲存在配置空間的barx暫存器中。

是否需要分配memory空間或者io空間,這是由pci裝置自身屬性來說的。看bar的bit0的值。bit0是唯讀位,0表示對應bar對應於memory空間;1表示相應bar對應於io空間。如下圖表示bar適用於memory空間的基位址

下圖表示io空間對應的基位址

至於如何分配memory 、io空間,演算法如何?這些可以後續再寫出來。對於bios工程師來說最好的方式還是那句話:read the ****ing source code!

這裡只列舉部分比較常用的pci配置空間register,其他的register已經忽略,可以去詳細閱讀pci spec。

PCI配置空間讀取

1.拼湊出32位位址 bus有8位,dev有5位,fun有3位,最高位bit位為使能。最高位要置1,也就是bit31置1,bit23 16是寫入bus number,bit15 11是device number,bit10 8是寫入function number.如果要訪問pci裝置中bus num...

PCI配置空間簡介

配置空間中最重要的有 vendor id 廠商id。知名的裝置廠商的id。ffffh是乙個非法廠商id,可它來判斷pci裝置是否存在。device id 裝置id。某廠商生產的裝置的id。作業系統就是憑著 vendor id和device id 找到對應驅動程式的。class code 類 共三位元...

PCI裝置配置空間問題

pc機中包括三種空間 儲存器空間 i o空間 配置空間。儲存器空間主要包括記憶體 視訊記憶體 擴充套件rom 裝置緩衝區等,一般用於存放大量資料和進行資料塊交換。i o空間主要包括裝置的控制暫存器和狀態暫存器,一般用於控制和查詢裝置的工作狀態以及少量資料的交換。配置空間主要用於向系統提供裝置自身的基...