PCIe Chapter 2:讀取設定空間與尋找 Capability

本章從已找到的裝置功能出發,查詢 Device Serial Number(DSN,裝置序號)。先依功能種類選擇清單,再沿指標找到結構,最後讀取資料並按規格重組序號。

【模擬資料】以下位置與讀值為教學用途建立,不代表特定硬體或平台。

兩個入口,沿正確清單找到序號傳統與延伸清單分別從自己的入口開始;找到DSN後才從目前結構起點加資料位移。Function 03:00.0同一份設定空間傳統清單0x34 → 0x40延伸清單從 0x100 開始Null → PCIe → MSI-X0x50 → 0x70 → 0xD0AER → DSN0x100 → 0x180讀取序號資料起點+0x04/起點+0x08按目標功能選清單Next:從 Function 起點算Next=0x180ID=0003h; Version=1
作者的清單查詢圖。兩個入口各自獨立;Next 從 Function 起點計算,資料位移從已找到的 DSN 結構起點計算。Base 6.0 Figures 7-42/7-43/7-241,文件頁/PDF 頁 1009–1010、1205。
MSI-X
Message Signaled Interrupts Extension,表格式訊息中斷
AER
Advanced Error Reporting,進階錯誤回報

完整中文教學 · 課程路線 · English

先區分查詢對象、設定 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。

同一個 byte offset 在兩種 Header 中的用途
offsetType 0Type 1(Root/Switch Port)
0x10–0x14Base Address Registers(BAR,資源基底暫存器)的一部分此 Port 的 BAR 0、BAR 1
0x18BAR 區域的一部分Primary、Secondary、Subordinate Bus Number 等欄位
0x20BAR 區域的一部分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,表格式訊息中斷
代表性讀值:位置均為 Function 內的 byte offset
位置與寬度讀值判讀
0x50,16 bits0x7000傳統 ID=00h 是 Null;Next=0x70,繼續走訪。
0x100,32 bits0x18020001Extended ID=0001h,AER Version 2;Next=0x180。
0x180,32 bits0x00010003Extended 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 時,如何建立搜尋路徑。

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...