閱讀1030 返回首頁    go 阿裏雲 go 技術社區[雲棲]


6.1 MSI/MSI-X Capability結構

PCIe設備可以使用MSI或者MSI-X報文向處理器提交中斷請求,但是對於某個具體的PCIe設備,可能僅支持一種報文。在PCIe設備中含有兩個Capability結構,一個是MSI Capability結構,另一個是MSI-X Capability結構。通常情況下一個PCIe設備僅包含一種結構,或者為MSI Capability結構,或者為MSI-X Capability結構。

6.1.1 MSI Capability結構

MSI Capability結構共有四種組成方式,分別是3264位的Message結構,32位和64位帶中斷Masking的結構。MSI報文可以使用32位地址或者64位地址,而且可以使用Masking機製使能或者禁止某個中斷源。MSI Capability寄存器的結構如6?1所示。

  • Capability ID字段記載MSI Capability結構的ID號,其值為0x05。在PCIe設備中,每一個Capability結構都有唯一的ID號。
  • Next Pointer字段存放下一個Capability結構的地址。
  • Message Control字段。該字段存放當前PCIe設備使用MSI機製進行中斷請求的狀態與控製信息,如6?1所示。

 6?1 MSI Cabalibities結構的Message Control字段

Bits

定義

描述

15:9

Reserved

保留位。係統軟件讀取該字段時將返回全零,對此字段寫無意義。

8

Per-vector Masking Capable

該位為1時,表示支持帶中斷Masking的結構;如果為0,表示不支持帶中斷Masking的結構。該位對係統軟件隻讀,該位在PCIe設備初始化時設置。

7

64 bit Address Capable

該位為1時,表示支持64位地址結構;如果為0,表示隻能支持帶32位地址結構。該位對係統軟件隻讀,該位在PCIe設備初始化時設置。

6:4

Multiple Message Enable

該字段可讀寫,表示軟件分配給當前PCIe設備的中斷向量數目。係統軟件根據Multiple Message Capable字段的大小確定該字段的值。在係統的中斷向量資源並不緊張時,Multiple Message Capable字段和該字段的值相等;而資源緊張時,該字段的值可能小於Multiple Message Capable字段的值。

3:1

Multiple Message Capable

該字段對係統軟件隻讀,表示當前PCIe設備可以使用幾個中斷向量號,在不同的PCIe設備中該字段的值並不不同。當該字段為0b000時,表示PCIe設備可以使用1個中斷向量;為0b0010b0100b0110b1000b101時,表示使用481632個中斷向量;而0b1100b111為保留位。
該字段與Multiple Message Enable字段的含義不同,該字段表示,當前PCIe設備支持的中斷向量個數,而Multiple Message Enable字段是係統軟件分配給PCIe設備實際使用的中斷向量個數。

0

MSI Enable

該位可讀寫,是MSI中斷機製的使能位。該位為1而且MSI-X Enable位為0時,當前PCIe設備可以使用MSI中斷機製,此時Legacy中斷機製被禁止。一個PCIe設備的MSI EnbleMSI-X Enable位都被禁止時,將使用INTx中斷消息報文發出/結束中斷請求





  • Message Address字段。當MSI Enable位有效時,該字段存放MSI存儲器寫事務的目的地址的低32位。該字段的31:2字段有效,係統軟件可以對該字段進行讀寫操作;該字段的第1~0位為0
  • Message Upper Address字段。如果64 bit Address Capable位有效,該字段存放MSI存儲器寫事務的目的地址的高32位。
  • Message Data字段,該字段可讀寫。當MSI Enable位有效時,該字段存放MSI報文使用的數據。該字段保存的數值與處理器係統相關,在PCIe設備進行初始化時,處理器將初始化該字段,而且不同的處理器填寫該字段的規則並不相同。如果Multiple Message Enable字段不為0b000(即該設備支持多個中斷請求時)PCIe設備可以通過改變Message Data字段的低位數據發送不同的中斷請求。
  • Mask Bits字段。PCIe總線規定當一個設備使用MSI中斷機製時,最多可以使用32個中斷向量,從而一個設備最多可以發送32種中斷請求。Mask Bits字段由32位組成,其中每一位對應一種中斷請求。當相應位為1時表示對應的中斷請求被屏蔽,為0時表示允許該中斷請求。係統軟件可讀寫該字段,係統初始化時該字段為全0,表示允許所有中斷請求。該字段和Pending Bits字段對於MSI中斷機製是可選字段,但是PCIe總線規範強烈建議所有PCIe設備支持這兩個字段。
  • Pending Bits字段。該字段對於係統軟件是隻讀位,PCIe設備內部邏輯可以改變該字段的值。該字段由32位組成,並與PCIe設備使用的MSI中斷一一對應。該字段需要與Mask Bits字段聯合使用。
    Mask Bits字段的相應位為1時,如果PCIe設備需要發送對應的中斷請求時,Pending Bits字段的對應位將被PCIe設備的內部邏輯置1,此時PCIe設備並不會使用MSI報文向中斷控製器提交中斷請求;當係統軟件將Mask Bits字段的相應位從1改寫為0時,PCIe設備將發送MSI報文向處理器提交中斷請求,同時將Pending Bit字段的對應位清零。在設備驅動程序的開發中,有時需要聯合使用Mask BitsPending Bits字段防止處理器丟棄中斷請求

