6.2 PowerPC處理器如何處理MSI中斷請求
PowerPC處理器使用OpenPIC中斷控製器或者MPIC中斷控製器,處理外部中斷請求。其中MPIC中斷控製器基於OpenPIC中斷控製器,但是作出了許多增強,目前Freescale新推出的PowerPC處理器,其中斷控製器多與MPIC兼容。
值得注意的是,PowerPC處理器和x86處理器處理MSI報文的方式有較大的不同。其中x86處理器使用的機製比PowerPC處理器更為合理,但是PowerPC處理器使用的方法使用的硬件資源相對較少。本節將MPC8572處理器為例說明MSI機製的處理過程,在第6.3節介紹x86處理器如何實現MSI機製。
MPIC中斷控製器是Freescale的PowerPC處理器使用的通用中斷控製器,目前基於E500內核的處理器,如MPC854x、8572等處理器使用這種中斷控製器。目前Freescale使用QorIP架構,該架構使用的中斷控製器與MPIC兼容。
使用MPIC中斷控製器處理MSI中斷時,PCIe設備的MSI報文,其目的地址為MPIC中斷控製器的MSIIR寄存器。當該寄存器被PCIe設備寫入後,MPIC中斷控製器將向處理器內核提交中斷請求,之後處理器再通過讀取MPIC中斷控製器的ACK寄存器獲得中斷向量號,並進行相應的中斷處理。這種方式與x86處理器的FSB Interrupt Message機製相比,處理器需要讀取ACK寄存器,從而中斷處理的延時較大。
目前Freescale的P4080處理器對MPIC中斷控製器進行了優化。在P4080處理器中,MPIC中斷控製器向處理器提交中斷請求的同時,也向處理器內核提交中斷向量,處理器內核不必讀取ACK寄存器獲得中斷向量,從而縮短了中斷處理延時。使用這種方法的效率與x86處理器使用的FSB Interrupt Message機製相當。
目前Freescale並沒有完全公開P4080處理器的實現細節,因此本節仍以MPC8572處理器為例介紹PCIe設備的MSI中斷請求。在MPC8572處理器中,MPIC中斷控製器的拓撲結構如圖6?5所示。
由上圖所示,MPIC中斷控製器可以處理內部中斷請求、外部中斷請求,Message、處理器間中斷請求和Share MSI中斷請求等。而MPIC中斷控製器使用Int0、Int1等中斷線向處理器提交這些中斷請求。其中Internal Interrupts和External Interrupts模塊處理MPC8572內部和外部的中斷請求,而Share MSI處理來自PCIe設備的MSI或者MSI-X中斷請求。
當MPIC中斷控製器收到MSI報文後,將使用中斷線Int0、Int1或者cintn向處理器內核提交中斷請求。處理器內核被中斷後,將讀取ACK寄存器獲得中斷向量,然後執行相應的中斷服務例程。為此PowerPC處理器設置了一係列寄存器,如下文所示。
6.2.1 MSI中斷機製使用的寄存器
PowerPC處理器設置了一係列寄存器,處理來自PCIe設備的MSI報文,其中最重要的寄存器是MSIIR寄存器。在PowerPC處理器係統中,PCIe設備Message Address寄存器中存放的值都為MSIIR寄存器的物理地址,而Message Data寄存器中存放的數據也與MSIIR寄存器相關。
在PowerPC處理器係統中,MSI機製的實現過程是PCIe設備向MSIIR寄存器寫入指定的數據。MPIC中斷控製器發現該寄存器被寫入後,將向處理器提交中斷請求。處理器收到這個中斷請求後,將通過讀取MPIC中斷控製器的ACK寄存器確定中斷向量,並依此確定中斷源。為此PowerPC處理器還設置了其他寄存器實現MSI中斷機製。
1 MSIIR寄存器
在PowerPC處理器中,MSIIR(Shared Message Signaled Interrupt Index Register)寄存器是實現MSI機製的重要寄存器。
當PCIe設備對MSIIR寄存器進行寫操作時,MPC8572處理器將使能MSIR0–MSIR7寄存器的相應位,從而向MPIC中斷控製器提交中斷請求,而中斷控製器將轉發這個中斷請求,由處理器進一步處理。該寄存器各字段的詳細描述如表6?3所示。
Bits | 定義 | 描述 |
27~31 | IBS | 該字段用來選擇MSIR0~MSIR7寄存器的對應位。0b00000對應SH0;0b00001對應SH1;0b00010對應SH2;以此類推0b11111對應SH31; |
24~26 | SRS | 該字段用來選擇MSIR0~MSIR7寄存器。0b000對應MSIR0;0b001對應MSIR1;0b010對應MSIR2;以此類推0b111對應MSIR7。 |
0~24 |
| 保留。 |
PCIe設備通過MSI機製,向此寄存器寫入數據時,MSIR0~7寄存器的相應位SH0~31將有一位置1。例如PCIe設備向MSIIR寄存器寫入0xFF00000時,MSIR7寄存器的SH31位將置1(SRS字段為0b111用來選擇MSIR7,而IBS字段為0b11111用來選擇SH31)。
2 MSIR寄存器組
MSIR(Shared Message Signaled Interrupt Registers)寄存器組共由8個寄存器組成,分別為MSIR0~MSIR7。其中每一個MSIRx寄存器中有32個有效位,分別為SH0~31。當PCIe設備對MSIIR寄存器進行寫操作時,某一個MSIIRx寄存器的某個SH位將被置為有效。係統軟件通過讀取該寄存器獲得中斷源,該寄存器讀清除,對此寄存器進行寫操作沒有意義。
該寄存器組的大小決定了一個PowerPC處理器支持的MSI中斷請求的個數。在MPC8572處理器中,有8個MSIRx寄存器,每個寄存器由32個有效位組成,因此MPC8572處理器最多能夠處理256個MSI中斷請求。該寄存器的結構如圖6?6所示。
3 MSISR寄存器
MSISR寄存器(Shared Message Signaled Interrupt Status Register)共由8個有效位組成,每一位對應一個MSIR寄存器。MPC8572處理器設置該寄存器的主要目的是方便係統軟件定位究竟是哪個MSIR寄存器中存在有效的中斷請求。首先係統軟件通過MSISR寄存器判斷是哪個MSIRx寄存器存在有效請求,之後再讀取相應的MSIRx寄存器,該寄存器各字段的詳細描述如表6?4所示。
Bits | 定義 | 描述 |
0~23 |
| 保留。 |
24~31 | Sn | 該字段由8位組成,每一位與一個MSIR0~7寄存器對應。該位為0時表示在MSIRn寄存器中沒有有效位,即沒有中斷請求;該位為1時表示MSIRn寄存器中至少有一個有效位,即存在中斷請求。Sn位是MSIRn寄存器各個位的“與”,當MSIRn寄存器的相應位清除時,Sn也將被清除。 |
4 MSIVPR寄存器組
MSIVPR(Shared Message Signaled Interrupt Vector/Priority Register)寄存器組由8個寄存器組成,分別為MSIVPR0~7寄存器。該組寄存器設置對應中斷請求的優先級別和中斷向量。其中每個MSIVPR寄存器對應一個MSIR寄存器,MSIVPR寄存器各字段的詳細解釋如表6?5所示。
Bits | 定義 | 描述 |
0 | MSK | 該位為0,且MSIR寄存器的對應位為1時,則將向中斷控製器提交中斷請求;如果為1屏蔽該中斷請求。 |
1 | A | 該位為0時,表示MPIC中斷控製器沒有處理該中斷請求;該位為1時,表示MPIC中斷控製器正在處理該中斷請求,或者該中斷控製器準備處理該中斷請求,這個中斷請求將在IPR(Interrupt Pending Regsiter)寄存器中排隊等待處理,或者在ISR(Interrupt Service Register)寄存器中正在被處理。該位的詳細描述見MPC8572的數據手冊。 |
12~15 | PRIORITY | OpenPIC和MPIC中斷控製器中為每一個中斷請求設置了0~15,共16個優先級。其中1的優先權最低,15的優先權最高,0表示禁止中斷請求。 |
16~31 | VECTOR | 該字段存放該中斷的中斷向量。當處理器讀取IACK寄存器時,將獲得對應中斷請求的中斷向量。 |
通過該組寄存器可以發現,在MPC8572處理器係統中,PCIe設備最多可以使用8個中斷向量,並可以共享這些中斷向量。
5 MSIDR寄存器組
MSIDR(Shared Message Signaled Interrupt Destination Registers)寄存器組共由8個寄存器組成,分別為MSIDR0~7。其中每一個MSIDRn寄存器對應一個MSIR寄存器。
MPIC中斷控製器支持Pass-through方式,在這種方式下,PowerPC處理器可以使用外部中斷控製器處理中斷請求(這種方法極少使用),而不使用內部中斷控製器。MPIC中斷控製器可以使用cint#和int#信號提交中斷請求,但是絕大多數係統軟件都使用int#信號向處理器提交中斷請求。
此外在MPC8572處理器中有兩個CPU,分別為CPU0和CPU1,MSI機製提交的中斷請求可以由CPU0或者CPU1處理。係統軟件可以通過設置MSIDRn寄存器完成這些功能,該寄存器各字段的詳細描述如表6?6所示。
Bits | 定義 | 描述 |
0 | EP | 為1時,表示中斷請求輸出到IRQ_OUT由外部中斷控製器處理;為0時,表示由MPIC中斷控製器處理。 |
1 | CI0 | 為1時,表示中斷控製器使用cint#信號向CPU0提交中斷請求。 |
2 | CI1 | 為1時,表示中斷控製器使用cint#信號向CPU1提交中斷請求。 |
30 | P1 | 為1時,表示中斷控製器使用int#信號向CPU0提交中斷請求。 |
31 | P0 | 為1時,表示中斷控製器使用int#信號向CPU1提交中斷請求。 |
6.2.2 係統軟件如何初始化PCIe設備的MSI Capability結構
如果PCIe設備支持MSI機製,係統軟件首先設置該設備MSI Capability結構的Message Address和Message Data字段。如果該PCIe設備支持64位地址空間,即MSI Capability寄存器的64 bit Address Capable位有效時,係統軟件還需要設置Message Upper Address字段。係統軟件完成這些設置後,將置MSI Cabalibities結構的MSI Enable位有效,使能該PCIe設備的MSI機製。
其中Message Address字段所填寫的值是MSIIR寄存器在PCI總線域中的物理地址。在PowerPC處理器中,PCI總線域與存儲器域地址空間獨立,當PCIe設備訪問存儲器域的地址空間時,需要通過Inbound寄存器組將PCI總線域地址空間轉換為存儲器域地址空間。
在PowerPC處理器中,PCIe設備使用MSI機製訪問MSIIR寄存器時,可以不使用Inbound寄存器組進行PCI總線地址到處理器地址的轉換。在MPC8572處理器中,專門設置了一個PEXCSRBAR窗口,進行PCI總線域到存儲器域的地址轉換,使用這種方法可以節省Inbound寄存器窗口,Linux PowerPC使用了這種實現方式。
在MPC8572處理器中,MSIIR寄存器的基地址為CCSRBAR(Configuration, Control, and Status Base Address Register),其偏移為0x1740。為支持MSI中斷機製,係統軟件需要使用PEXCSRBAR窗口將MSIIR寄存器映射到PCI總線域地址空間,即將CCSRBAR寄存器空間映射到PCI總線域地址空間。之後PCIe設備就可以通過MSIIR寄存器在PCI總線域的地址訪問MSIIR寄存器。
Linux PowerPC使用setup_pci_pcsrbar函數設置PEXCSRBAR窗口,該函數的源代碼在./arch/powerpc/sysdev/fsl_pci.c文件中,如源代碼6?1所示,這段代碼來自Linux 2.6.30.5。
static void __init setup_pci_pcsrbar(struct pci_controller *hose) { #ifdef CONFIG_PCI_MSI phys_addr_t immr_base;
immr_base = get_immrbase(); early_write_config_dword(hose, 0, 0, PCI_BASE_ADDRESS_0, immr_base); #endif } |
係統軟件除了需要設置PCIe設備的Message Address字段和PEXCSRBAR窗口之外,還需要設置PCIe設備的Message Data字段。PCIe設備向MSIIR寄存器進行存儲器寫操作的數據存放在Message Data字段中。
係統軟件在初始化Message Data字段之前,首先根據Multiple Message Capable字段預先存放的數據初始化Multiple Message Enable字段。一個PCIe設備最多可以申請32個中斷請求,但是係統軟件根據當前處理器係統的中斷資源的使用情況,決定給這個PCIe設備提供多少個中斷向量,並將這個結果存放到Multiple Message Enable字段。
MPC8572處理器最多可以為PCIe設備提供256個MSI中斷請求。但是在某些極端的情況下,可能會出現PCIe設備需要的中斷請求超過係統所能提供的中斷請求。此時某些PCIe設備的Multiple Message Enable字段可能會小於Multiple Message Capable字段。
如果在PCIe設備中,使用了多個中斷請求,那麼Message Data字段存放的是一組中斷向量號,而Message Data字段存放這組中斷向量號的基地址。MSI機製要求“這組數據”連續,其範圍在Message Data~Message Data+Multiple Message Enable-1之間。在多數情況下,MPC8572處理器係統僅為一個PCIe設備分配1個中斷向量號。
由上所述,在MPC8572處理器係統中,PCIe設備使用存儲器寫TLP傳送MSI中斷報文,這個存儲器寫TLP使用的地址為PCIe設備Capability結構的Message Address字段,而數據為Message Data~Message Data+Multiple Message Enable-1之間。其中Message Data字段與MSIIR寄存器要求的格式相同。
這個特殊的存儲器寫TLP報文通過若幹Switch,並穿越RC後,最終將數據寫入MSIIR寄存器中,並設置MSIIR寄存器的SRS和IBS字段,同時將使能MSIR0~MSIR7寄存器的相應位,從而向中斷控製器提交中斷請求(如果MSIVPR寄存器的MSK位為1)。MPIC中斷控製器獲得該中斷請求後,向處理器係統轉發這個中斷請求,並由處理器係統執行相應的中斷服務例程進行中斷處理。MPC8572處理器也可以處理PCIe設備的MSI-X中斷機製,本節對此不做進一步介紹。最後更新:2017-04-03 16:48:39