PCI總線使用INTA#、INTB#、INTC#和INTD#信號(hào)向處理器發(fā)出中斷請(qǐng)求。這些中斷請(qǐng)求信號(hào)為低電平有效,并與處理器的中斷控制器連接。在PCI體系結(jié)構(gòu)中,這些中斷信號(hào)屬于邊帶信號(hào)(Sideband Signals),PCI總線規(guī)范并沒(méi)有明確規(guī)定在一個(gè)處理器系統(tǒng)中如何使用這些信號(hào),因?yàn)檫@些信號(hào)對(duì)于PCI總線是可選信號(hào)。PCI設(shè)備還可以使用MSI機(jī)制向處理器提交中斷請(qǐng)求,而不使用這組中斷信號(hào)。有關(guān)MSI機(jī)制的詳細(xì)說(shuō)明見(jiàn)第8章。
1.1 中斷信號(hào)與中斷控制器的連接關(guān)系
不同的處理器使用的中斷控制器不同,如x86處理器使用APIC(Advanced Programmable Interrupt Controller)中斷控制器,而PowerPC處理器使用MPIC(Multiprocessor Interrupt Controller)中斷控制器。這些中斷控制器都提供了一些外部中斷請(qǐng)求引腳IRQ_PINx#。外部設(shè)備,包括PCI設(shè)備可以使用這些引腳向處理器提交中斷請(qǐng)求。
但是PCI總線規(guī)范沒(méi)有規(guī)定PCI設(shè)備的INTx信號(hào)如何與中斷控制器的IRQ_PINx#信號(hào)相連,這為系統(tǒng)軟件的設(shè)計(jì)帶來(lái)了一定的困難,為此系統(tǒng)軟件使用中斷路由表存放PCI設(shè)備的INTx信號(hào)與中斷控制器的連接關(guān)系。在x86處理器系統(tǒng)中,BIOS可以提供這個(gè)中斷路由表,而在PowerPC處理器中Firmware也可以提供這個(gè)中斷路由表。
在一些簡(jiǎn)單的嵌入式處理器系統(tǒng)中,F(xiàn)irmware并沒(méi)有提供中斷路由表,此時(shí)系統(tǒng)軟件開(kāi)發(fā)者需要事先了解PCI設(shè)備的INTx信號(hào)與中斷控制器的連接關(guān)系。此時(shí)外部設(shè)備與中斷控制器的連接關(guān)系由硬件設(shè)計(jì)人員指定。
我們假設(shè)在一個(gè)處理器系統(tǒng)中,共有3個(gè)PCI插槽(分別為PCI插槽A、B和C),這些PCI插槽與中斷控制器的IRQ_PINx引腳(分別為IRQW#、IRQX#、IRQY#和IRQZ#)可以按照?qǐng)D15所示的拓?fù)浣Y(jié)構(gòu)進(jìn)行連接。
采用圖15所示的拓?fù)浣Y(jié)構(gòu)時(shí),PCI插槽A、B、C的INTA#、INTB#和INTC#信號(hào)將分散連接到中斷控制器的IRQW#、IRQX#和IRQY#信號(hào),而所有INTD#信號(hào)將共享一個(gè)IRQZ#信號(hào)。采用這種連接方式時(shí),整個(gè)處理器系統(tǒng)使用的中斷請(qǐng)求信號(hào),其負(fù)載較為均衡。而且這種連接方式保證了每一個(gè)插槽的INTA#信號(hào)都與一根獨(dú)立的IRQx#信號(hào)對(duì)應(yīng),從而提高了PCI插槽中斷請(qǐng)求的效率。
在一個(gè)處理器系統(tǒng)中,多數(shù)PCI設(shè)備僅使用INTA#信號(hào),很少使用INTB#和INTC#信號(hào),而INTD#信號(hào)更是極少使用。在PCI總線中,PCI設(shè)備配置空間的Interrupt Pin寄存器記錄該設(shè)備究竟使用哪個(gè)INTx信號(hào),該寄存器的詳細(xì)介紹見(jiàn)第2.3.2節(jié)。
1.2 中斷信號(hào)與PCI總線的連接關(guān)系
在PCI總線中,INTx信號(hào)屬于邊帶信號(hào)。所謂邊帶信號(hào)是指這些信號(hào)在PCI總線中是可選信號(hào),而且只能在一個(gè)處理器系統(tǒng)的內(nèi)部使用,并不能離開(kāi)這個(gè)處理器環(huán)境。PCI橋也不會(huì)處理這些邊帶信號(hào)。這給PCI設(shè)備將中斷請(qǐng)求發(fā)向處理器帶來(lái)了一些困難,特別是給掛接在PCI橋之下的PCI設(shè)備進(jìn)行中斷請(qǐng)求帶來(lái)了一些麻煩。
在一些嵌入式處理器系統(tǒng)中,這個(gè)問(wèn)題較易解決。因?yàn)榍度胧教幚砥飨到y(tǒng)很清楚在當(dāng)前系統(tǒng)中存在多少個(gè)PCI設(shè)備,這些PCI設(shè)備使用了哪些中斷資源。在多數(shù)嵌入式處理器系統(tǒng)中,PCI設(shè)備的數(shù)量小于中斷控制器提供的外部中斷請(qǐng)求引腳數(shù),而且在嵌入式系統(tǒng)中,多數(shù)PCI設(shè)備僅使用INTA#信號(hào)提交中斷請(qǐng)求。
在這類處理器系統(tǒng)中,可能并不含有PCI橋,因而PCI設(shè)備的中斷請(qǐng)求信號(hào)與中斷控制器的連接關(guān)系較易確定。而在這類處理器系統(tǒng)中,即便存在PCI橋,來(lái)自PCI橋之下的PCI設(shè)備的中斷請(qǐng)求也較易處理。
在多數(shù)情況下,嵌入式處理器系統(tǒng)使用的PCI設(shè)備僅使用INTA#信號(hào)進(jìn)行中斷請(qǐng)求,所以只要將這些INTA#信號(hào)掛接到中斷控制器的獨(dú)立IRQ_PIN#引腳上即可。這樣每一個(gè)PCI設(shè)備都可以獨(dú)占一個(gè)單獨(dú)的中斷引腳。
而在x86處理器系統(tǒng)中,這個(gè)問(wèn)題需要BIOS參與來(lái)解決。在x86處理器系統(tǒng)中,有許多PCI插槽,處理器系統(tǒng)并不知道在這些插槽上將要掛接哪些PCI設(shè)備,而且也并不知道這些PCI設(shè)備到底需不需要使用所有的INTx#信號(hào)線。因此x86處理器系統(tǒng)必須要對(duì)各種情況進(jìn)行處理。
x86處理器系統(tǒng)還經(jīng)常使用PCI橋進(jìn)行PCI總線擴(kuò)展,擴(kuò)展出來(lái)的PCI總線還可能掛接一些PCI插槽,這些插槽上INTx#信號(hào)仍然需要處理。PCI橋規(guī)范并沒(méi)有要求橋片傳遞其下PCI設(shè)備的中斷請(qǐng)求。事實(shí)上多數(shù)PCI橋也沒(méi)有為下游PCI總線提供中斷引腳INTx#,管理其下游總線的PCI設(shè)備。但是PCI橋規(guī)范推薦使用表13建立下游PCI設(shè)備的INTx信號(hào)與上游PCI總線INTx信號(hào)之間的映射關(guān)系。
表13 PCI設(shè)備INTx#信號(hào)與PCI總線INTx#信號(hào)的映射關(guān)系
設(shè)備號(hào) | PCI設(shè)備的INTx#信號(hào) | PCI總線的INTx#信號(hào) |
0, 4, 8, 12, 16, 20, 24, 28 | INTA# | INTA# |
INTB# | INTB# | |
INTC# | INTC# | |
INTD# | INTD# | |
1, 5, 9, 13, 17, 21, 25, 29 | INTA# | INTB# |
INTB# | INTC# | |
INTC# | INTD# | |
INTD# | INTA# | |
2, 6, 10, 14, 18, 22, 26, 30 | INTA# | INTC# |
INTB# | INTD# | |
INTC# | INTA# | |
INTD# | INTB# | |
3, 7, 11, 15, 19, 23, 27, 31 | INTA# | INTD# |
INTB# | INTA# | |
INTC# | INTB# | |
INTD# | INTC# |
我們舉例說(shuō)明該表的含義。在PCI橋下游總線上的PCI設(shè)備,如果其設(shè)備號(hào)為0,那么這個(gè)設(shè)備的INTA#引腳將和PCI總線的INTA#引腳相連;如果其設(shè)備號(hào)為1,其INTA#引腳將和PCI總線的INTB#引腳相連;如果其設(shè)備號(hào)為2,其INTA#引腳將和PCI總線的INTC#引腳相連;如果其設(shè)備號(hào)為3,其INTA#引腳將和PCI總線的INTD#引腳相連。
在x86處理器系統(tǒng)中,由BIOS或者APCI表記錄PCI總線的INTA~D#信號(hào)與中斷控制器之間的映射關(guān)系,保存這個(gè)映射關(guān)系的數(shù)據(jù)結(jié)構(gòu)也被稱為中斷路由表。大多數(shù)BIOS使用表13中的映射關(guān)系,這也是絕大多數(shù)BIOS支持的方式。如果在一個(gè)x86處理器系統(tǒng)中,PCI橋下游總線的PCI設(shè)備使用的中斷映射關(guān)系與此不同,那么系統(tǒng)軟件程序員需要改動(dòng)BIOS中的中斷路由表。
BIOS初始化代碼根據(jù)中斷路由表中的信息,可以將PCI設(shè)備使用的中斷向量號(hào)寫入到該P(yáng)CI設(shè)備配置空間的Interrupt Line register寄存器中,該寄存器將在第2.3.2節(jié)中介紹。
1.3 中斷請(qǐng)求的同步
在PCI總線中,INTx信號(hào)是一個(gè)異步信號(hào)。所謂異步是指INTx信號(hào)的傳遞并不與PCI總線的數(shù)據(jù)傳送同步,即INTx信號(hào)的傳遞與PCI設(shè)備使用的CLK#信號(hào)無(wú)關(guān)。這個(gè)“異步”信號(hào)給系統(tǒng)軟件的設(shè)計(jì)帶來(lái)了一定的麻煩。
系統(tǒng)軟件程序員需要注意“異步”這種事件,因?yàn)閹缀跛小爱惒健笔录紩?huì)帶來(lái)系統(tǒng)的“同步”問(wèn)題。以圖11為例,當(dāng)PCI設(shè)備11使用DMA寫方式,將一組數(shù)據(jù)寫入存儲(chǔ)器時(shí),該設(shè)備在最后一個(gè)數(shù)據(jù)離開(kāi)PCI設(shè)備11的發(fā)送FIFO時(shí),會(huì)認(rèn)為DMA寫操作已經(jīng)完成。此時(shí)這個(gè)設(shè)備將通過(guò)INTx信號(hào),通知處理器DMA寫操作完成。
此時(shí)處理器(驅(qū)動(dòng)程序的中斷服務(wù)例程)需要注意,因?yàn)镮NTx信號(hào)是一個(gè)異步信號(hào),當(dāng)處理器收到INTx信號(hào)時(shí),并不意味著PCI設(shè)備11已經(jīng)將數(shù)據(jù)寫入存儲(chǔ)器中,因?yàn)镻CI設(shè)備11的數(shù)據(jù)傳遞需要通過(guò)PCI橋1和HOST主橋,最終才能到達(dá)存儲(chǔ)器控制器。
而INTx信號(hào)是“異步”發(fā)送給處理器的,PCI總線并不知道這個(gè)“異步”事件何時(shí)被處理。很有可能處理器已經(jīng)接收到INTx信號(hào),開(kāi)始執(zhí)行中斷處理程序時(shí),該P(yáng)CI設(shè)備還沒(méi)有完全將數(shù)據(jù)寫入存儲(chǔ)器。
因?yàn)椤癙CI設(shè)備向處理器提交中斷請(qǐng)求”與“將數(shù)據(jù)寫入存儲(chǔ)器”分別使用了兩個(gè)不同的路徑,處理器系統(tǒng)無(wú)法保證哪個(gè)信息率先到達(dá)。從而在處理器系統(tǒng)中存在“中斷同步”的問(wèn)題,PCI總線提供了以下兩種方法解決這個(gè)同步問(wèn)題。
(1) PCI設(shè)備保證在數(shù)據(jù)到達(dá)目的地之后,再提交中斷請(qǐng)求。
顯然這種方法不僅加大了硬件的開(kāi)銷,而且也不容易實(shí)現(xiàn)。如果PCI設(shè)備采用Posted寫總線事務(wù),PCI設(shè)備無(wú)法單純通過(guò)硬件邏輯判斷數(shù)據(jù)什么時(shí)候?qū)懭氲酱鎯?chǔ)器。此時(shí)為了保證數(shù)據(jù)到達(dá)目的地后,PCI設(shè)備才能提交中斷請(qǐng)求,PCI設(shè)備需要使用“讀刷新”的方法保證數(shù)據(jù)可以到達(dá)目的地,其方法如下。
PCI設(shè)備在提交中斷請(qǐng)求之前,向DMA寫的數(shù)據(jù)區(qū)域發(fā)出一個(gè)讀請(qǐng)求,這個(gè)讀請(qǐng)求總線事務(wù)將被PCI設(shè)備轉(zhuǎn)換為讀完成總線事務(wù),當(dāng)PCI設(shè)備收到這個(gè)讀完成總線事務(wù)后,再向處理器提交中斷請(qǐng)求。PCI總線的“序”機(jī)制保證這個(gè)存儲(chǔ)器讀請(qǐng)求,會(huì)將DMA數(shù)據(jù)最終寫入存儲(chǔ)器,有關(guān)PCI序的詳細(xì)說(shuō)明見(jiàn)第9.3節(jié)。
PCI總線規(guī)范要求HOST主橋和PCI橋必須保證這種讀操作可以刷新寫操作。但問(wèn)題是,沒(méi)有多少芯片設(shè)計(jì)者愿意提供這種機(jī)制,因?yàn)檫@將極大地增加他們的設(shè)計(jì)難度。除此之外,使用這種方法也將增加中斷請(qǐng)求的延時(shí)。
(2) 中斷服務(wù)例程使用“讀刷新”方法。
中斷服務(wù)例程在使用“PCI設(shè)備寫入存儲(chǔ)器”的這些數(shù)據(jù)之前,需要對(duì)這個(gè)PCI設(shè)備進(jìn)行讀操作。這個(gè)讀操作也可以強(qiáng)制將數(shù)據(jù)最終寫入存儲(chǔ)器,實(shí)際上是將數(shù)據(jù)寫到存儲(chǔ)器控制器中。這種方法利用了PCI總線的傳送序規(guī)則,這種方法與第1種方法基本相同,只是使用這種方法使用軟件方式,而第1種方式使用硬件方式。第9.3節(jié)將詳細(xì)介紹這個(gè)讀操作如何將數(shù)據(jù)刷新到存儲(chǔ)器中。
第2種方法也是絕大多數(shù)處理器系統(tǒng)采用的方法。程序員在書寫中斷服務(wù)例程時(shí),往往都是先讀取PCI設(shè)備的中斷狀態(tài)寄存器,判斷中斷產(chǎn)生原因之后,才對(duì)PCI設(shè)備寫入的數(shù)據(jù)進(jìn)行操作。這個(gè)讀取中斷狀態(tài)寄存器的過(guò)程,一方面可以獲得設(shè)備的中斷狀態(tài),另一方面是保證DMA寫的數(shù)據(jù)最終到達(dá)存儲(chǔ)器。如果驅(qū)動(dòng)程序不這樣做,就可能產(chǎn)生數(shù)據(jù)完整性問(wèn)題。產(chǎn)生這種數(shù)據(jù)完整性問(wèn)題的原因是INTx這個(gè)異步信號(hào)。
這里也再次提醒系統(tǒng)程序員注意PCI總線的“異步”中斷所帶來(lái)的數(shù)據(jù)完整性問(wèn)題。在一個(gè)操作系統(tǒng)中,即便中斷處理程序沒(méi)有首先讀取PCI設(shè)備的寄存器,也多半不會(huì)出現(xiàn)問(wèn)題,因?yàn)樵诓僮飨到y(tǒng)中,一個(gè)PCI設(shè)備從提交中斷到處理器開(kāi)始執(zhí)行設(shè)備的中斷服務(wù)例程,所需要的時(shí)間較長(zhǎng),處理器系統(tǒng)基本上可以保證此時(shí)數(shù)據(jù)已經(jīng)寫入存儲(chǔ)器。
但是如果系統(tǒng)程序員不這樣做,這個(gè)驅(qū)動(dòng)程序依然有Bug存在,盡管這個(gè)Bug因?yàn)楦鞣N機(jī)緣巧合,始終不能夠暴露出來(lái),而一旦這些Bug被暴露出來(lái)將難以定位。為此系統(tǒng)程序員務(wù)必要重視設(shè)計(jì)中出現(xiàn)的每一個(gè)實(shí)現(xiàn)細(xì)節(jié),當(dāng)然僅憑謹(jǐn)慎小心是遠(yuǎn)遠(yuǎn)不夠的,因?yàn)橹匾暭?xì)節(jié)的前提是充分理解這些細(xì)節(jié)。
PCI總線V2.2規(guī)范還定義了一種新的中斷機(jī)制,即MSI中斷機(jī)制。MSI中斷機(jī)制采用存儲(chǔ)器寫總線事務(wù)向處理器系統(tǒng)提交中斷請(qǐng)求,其實(shí)現(xiàn)機(jī)制是向HOST處理器指定的一個(gè)存儲(chǔ)器地址寫指定的數(shù)據(jù)。這個(gè)存儲(chǔ)器地址一般是中斷控制器規(guī)定的某段存儲(chǔ)器地址范圍,而且數(shù)據(jù)也是事先安排好的數(shù)據(jù),通常含有中斷向量號(hào)。
HOST主橋會(huì)將MSI這個(gè)特殊的存儲(chǔ)器寫總線事務(wù)進(jìn)一步翻譯為中斷請(qǐng)求,提交給處理器。目前PCIe和PCI-X設(shè)備必須支持MSI中斷機(jī)制,但是PCI設(shè)備并不一定都支持MSI中斷機(jī)制。
目前MSI中斷機(jī)制雖然在PCIe總線上已經(jīng)成為主流,但是在PCI設(shè)備中并不常用。即便是支持MSI中斷機(jī)制的PCI設(shè)備,在設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn)中也很少使用這種機(jī)制。首先PCI設(shè)備具有INTx#信號(hào)可以傳遞中斷,而且這種中斷傳送方式在PCI總線中根深蒂固。其次PCI總線是一個(gè)共享總線,傳遞MSI中斷需要占用PCI總線的帶寬,需要進(jìn)行總線仲裁等一系列過(guò)程,遠(yuǎn)沒(méi)有使用INTx#信號(hào)線直接。
但是使用MSI中斷機(jī)制可以取消PCI總線這個(gè)INTx#邊帶信號(hào),可以解決使用INTx中斷機(jī)制所帶來(lái)的數(shù)據(jù)完整性問(wèn)題。而更為重要的是,PCI設(shè)備使用MSI中斷機(jī)制,向處理器系統(tǒng)提交中斷請(qǐng)求的同時(shí),還可以通知處理器系統(tǒng)產(chǎn)生該中斷的原因,即通過(guò)不同中斷向量號(hào)表示中斷請(qǐng)求的來(lái)源。當(dāng)處理器系統(tǒng)執(zhí)行中斷服務(wù)例程時(shí),不需要讀取PCI設(shè)備的中斷狀態(tài)寄存器,獲得中斷請(qǐng)求的來(lái)源,從而在一定程度上提高了中斷處理的效率。本書將在第8章詳細(xì)介紹MSI中斷機(jī)制。
責(zé)任編輯:lq6
-
控制器
+關(guān)注
關(guān)注
112文章
16039瀏覽量
176722 -
pci總線
+關(guān)注
關(guān)注
1文章
202瀏覽量
31750
原文標(biāo)題:PCI總線的中斷機(jī)制
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論