PCIe Chapter 7:中斷如何把事件交給軟體

【模擬資料】本章的位址、讀值與事件為教學用途建立,不代表特定硬體或平台。

中斷設定與通知時序時間由上往下。系統軟體找到設定表、在遮罩下填寫項目,再啟用通知;事件發生後,裝置向平台指定的目標寫入資料。系統軟體裝置 03:00.0平台中斷接收端找到中斷設定表在遮罩下填好項目啟用並解除遮罩事件發生:寫入指定目標
作者依 Base 6.0 §6.1.4、§7.7.2 繪製。MSI-X(Message Signaled Interrupts — Extension)以設定表分別配置通知。
MSI-X
Message Signaled Interrupts Extension,表格式訊息中斷

MSI-X 中斷通知機制把裝置事件送到軟體。系統先找到並填好設定表,再開放通知;事件發生後,裝置依設定發出記憶體寫入。軟體處理通知時,再由裝置介面取得事件內容與數量。

MSI-X
Message Signaled Interrupts Extension,表格式訊息中斷

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

規格閱讀路線:Figure 7-56 找能力結構 → Figures 7-60–7-62 看容量、控制與表格位置 → Figure 7-57 看通知項目 → §6.1.4.5 看遮罩期間的事件。

中斷機制與設定位置

INTx(傳統電位式中斷的模擬)用 Assert_INTx/Deassert_INTx Message 傳送有效與解除訊息;MSI(Message Signaled Interrupts,訊息式中斷)與 MSI-X 則把系統指定的 DWORD(4 bytes)資料寫到指定位置,使用 Memory Write(MWr,記憶體寫入),沒有普通 Completion(完成回覆)。Msg/MsgD(不帶/帶資料的 Message)則是訊息類封包,前述 INTx 電位式中斷模擬使用這類機制。能產生中斷的 Function(可獨立設定的功能單位)必須支援 MSI、MSI-X 或兩者,INTx 則為可選相容機制。MSI 與 MSI-X 不得同時啟用;使用其中一者時,也不得用 INTx 要求服務。

獨立的 MSI(訊息式中斷)對照案例:ID=0x05,Message Control 讀回 0x0184,代表 Multiple Message Capable(MMC,可要求的向量數)=010b、要求 4 個向量,Multiple Message Enable(MME,已配置的向量數)=000b、MSI 尚未啟用;支援 64-bit Address 與 Per-Vector Masking(PVM,個別向量遮罩),不支援 Extended Message Data。系統可在 MSI 關閉時配置 2 個向量,MME(已配置的向量數)=001b,再完成其餘設定並啟用。MSI 最多 32 個、採 2 的冪次編碼;MSI-X 的 Table Size 則使用 N−1。

機制與 MSI 入口

§6.1–§6.1.4.4(pp.659–664);Figures 7-44–7-47(pp.1011–1012)、Figure 7-49/Table 7-41(pp.1013–1014)。普通 PCI Express Endpoint 實作 MSI 時須支援 64-bit Message Address。上述 MSI 例子不代表主案例另有一個 MSI Capability。

由 Capability 找到 Memory Space 的 Table

主案例的設定讀值
位移與寬度讀值解碼
0xD0,16 bits0x0011ID=0x11、Next=0。
0xD2,16 bits0x00078 個 entries,Enable=0、Function Mask=0。
0xD4,32 bits0x00002000Table BIR(BAR 選擇值)=0、位移 0x2000。
0xD8,32 bits0x00003000PBA(Pending Bit Array,待送通知位元陣列)的 BIR(BAR 選擇值)=0、位移 0x3000。
BAR
Base Address Register,基底位址暫存器

先依 Tables 7-50/7-51 解讀 BAR Indicator Register(BIR,BAR 選擇值)。BIR 的低 3 bits 指定 BAR;其餘部分已是 byte 位移,直接與所選 BAR 的基底相加。因此 Table base=0x80006000,8 × 16 bytes 的 Table 占 0x80006000–0x8000607F;Pending Bit Array(PBA,待送通知位元陣列)的 base=0x80007000,所需的 1 個 QWORD(8 bytes) 占 0x80007000–0x80007007。兩者均在 BAR0 內且不重疊。本例把一般 Register 與 MSI-X 結構分到不同的自然對齊 4 KiB 頁面。

Entry 3 是第四個 entry,起點為 0x80006000 + 3 × 16 = 0x80006030。它在 +0x00、+0x04、+0x08、+0x0C 分別保存 Message Address、Upper Address、Data、Vector Control。本例依序為 0xFEE01000、0x00000000、0x00000045、初始 0x00000001。設定時保留其他 Vector Control bits,只在適當時機清 Mask bit。