6.1.2 MSI-X Capability結構

MSI-X Capability中斷機製與MSI Capability的中斷機製類似。PCIe總線引出MSI-X機製的主要目的是為了擴展PCIe設備使用中斷向量的個數,同時解決MSI中斷機製要求使用中斷向量號連續所帶來的問題。

MSI中斷機製最多隻能使用32個中斷向量,而MSI-X可以使用更多的中斷向量。目前Intel的許多PCIe設備支持MSI-X中斷機製。與MSI中斷機製相比,MSI-X機製更為合理。首先MSI-X可以支持更多的中斷請求,但是這並不是引入MSI-X中斷機製最重要的原因。因為對於多數PCIe設備,32種中斷請求已經足夠了。而引入MSI-X中斷機製的主要原因是,使用該機製不需要中斷控製器分配給該設備的中斷向量號連續。

如果一個PCIe設備需要使用8個中斷請求時,如果使用MSI機製時,Message Data[2:0]字段可以為0b000~0b111,因此可以發送8種中斷請求,但是這8種中斷請求的Message Data字段必須連續。在許多中斷控製器中,Message Data字段連續也意味著中斷控製器需要為這個PCIe設備分配8個連續的中斷向量號。

有時在一個中斷控製器中,雖然具有8個以上的中斷向量號,但是很難保證這些中斷向量號是連續的。因此中斷控製器將無法為這些PCIe設備分配足夠的中斷請求,此時該設備的“Multiple Message Enable”字段將小於“Multiple Message Capable”。

而使用MSI-X機製可以合理解決該問題。在MSI-X Capability結構中,每一個中斷請求都使用獨立的Message Address字段和Message Data字段,從而中斷控製器可以更加合理地為該設備分配中斷資源。

MSI Capability寄存器相比,MSI-X Capability寄存器使用一個數組存放Message Address字段和Message Data字段,而不是將這兩個字段放入Capability寄存器中,本篇將這個數組稱為MSI-X Table。從而當PCIe設備使用MSI-X機製時,每一個中斷請求可以使用獨立的Message Address字段和Message Data字段。

除此之外MSI-X中斷機製還使用了獨立的Pending Table表,該表用來存放與每一個中斷向量對應的Pending位。這個Pending位的定義與MSI Capability寄存器的Pending位類似。MSI-X TablePending Table存放在PCIe設備的BAR空間中。MSI-X機製必須支持這個Pending Table,而MSI機製的Pending Bits字段是可選的。

1 MSI-X Capability結構

MSI-X Capability結構比MSI Capability結構略微複雜一些。在該結構中,使用MSI-X Table存放該設備使用的所有Message AddressMessage Data字段,這個表格存放在該設備的BAR空間中,從而PCIe設備可以使用MSI-X機製時,中斷向量號可以並不連續,也可以申請更多的中斷向量號。MSI-X Capability結構的組成方式如6?2所示。

