MSI和MSI-X中斷機(jī)制
在PCI總線中,所有需要提交中斷請(qǐng)求的設(shè)備,必須能夠通過INTx引腳提交中斷請(qǐng)求,而MSI機(jī)制是一個(gè)可選機(jī)制。而在PCIe總線中,PCIe設(shè)備必須支持MSI或者M(jìn)SI-X中斷請(qǐng)求機(jī)制,而可以不支持INTx中斷消息。
在PCIe總線中,MSI和MSI-X中斷機(jī)制使用存儲(chǔ)器寫請(qǐng)求TLP向處理器提交中斷請(qǐng)求,下文為簡便起見將傳遞MSI/MSI-X中斷消息的存儲(chǔ)器寫報(bào)文簡稱為MSI/MSI-X報(bào)文。
不同的處理器使用了不同的機(jī)制處理這些MSI/MSI-X中斷請(qǐng)求,如PowerPC處理器使用MPIC中斷控制器處理MSI/MSI-X中斷請(qǐng)求,本章將在第6.2節(jié)中介紹這種處理情況;而x86處理器使用FSB Interrupt Message方式處理MSI/MSI-X中斷請(qǐng)求。
不同的處理器對(duì)PCIe設(shè)備發(fā)出的MSI報(bào)文的解釋并不相同。但是PCIe設(shè)備在提交MSI中斷請(qǐng)求時(shí),都是向MSI/MSI-X Capability結(jié)構(gòu)中的Message Address的地址寫Message Data數(shù)據(jù),從而組成一個(gè)存儲(chǔ)器寫TLP,向處理器提交中斷請(qǐng)求。
有些PCIe設(shè)備還可以支持Legacy中斷方式[1]。但是PCIe總線并不鼓勵(lì)其設(shè)備使用Legacy中斷方式,在絕大多數(shù)情況下,PCIe設(shè)備使用MSI或者M(jìn)SI/X方式進(jìn)行中斷請(qǐng)求。
PCIe總線提供Legacy中斷方式的主要原因是,在PCIe體系結(jié)構(gòu)中,存在許多PCI設(shè)備,而這些設(shè)備通過PCIe橋連接到PCIe總線中。這些PCI設(shè)備可能并不支持MSI/MSI-X中斷機(jī)制,因此必須使用INTx信號(hào)進(jìn)行中斷請(qǐng)求。
當(dāng)PCIe橋收到PCI設(shè)備的INTx信號(hào)后,并不能將其直接轉(zhuǎn)換為MSI/MSI-X中斷報(bào)文,因?yàn)镻CI設(shè)備使用INTx信號(hào)進(jìn)行中斷請(qǐng)求的機(jī)制與電平觸發(fā)方式類似,而MSI/MSI-X中斷機(jī)制與邊沿觸發(fā)方式類似。
這兩種中斷觸發(fā)方式不能直接進(jìn)行轉(zhuǎn)換。因此當(dāng)PCI設(shè)備的INTx信號(hào)有效時(shí),PCIe橋?qū)⒃撔盘?hào)轉(zhuǎn)換為Assert_INTx報(bào)文,當(dāng)這些INTx信號(hào)無效時(shí),PCIe橋?qū)⒃撔盘?hào)轉(zhuǎn)換為Deassert_INTx報(bào)文。
與Legacy中斷方式相比,PCIe設(shè)備使用MSI或者M(jìn)SI-X中斷機(jī)制,可以消除INTx這個(gè)邊帶信號(hào),而且可以更加合理地處理PCIe總線的“序”。目前絕大多數(shù)PCIe設(shè)備使用MSI或者M(jìn)SI-X中斷機(jī)制提交中斷請(qǐng)求。
MSI和MSI-X機(jī)制的基本原理相同,其中MSI中斷機(jī)制最多只能支持32個(gè)中斷請(qǐng)求,而且要求中斷向量連續(xù),而MSI-X中斷機(jī)制可以支持更多的中斷請(qǐng)求,而并不要求中斷向量連續(xù)。
與MSI中斷機(jī)制相比,MSI-X中斷機(jī)制更為合理。本章將首先介紹MSI/MSI-X Capability結(jié)構(gòu),之后分別以PowerPC處理器和x86處理器為例介紹MSI和MSI-X中斷機(jī)制。
[1] 通過發(fā)送Assert_INTx和Deassert_INTx消息報(bào)文進(jìn)行中斷請(qǐng)求,即虛擬中斷線方式。
MSI/MSI-X Capability結(jié)構(gòu)
PCIe設(shè)備可以使用MSI或者M(jìn)SI-X報(bào)文向處理器提交中斷請(qǐng)求,但是對(duì)于某個(gè)具體的PCIe設(shè)備,可能僅支持一種報(bào)文。在PCIe設(shè)備中含有兩個(gè)Capability結(jié)構(gòu),一個(gè)是MSI Capability結(jié)構(gòu),另一個(gè)是MSI-X Capability結(jié)構(gòu)。通常情況下一個(gè)PCIe設(shè)備僅包含一種結(jié)構(gòu),或者為MSI Capability結(jié)構(gòu),或者為MSI-X Capability結(jié)構(gòu)。
MSI Capability結(jié)構(gòu)
MSI Capability結(jié)構(gòu)共有四種組成方式,分別是32和64位的Message結(jié)構(gòu),32位和64位帶中斷Masking的結(jié)構(gòu)。MSI報(bào)文可以使用32位地址或者64位地址,而且可以使用Masking機(jī)制使能或者禁止某個(gè)中斷源。
?Capability ID字段記載MSI Capability結(jié)構(gòu)的ID號(hào),其值為0x05。在PCIe設(shè)備中,每一個(gè)Capability結(jié)構(gòu)都有唯一的ID號(hào)。
?Next Pointer字段存放下一個(gè)Capability結(jié)構(gòu)的地址。
?Message Control字段。該字段存放當(dāng)前PCIe設(shè)備使用MSI機(jī)制進(jìn)行中斷請(qǐng)求的狀態(tài)與控制信息,如表6 1所示。
表6 1 MSI Cabalibities結(jié)構(gòu)的Message Control字段
| Bits | 定義 | 描述 |
|---|---|---|
| 15:9 | Reserved | 保留位。系統(tǒng)軟件讀取該字段時(shí)將返回全零,對(duì)此字段寫無意義。 |
| 8 | Per-vector Masking Capable | 該位為1時(shí),表示支持帶中斷Masking的結(jié)構(gòu);如果為0,表示不支持帶中斷Masking的結(jié)構(gòu)。該位對(duì)系統(tǒng)軟件只讀,該位在PCIe設(shè)備初始化時(shí)設(shè)置。 |
| 7 | 64 bit Address Capable | 該位為1時(shí),表示支持64位地址結(jié)構(gòu);如果為0,表示只能支持帶32位地址結(jié)構(gòu)。該位對(duì)系統(tǒng)軟件只讀,該位在PCIe設(shè)備初始化時(shí)設(shè)置。 |
| 6:4 | Multiple Message Enable | 該字段可讀寫,表示軟件分配給當(dāng)前PCIe設(shè)備的中斷向量數(shù)目。系統(tǒng)軟件根據(jù)Multiple Message Capable字段的大小確定該字段的值。在系統(tǒng)的中斷向量資源并不緊張時(shí),Multiple Message Capable字段和該字段的值相等;而資源緊張時(shí),該字段的值可能小于Multiple Message Capable字段的值。 |
| 3:1 | Multiple Message Capable | 該字段對(duì)系統(tǒng)軟件只讀,表示當(dāng)前PCIe設(shè)備可以使用幾個(gè)中斷向量號(hào),在不同的PCIe設(shè)備中該字段的值并不不同。當(dāng)該字段為0b000時(shí),表示PCIe設(shè)備可以使用1個(gè)中斷向量;為0b001、0b010、0b011、0b100和0b101時(shí),表示使用4、8、16和32個(gè)中斷向量;而0b110和0b111為保留位。該字段與Multiple Message Enable字段的含義不同,該字段表示,當(dāng)前PCIe設(shè)備支持的中斷向量個(gè)數(shù),而Multiple Message Enable字段是系統(tǒng)軟件分配給PCIe設(shè)備實(shí)際使用的中斷向量個(gè)數(shù)。 |
| 0 | MSI Enable | 該位可讀寫,是MSI中斷機(jī)制的使能位。該位為1而且MSI-X Enable位為0時(shí),當(dāng)前PCIe設(shè)備可以使用MSI中斷機(jī)制,此時(shí)Legacy中斷機(jī)制被禁止。一個(gè)PCIe設(shè)備的MSI Enble和MSI-X Enable位都被禁止時(shí),將使用INTx中斷消息報(bào)文發(fā)出/結(jié)束中斷請(qǐng)求[1]。 |
Message Address字段。當(dāng)MSI Enable位有效時(shí),該字段存放MSI存儲(chǔ)器寫事務(wù)的目的地址的低32位。該字段的31:2字段有效,系統(tǒng)軟件可以對(duì)該字段進(jìn)行讀寫操作;該字段的第1~0位為0。Message Upper Address字段。如果64 bit Address Capable位有效,該字段存放MSI存儲(chǔ)器寫事務(wù)的目的地址的高32位。
Message Data字段,該字段可讀寫。當(dāng)MSI Enable位有效時(shí),該字段存放MSI報(bào)文使用的數(shù)據(jù)。該字段保存的數(shù)值與處理器系統(tǒng)相關(guān),在PCIe設(shè)備進(jìn)行初始化時(shí),處理器將初始化該字段,而且不同的處理器填寫該字段的規(guī)則并不相同。
如果Multiple Message Enable字段不為0b000時(shí)(即該設(shè)備支持多個(gè)中斷請(qǐng)求時(shí)),PCIe設(shè)備可以通過改變Message Data字段的低位數(shù)據(jù)發(fā)送不同的中斷請(qǐng)求。Mask Bits字段。PCIe總線規(guī)定當(dāng)一個(gè)設(shè)備使用MSI中斷機(jī)制時(shí),最多可以使用32個(gè)中斷向量,從而一個(gè)設(shè)備最多可以發(fā)送32種中斷請(qǐng)求。
Mask Bits字段由32位組成,其中每一位對(duì)應(yīng)一種中斷請(qǐng)求。當(dāng)相應(yīng)位為1時(shí)表示對(duì)應(yīng)的中斷請(qǐng)求被屏蔽,為0時(shí)表示允許該中斷請(qǐng)求。系統(tǒng)軟件可讀寫該字段,系統(tǒng)初始化時(shí)該字段為全0,表示允許所有中斷請(qǐng)求。該字段和Pending Bits字段對(duì)于MSI中斷機(jī)制是可選字段,但是PCIe總線規(guī)范強(qiáng)烈建議所有PCIe設(shè)備支持這兩個(gè)字段。
Pending Bits字段。該字段對(duì)于系統(tǒng)軟件是只讀位,PCIe設(shè)備內(nèi)部邏輯可以改變?cè)撟侄蔚闹怠T撟侄斡?2位組成,并與PCIe設(shè)備使用的MSI中斷一一對(duì)應(yīng)。該字段需要與Mask Bits字段聯(lián)合使用。
當(dāng)Mask Bits字段的相應(yīng)位為1時(shí),如果PCIe設(shè)備需要發(fā)送對(duì)應(yīng)的中斷請(qǐng)求時(shí),Pending Bits字段的對(duì)應(yīng)位將被PCIe設(shè)備的內(nèi)部邏輯置1,此時(shí)PCIe設(shè)備并不會(huì)使用MSI報(bào)文向中斷控制器提交中斷請(qǐng)求;
當(dāng)系統(tǒng)軟件將Mask Bits字段的相應(yīng)位從1改寫為0時(shí),PCIe設(shè)備將發(fā)送MSI報(bào)文向處理器提交中斷請(qǐng)求,同時(shí)將Pending Bit字段的對(duì)應(yīng)位清零。在設(shè)備驅(qū)動(dòng)程序的開發(fā)中,有時(shí)需要聯(lián)合使用Mask Bits和Pending Bits字段防止處理器丟棄中斷請(qǐng)求[2]。
MSI-X Capability結(jié)構(gòu)
MSI-X Capability中斷機(jī)制與MSI Capability的中斷機(jī)制類似。PCIe總線引出MSI-X機(jī)制的主要目的是為了擴(kuò)展PCIe設(shè)備使用中斷向量的個(gè)數(shù),同時(shí)解決MSI中斷機(jī)制要求使用中斷向量號(hào)連續(xù)所帶來的問題。
MSI中斷機(jī)制最多只能使用32個(gè)中斷向量,而MSI-X可以使用更多的中斷向量。目前Intel的許多PCIe設(shè)備支持MSI-X中斷機(jī)制。與MSI中斷機(jī)制相比,MSI-X機(jī)制更為合理。
首先MSI-X可以支持更多的中斷請(qǐng)求,但是這并不是引入MSI-X中斷機(jī)制最重要的原因。因?yàn)閷?duì)于多數(shù)PCIe設(shè)備,32種中斷請(qǐng)求已經(jīng)足夠了。而引入MSI-X中斷機(jī)制的主要原因是,使用該機(jī)制不需要中斷控制器分配給該設(shè)備的中斷向量號(hào)連續(xù)。
如果一個(gè)PCIe設(shè)備需要使用8個(gè)中斷請(qǐng)求時(shí),如果使用MSI機(jī)制時(shí),Message Data的[2:0]字段可以為0b000~0b111,因此可以發(fā)送8種中斷請(qǐng)求,但是這8種中斷請(qǐng)求的Message Data字段必須連續(xù)。在許多中斷控制器中,Message Data字段連續(xù)也意味著中斷控制器需要為這個(gè)PCIe設(shè)備分配8個(gè)連續(xù)的中斷向量號(hào)。
有時(shí)在一個(gè)中斷控制器中,雖然具有8個(gè)以上的中斷向量號(hào),但是很難保證這些中斷向量號(hào)是連續(xù)的。因此中斷控制器將無法為這些PCIe設(shè)備分配足夠的中斷請(qǐng)求,此時(shí)該設(shè)備的“Multiple Message Enable”字段將小于“Multiple Message Capable”。
而使用MSI-X機(jī)制可以合理解決該問題。在MSI-X Capability結(jié)構(gòu)中,每一個(gè)中斷請(qǐng)求都使用獨(dú)立的Message Address字段和Message Data字段,從而中斷控制器可以更加合理地為該設(shè)備分配中斷資源。
與MSI Capability寄存器相比,MSI-X Capability寄存器使用一個(gè)數(shù)組存放Message Address字段和Message Data字段,而不是將這兩個(gè)字段放入Capability寄存器中,本篇將這個(gè)數(shù)組稱為MSI-X Table。從而當(dāng)PCIe設(shè)備使用MSI-X機(jī)制時(shí),每一個(gè)中斷請(qǐng)求可以使用獨(dú)立的Message Address字段和Message Data字段。
除此之外MSI-X中斷機(jī)制還使用了獨(dú)立的Pending Table表,該表用來存放與每一個(gè)中斷向量對(duì)應(yīng)的Pending位。這個(gè)Pending位的定義與MSI Capability寄存器的Pending位類似。MSI-X Table和Pending Table存放在PCIe設(shè)備的BAR空間中。MSI-X機(jī)制必須支持這個(gè)Pending Table,而MSI機(jī)制的Pending Bits字段是可選的。
1 MSI-X Capability結(jié)構(gòu)
MSI-X Capability結(jié)構(gòu)比MSI Capability結(jié)構(gòu)略微復(fù)雜一些。在該結(jié)構(gòu)中,使用MSI-X Table存放該設(shè)備使用的所有Message Address和Message Data字段,這個(gè)表格存放在該設(shè)備的BAR空間中,從而PCIe設(shè)備可以使用MSI-X機(jī)制時(shí),中斷向量號(hào)可以并不連續(xù),也可以申請(qǐng)更多的中斷向量號(hào)。
?Capability ID字段記載MSI-X Capability結(jié)構(gòu)的ID號(hào),其值為0x11。在PCIe設(shè)備中,每一個(gè)Capability都有唯一的一個(gè)ID號(hào)。
?Next Pointer字段存放下一個(gè)Capability結(jié)構(gòu)的地址。
?Message Control字段,該字段存放當(dāng)前PCIe設(shè)備使用MSI-X機(jī)制進(jìn)行中斷請(qǐng)求的狀態(tài)與控制信息,如表6 2所示。
表6 2 MSI-X Capability結(jié)構(gòu)的Message Control字段
| Bits | 定義 | 描述 |
|---|---|---|
| 15 | MSI-X Enable | 該位可讀寫,是MSI-X中斷機(jī)制的使能位,復(fù)位值為0,表示不使能MSI-X中斷機(jī)制。該位為1且MSI Enable位為0時(shí),當(dāng)前PCIe設(shè)備使用MSI-X中斷機(jī)制,此時(shí)INTx和MSI中斷機(jī)制被禁止。當(dāng)PCIe設(shè)備的MSI Enble和MSI-X Enable位為0時(shí),將使用INTx中斷消息報(bào)文發(fā)出/結(jié)束中斷請(qǐng)求。 |
| 14 | Function Mask | 該位可讀寫,是中斷請(qǐng)求的全局Mask位,復(fù)位值為0。如果該位為1,該設(shè)備所有的中斷請(qǐng)求都將被屏蔽;如果該位為0,則由Per Vector Mask位,決定是否屏蔽相應(yīng)的中斷請(qǐng)求。Per Vector Mask位在MSI-X Table中定義,詳見下文。 |
| 10:0 | Table Size | MSI-X中斷機(jī)制使用MSI-X Table存放Message Address字段和Message Data字段。該字段用來存放MSI-X Table的大小,該字段對(duì)系統(tǒng)軟件只讀。 |
Table BIR(BAR Indicator Register)。該字段存放MSI-X Table所在的位置,PCIe總線規(guī)范規(guī)定MSI-X Table存放在設(shè)備的BAR空間中。該字段表示設(shè)備使用BAR0~5寄存器中的哪個(gè)空間存放MSI-X table。
該字段由三位組成,其中0b000~0b101與BAR0~5空間一一對(duì)應(yīng)。Table Offset字段。該字段存放MSI-X Table在相應(yīng)BAR空間中的偏移。PBA(Pending Bit Array) BIR字段。
該字段存放Pending Table在PCIe設(shè)備的哪個(gè)BAR空間中。在通常情況下,Pending Table和MSI-X Table存放在PCIe設(shè)備的同一個(gè)BAR空間中。PBA Offset字段。該字段存放Pending Table在相應(yīng)BAR空間中的偏移。
2 MSI-X Table
由上圖可見,MSI-X Table由多個(gè)Entry組成,其中每個(gè)Entry與一個(gè)中斷請(qǐng)求對(duì)應(yīng)。其中每一個(gè)Entry中有四個(gè)參數(shù),其含義如下所示。
?Msg Addr。當(dāng)MSI-X Enable位有效時(shí),該字段存放MSI-X存儲(chǔ)器寫事務(wù)的目的地址的低32位。該雙字的31:2字段有效,系統(tǒng)軟件可讀寫;1:0字段復(fù)位時(shí)為0,PCIe設(shè)備可以根據(jù)需要將這個(gè)字段設(shè)為只讀,或者可讀寫。不同的處理器填入該寄存器的數(shù)據(jù)并不相同。
?Msg Upper Addr,該字段可讀寫,存放MSI-X存儲(chǔ)器寫事務(wù)的目的地址的高32位。
?Msg Data,該字段可讀寫,存放MSI-X報(bào)文使用的數(shù)據(jù)。其定義與處理器系統(tǒng)使用的中斷控制器和PCIe設(shè)備相關(guān)。
?Vector Control,該字段可讀寫。該字段只有第0位(即Per Vector Mask位)有效,其他位保留。當(dāng)該位為1時(shí),PCIe設(shè)備不能使用該Entry提交中斷請(qǐng)求;為0時(shí)可以提交中斷請(qǐng)求。該位在復(fù)位時(shí)為0。Per Vector Mask位的使用方法與MSI機(jī)制的Mask位類似。
3 Pending Table
在Pending Table中,一個(gè)Entry由64位組成,其中每一位與MSI-X Table中的一個(gè)Entry對(duì)應(yīng),即Pending Table中的每一個(gè)Entry與MSI-X Table的64個(gè)Entry對(duì)應(yīng)。與MSI機(jī)制類似,Pending位需要與Per Vector Mask位配置使用。
當(dāng)Per Vector Mask位為1時(shí),PCIe設(shè)備不能立即發(fā)送MSI-X中斷請(qǐng)求,而是將對(duì)應(yīng)的Pending位置1;當(dāng)系統(tǒng)軟件將Per Vector Mask位清零時(shí),PCIe設(shè)備需要提交MSI-X中斷請(qǐng)求,同時(shí)將Pending位清零。
[1] 此時(shí)PCI設(shè)備配置空間Command寄存器的“Interrupt Disable”位為1。[2] MSI機(jī)制提交中斷請(qǐng)求的方式類似與邊界觸發(fā)方式,而使用邊界觸發(fā)方式時(shí),處理器可能會(huì)丟失某些中斷請(qǐng)求,因此在設(shè)備驅(qū)動(dòng)程序的開發(fā)過程中,可能需要使用這兩個(gè)字段。
編輯:jq
-
PCI
+關(guān)注
關(guān)注
5文章
689瀏覽量
134245 -
PCIe
+關(guān)注
關(guān)注
16文章
1460瀏覽量
88402 -
中斷控制器
+關(guān)注
關(guān)注
0文章
63瀏覽量
9819
原文標(biāo)題:PCIe中MSI和MSI-X中斷機(jī)制
文章出處:【微信號(hào):gh_339470469b7d,微信公眾號(hào):FPGA與數(shù)據(jù)通信】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
對(duì) M7 內(nèi)核上的 memcpy 速度的一個(gè)疑問求解
RK806中斷處理流程深度解析:從架構(gòu)到調(diào)試實(shí)戰(zhàn)
STM32H5開發(fā)陀螺儀LSM6DSV16X(4)----中斷獲取SFLP四元數(shù)
RISC-V異常中斷機(jī)制全解析
搭載羅姆EcoGaN? Power Stage IC的小型高效AC適配器被全球電競(jìng)品牌MSI采用
MCU時(shí)鐘管理對(duì)功耗優(yōu)化方向
搭載羅姆GaN器件的小型高效AC適配器被微星科技采用
中斷機(jī)制在計(jì)算機(jī)系統(tǒng)中的作用,如何在e203處理器中利用外部中斷來處理用戶輸入輸出
舵機(jī)原理簡述!
IM 系列設(shè)備過載保護(hù)觸發(fā)界面初始化中斷的機(jī)制解析與閾值建模
IM 系列設(shè)備過載保護(hù)機(jī)制下界面初始化中斷的底層邏輯與解決方案
AS32X601驅(qū)動(dòng)系列教程 PLIC_中斷應(yīng)用詳解
簡述MSI和MSI-X中斷機(jī)制
評(píng)論