Entry 位址與訊息目標不同:裝置最後向平台指定的 0xFEE01000 寫入 0x00000045,四個 bytes 全部有效,不修改 Data 低位元。0x45 不是 Table index,本例也不替它定義 CPU 編號或中斷控制器編碼。RO(Relaxed Ordering,放寬排序)/No Snoop(免除一致性窺探提示)必須為零。

逐步閱讀路線

Figure 7-56(p.1018)→ Figure 7-60/Table 7-49(p.1022)→ Figures 7-61/7-62、Tables 7-50/7-51(pp.1023–1024)→ Figures 7-57/7-58(p.1019)、Equations 7-1/7-2(p.1021)→ Tables 7-52–7-55(pp.1024–1026)。頁面隔離見 p.1020;訊息屬性見 p.661。64-bit BAR 的 BIR 必須指向低 DWORD。

先控制通知,再開放 entry

作者採用的初始化安排是:裝置事件尚未活動時,系統軟體先設 Function Mask,Control 讀回 0x4007;在 entry Mask=1 時填入有效 Address/Data;啟用 MSI-X 並保持全域遮罩,讀回 0xC007;依平台 I/O 規則確認設定可見,再清 entry 3 Mask 和 Function Mask,最後讀回 0x8007。其他 entries 保持遮罩,通知路徑準備好後才啟動工作。

這是符合下列規格條件的一種初始化安排。MSI/MSI-X Message Control 的 RW(可讀寫)欄位由系統軟體管理,規格不允許裝置驅動程式直接修改。Table/PBA 存取必須為對齊的完整 DWORD(4 bytes)或 QWORD(8 bytes);不得在未遮罩 entry 上修改 Address/Data/適用的 Steering Tag。遮罩原本未遮罩的 entry 時,應先用 DWORD 更新 Vector Control,不能同時用 QWORD 更改 Data 與 Mask。

條件來源

§6.1.4.2–§6.1.4.5(pp.662–665);存取對齊見 p.1020;控制權見 pp.1013、1022;Reserved 保存見 Table 7-55(p.1026)。Function Mask 不改變各 entry 自己的 Mask。

Pending 表示待送訊息,不記錄事件次數

MSI-X 已啟用而 entry 3 被有效遮罩時,若發生原應通知的事件,裝置必須設 PBA bit 3,且不得送訊息。若其餘 bits 為零,本例 QWORD 讀回 0x0000000000000008;多次事件仍可能是相同值。事件仍待處理時解除遮罩,裝置必須安排傳送,送出後清 Pending;若底層事件已在遮罩期間被滿足,則須先清 Pending,避免不必要通知。

軟體應只讀、不寫 Pending bits;寫入結果未定義,不能當成 RW1C(寫 1 清除)。PBA=0 也不表示 CPU 已服務完成。同一向量多次通知不保證逐筆各獲服務,事件計數與交握須由裝置介面處理。

本例同一 Function(可獨立設定的功能單位)的資料寫入與 MSI-X 同為 TC0(流量類別 0),因此中斷寫入不得越過先前 Posted 寫入;系統須保證中斷處理常式能觀察到先於該訊息抵達的更新,不必為了沖出那些寫入再讀裝置 Register。Chapter 6 的映射與同步前提仍適用。不同 TC 要另外同步;訊息抵達順序不保證服務順序,也沒有固定延遲保證。

TC
Traffic Class,流量類別
Pending 與順序來源

§6.1.4.5–§6.1.4.7(pp.664–667);Table 7-56(p.1027)。跨 TC 同步見 p.661,延遲見 p.660。共用向量時讀裝置狀態辨識來源,與前述資料 flush 是不同用途。

兩個 entry 共用向量,只遮罩一個會怎樣?

MSI-X 的 Mask bit(遮罩位元)屬於 Table entry(設定表項目)。如果兩個 entry 使用同一組 Message Address/Data,也就是共用同一個中斷向量,遮罩其中一個 entry 不會自動遮罩另一個。

查閱時先用 Table 7-55 確認 entry 的 Mask bit,再讀 §6.1.4.5:規格特別指出,多個 entries 若配置相同向量,必須遮罩所有這些 entries,才能保證 Function 不會用該 Address/Data 發送。再用 Figure 7-67/Table 7-56 找每個 entry 對應的 Pending bit,接回遮罩期間事件被滿足或再次發生的規則。Function Mask=1 會讓全部 entries 都按遮罩處理,但不改寫各自的 Mask bit。(Base 6.0,文件頁/PDF 頁 664–665、1026–1027。)

沿通知路徑回顧

設定表容量與已配置向量,如何配合?

Table Size 是容量;系統可配置較少向量,甚至讓多個 entries 共用同一 Address/Data。

兩層遮罩如何控制通知?

Function Mask=1 時,所有 entries 都按遮罩處理,不會替它們改寫各自的 Mask bit。

既有 Chapter 8 接著說明連線建立與可靠傳遞。查核日期:2026-10-21;來源頁碼為 Base 6.0 文件/PDF 頁碼。

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...