上圖中各字段的含義如下所示。

  • Capability ID字段記載MSI-X Capability結構的ID號,其值為0x11。在PCIe設備中,每一個Capability都有唯一的一個ID號。
  • Next Pointer字段存放下一個Capability結構的地址。
  • Message Control字段,該字段存放當前PCIe設備使用MSI-X機製進行中斷請求的狀態與控製信息,如6?2所示。

 6?2 MSI-X Capability結構的Message Control字段

Bits

定義

描述

15

MSI-X Enable

該位可讀寫,是MSI-X中斷機製的使能位,複位值為0,表示不使能MSI-X中斷機製。該位為1MSI Enable位為0時,當前PCIe設備使用MSI-X中斷機製,此時INTxMSI中斷機製被禁止。當PCIe設備的MSI EnbleMSI-X Enable位為0時,將使用INTx中斷消息報文發出/結束中斷請求。

14

Function Mask

該位可讀寫,是中斷請求的全局Mask位,複位值為0。如果該位為1,該設備所有的中斷請求都將被屏蔽;如果該位為0,則由Per Vector Mask位,決定是否屏蔽相應的中斷請求。Per Vector Mask位在MSI-X Table中定義,詳見下文。

100

Table Size

MSI-X中斷機製使用MSI-X Table存放Message Address字段和Message Data字段。該字段用來存放MSI-X Table的大小,該字段對係統軟件隻讀。

  • Table BIR(BAR Indicator Register)。該字段存放MSI-X Table所在的位置,PCIe總線規範規定MSI-X Table存放在設備的BAR空間中。該字段表示設備使用BAR0~5寄存器中的哪個空間存放MSI-X table。該字段由三位組成,其中0b000~0b101BAR0~5空間一一對應。
  • Table Offset字段。該字段存放MSI-X Table在相應BAR空間中的偏移。
  • PBA(Pending Bit Array) BIR字段。該字段存放Pending TablePCIe設備的哪個BAR空間中。在通常情況下,Pending TableMSI-X Table存放在PCIe設備的同一個BAR空間中。
  • PBA Offset字段。該字段存放Pending Table在相應BAR空間中的偏移。

2 MSI-X Table

MSI-X Table的組成結構如6?3所示。

由上圖可見,MSI-X Table由多個Entry組成,其中每個Entry與一個中斷請求對應。其中每一個Entry中有四個參數,其含義如下所示。

  • Msg Addr。當MSI-X Enable位有效時,該字段存放MSI-X存儲器寫事務的目的地址的低32位。該雙字的31:2字段有效,係統軟件可讀寫;1:0字段複位時為0PCIe設備可以根據需要將這個字段設為隻讀,或者可讀寫。不同的處理器填入該寄存器的數據並不相同。
  • Msg Upper Addr,該字段可讀寫,存放MSI-X存儲器寫事務的目的地址的高32位。
  • Msg Data,該字段可讀寫,存放MSI-X報文使用的數據。其定義與處理器係統使用的中斷控製器和PCIe設備相關。
  • Vector Control,該字段可讀寫。該字段隻有第0(Per Vector Mask)有效,其他位保留。當該位為1時,PCIe設備不能使用該Entry提交中斷請求;為0時可以提交中斷請求。該位在複位時為0Per Vector Mask位的使用方法與MSI機製的Mask位類似。

3 Pending Table

Pending Table的組成結構如6?4所示。

如上圖所示,在Pending Table中,一個Entry64位組成,其中每一位與MSI-X Table中的一個Entry對應,即Pending Table中的每一個EntryMSI-X Table64Entry對應。與MSI機製類似,Pending位需要與Per Vector Mask位配置使用。

Per Vector Mask位為1時,PCIe設備不能立即發送MSI-X中斷請求,而是將對應的Pending位置1;當係統軟件將Per Vector Mask位清零時,PCIe設備需要提交MSI-X中斷請求,同時將Pending位清零。


此時PCI設備配置空間Command寄存器的“Interrupt Disable”位為1

MSI機製提交中斷請求的方式類似與邊界觸發方式,而使用邊界觸發方式時,處理器可能會丟失某些中斷請求,因此在設備驅動程序的開發過程中,可能需要使用這兩個字段。

最後更新:2017-04-03 16:48:39

  上一篇:go 2.2 HOST主橋
  下一篇:go 3.3.1 Cache一致性的基本概念