2018年8月20日 星期一

Generate PCI Configuration Cycles by CF8/CFC

當Study過PCI spec後,第一支會練習的程式就是如何去Access PCI device的Configuration space,看到spec的3.2.2.3.2節,



3.2.2.3.2. Software Generation of Configuration Transactions
Systems must provide a mechanism that allows software to generate PCI configuration transactions.
Two DWORD I/O locations are used to generate configuration transactions for PC-AT compatible systems. The first DWORD location (CF8h) references a read/write register that is named CONFIG_ADDRESS. The second DWORD address (CFCh) references a read/write register named CONFIG_DATA.

兩個 DWORD(32bits)的IO位置用來產生Configuration transaction,一個是CF8(CONFIG_ADDRESS),一個是CFC(CONFIG_DATA)。

Bit31為enable bit,然後將要access的device的Bus/Dev/Func/Offset(Reg) Number分別填入圖3-2的對應欄位裡。

Configuration Transaction 有Read和Write兩種,
    (1) 首先要先產生一個DWORD的IO Write to CF8h,格式就如圖3-2
    (2) Host Bridge會latch address到CONFIG_ADDRESS register
    (2) 然後DWORD的IO Read(或者是Write)to CFCh,Host bridge會check CONFIG_ADDRESS的bit31有沒有為1,如果為1且bus number和host bridge的bus number吻合,則接收這筆transaction

另外介紹兩種Transaction type,分別為Type0和Type1。

Type0: 如果這筆transaction的target device再當前這個bus上,則會將CONFIG_ADDRESS 轉化成Type0的格式(如圖3-3),Device Number field會換成31:11的某一個bit,例如Device Number field為2h,那麼bit 12就會為1其餘則為0,Register Number和Function Number則原封不動的被複製到bit2-10,bit0-1則為"00"

Type1: 則發生再當bus number不match當前Bridge的bus上的話(表示target device再別的bus上),Bridge則直接將CONFIG_ADDRESS 原封不動的放到PCI bus上的AD lines。


沒有留言:

張貼留言

解析 NVM Express - 透過Linux OS 解析M.2 NVMe SSD

在之前,我撰寫了三篇有關NVMe的文章 ,分別是" 原理NVM Express - NVMe Submission Queue & Completion Queue (SQ & CQ) "、" 原理NVM Express - Admi...