PCIe Chapter 2:讀取設定空間與尋找 Capability
本章從已找到的裝置功能出發,查詢 Device Serial Number(DSN,裝置序號)。先依功能種類選擇清單,再沿指標找到結構,最後讀取資料並按規格重組序號。
【模擬資料】以下位置與讀值為教學用途建立,不代表特定硬體或平台。
- MSI-X
- Message Signaled Interrupts Extension,表格式訊息中斷
- AER
- Advanced Error Reporting,進階錯誤回報
先區分查詢對象、設定 offset 與 CPU 位址
先用 Segment(匯流排的邏輯分組) 與 BDF(Bus、Device、Function 識別號) 選定 Function(可個別辨識與設定的功能),再用 byte offset 選它的設定暫存器。這份空間共 4096 bytes,前 256 bytes 是 PCI 相容區,0x100–0xFFF 是延伸區。ECAM(Enhanced Configuration Access Mechanism)提供 CPU 的記憶體映射設定存取;平台提供實際映射,offset 本身只表示 Function(可個別辨識與設定的功能) 內的位置。它與裝置 Memory BAR 的工作區分開。
- BDF
- Bus/Device/Function,匯流排、裝置與功能識別
- BAR
- Base Address Register,基底位址暫存器
傳統 Capability(描述或控制能力的結構) 清單由 Header 的 Capabilities Pointer 進入,本章 Type 0/1 的指標在 0x34。Extended 清單則直接從 0x100 開始。PCI Express Capability(描述或控制能力的結構) 本身在傳統清單,DSN(Device Serial Number,裝置序號) 才在 Extended 清單;不能靠名稱是否含 PCIe 來分類。
閱讀位置
Base 6.0 §7.2–§7.2.2.2,Figure 7-3/Table 7-1,pp.905–909;Figure 7-4,p.916;Capabilities Pointer:§7.5.1.1.11,p.926;Extended 清單:§7.6–§7.6.3,Figures 7-42/7-43、Table 7-39,pp.1008–1010。
同一個 offset,為什麼兩個 Function 的欄位不同?
先讀所選 Function 在 0x0E 的 Header Type Register(標頭類型暫存器),以 bits 6:0 的 Header Layout 選圖。Type 0 的配置看 Figure 7-10;代表 Root Port 或 Switch Port 的 Type 1 配置看 Figure 7-14。兩張圖的橫向位置是 bit,最右側是從 Configuration Space 起點算的 byte offset。
| offset | Type 0 | Type 1(Root/Switch Port) |
|---|---|---|
| 0x10–0x14 | Base Address Registers(BAR,資源基底暫存器)的一部分 | 此 Port 的 BAR 0、BAR 1 |
| 0x18 | BAR 區域的一部分 | Primary、Secondary、Subordinate Bus Number 等欄位 |
| 0x20 | BAR 區域的一部分 | Memory Base 與 Memory Limit |
例如,看到 0x18 的 32-bit 讀值後,先取得同一 Function 的 Header Layout;選到 Type 1 才把其中對應的 bytes 解作 Bus Number。Type 0 的同一位置則屬於 BAR 區域。再查具體 BAR 的型態與欄位定義,才能解讀其用途。Type 1 的 Bus Number 用於安排下游搜尋範圍,Memory Base/Limit 描述資源視窗;完整配置與路由分別接到 Chapter 3 和 Chapter 4。
Header Type 的 bit 7 與 bits 6:0 要分開讀。以本章假設值 0x80 為例,Layout 為 Type 0,bit 7 表示 Device 可能有多個 Function,還需進一步查詢。VF 有不同適用規則,本例不納入。Header Layout 與 Configuration Request 的 Type 0/Type 1 封包分類也各有定義。
- VF
- Virtual Function,虛擬功能
閱讀位置:Base 6.0 §7.5.1.1.9、Figure 7-8/Table 7-7(文件頁/PDF 頁 924–925);Figure 7-10(p.928);Figure 7-14 及其適用說明(p.936)。先從 Header Type 選圖,再讀該圖的 offset 與對應欄位說明。
ID 為 0 與 Next 為 0,不能混為一談
傳統清單一般以 16-bit 開頭的低 byte 表示 ID、高 byte 表示 Next。教學資料中的路徑是 0x40 → 0x50 → 0x70 → 0xD0 → 0,依序為 PM、Null、PCIe、MSI-X。
- MSI-X
- Message Signaled Interrupts Extension,表格式訊息中斷
| 位置與寬度 | 讀值 | 判讀 |
|---|---|---|
| 0x50,16 bits | 0x7000 | 傳統 ID=00h 是 Null;Next=0x70,繼續走訪。 |
| 0x100,32 bits | 0x18020001 | Extended ID=0001h,AER Version 2;Next=0x180。 |
| 0x180,32 bits | 0x00010003 | Extended ID=0003h,DSN Version 1;Next=0,清單結束。 |
Extended ID = header & 0xFFFF
Version = (header >> 16) & 0xF
Next = (header >> 20) & 0xFFC
Next 已經是從 Function 起點計算的 byte offset,因此直接在該位置繼續讀取;DWORD 對齊不改變它的單位。遇到未知 ID 時,仍可沿有效 Header 走到下一項。教材另檢查範圍、對齊與是否重訪,以辨認無法可靠解析的清單;合法位置可以前後移動。
ID 與清單格式的來源
PM:Figure 7-18/Table 7-14,p.945;PCIe:Figure 7-22/Table 7-18,p.953;MSI-X:Figure 7-59/Table 7-48,pp.1021–1022;Null:§7.9.27、Figure 7-384/Table 7-336,p.1315。Extended Header:Table 7-39,p.1010;AER(Advanced Error Reporting,進階錯誤回報):Figure 7-154/Table 7-134,p.1112。Flit Mode 支援者的 AER Header 須為 Version 3,本例已排除。
找到 DSN 後,還要分清資料位置與表示順序
先以 Figure 7-242/Table 7-221 確認 ID 0003h,再以 Figure 7-241 找 Lower DW 與 Upper DW:它們位於結構起點 +0x04、+0x08。本例從 0x184 讀 32 bits 得 0x33221100,從 0x188 讀 32 bits 得 0x77665544。
- DW
- Double Word,4 bytes的資料單位
Register 整數 = (0x77665544 << 32) | 0x33221100
= 0x7766554433221100
Table 7-222 另外規定 Register byte 與 EUI-64 byte 的對映;依 EUI 高 byte 到低 byte 書寫,本例為 00-11-22-33-44-55-66-77。數字只示範重組,不宣稱是已配發或可使用的產品序號;實際值須符合 IEEE 公司識別碼與製造商延伸識別碼規則,也不能單憑此值當成身分認證。
DSN 是可選能力。一般多功能 Device 若實作 DSN,Function 0 必須實作;其他有實作的 Function 必須回報相同值。因此 DSN 不能代替 BDF(Bus、Device、Function 識別號) 中的 Function Number。
- BDF
- Bus/Device/Function,匯流排、裝置與功能識別
DSN 的精確位置
Base 6.0 §7.9.3–§7.9.3.2,Figures 7-241–7-243、Tables 7-221/7-222,pp.1205–1207。RCiEP 與 PF/VF 有不同條件,本例不適用。
讀到資料,不代表可以原樣回寫
Attributes(存取屬性)要與位元定義一起讀。RO 限制軟體改寫;RW1C(寫入一才清除狀態)寫 0 時保留狀態。
RsvdP 要保存讀值,RsvdZ 要寫 0,不能把所有 Reserved 都當成同一種欄位。存取失敗不能當成「不支援」的有效回覆;成功讀到 0 也不保證該處實作了有意義的 Register。只有在正確入口與有效結果成立後,才依格式解讀。
屬性與結果邊界
Base 6.0 §7.4、Table 7-2,pp.913–915。未實作 Register 在無其他錯誤時,設定讀取成功回 0:§7.3.3,p.913。0x100 的全零 Extended Header 表示沒有 Extended Capabilities:§7.6.1,p.1009。此規則不等同傳統 Null Capability 的 ID=0。
沿完整查詢處理不同讀值
把本例串起來:從 0x100 進入延伸清單,在 0x180 找到 DSN,再讀 0x184 與 0x188。Next 指向另一個結構;資料位移則定位目前結構的欄位。以下延伸說明沿用這項區分。
在 0x180 讀到 0x24010003,DSN 的 Lower DW 改到 0x244 了嗎?
沒有。0x240 是下一項的位置;目前 DSN 仍在 0x180,Lower DW 仍位於 0x184。(Figure 7-241,p.1205;Table 7-39,p.1010。)
在傳統清單找不到 DSN,就能宣告不支援嗎?
不能。DSN 在 Extended 清單,必須透過能存取該區域的介面查詢;查錯清單或無法存取,都不是有效的不存在證據。(§7.6.1,p.1009;§7.9.3,p.1205。)
接著讀 Chapter 3,了解系統在尚不知道 BDF 時,如何建立搜尋路徑。


Comments