MSI 與 MSIX

PCI 規範2.2 描述了MSI, optional

 

MSI 目的:1. 允許一個設備申請多箇中斷,避免了共享中斷,提高了效率,(最多32, 必須是2的倍數,MSIX則最多2048個);2. 當設備寫入內存數據然後發起中斷的時候有可能數據並未寫入,CPU必須讀設備的寄存器才能確定寫完了;但是如果MSI中斷,同樣是寫操作,中斷肯定在數據寫完以後才能收到;

MSI操作: 在configration time(應該是系統上電的時候),systemsoftware(OS)會讀取設備的PCI空間的MSI capability structure, 然後設置對應的control,address和data register(driver不能修改的)。工作是PCI function 需要發起中斷,則將data register的內容write到address register指定的地址。如果支持多個interrupt,則可以修改data register的內容的最後幾個bit。設備對某些地址的寫操作,會引起CPU的中斷

pci_enable_msi 的時候要初始化設備的msi capability structure,設置ctrl、addr和data register。給設備分配一箇中斷,在dev->irq中返回(儘管設備支持多個MSI中斷),禁用中斷引腳,中斷模式由引腳中斷改成MSI模式。

 

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev) 的時候, 設置irqaction的dev->dev_id = dev;  在64位系統中最後由handle_edge_irq調用到irqaction->handler(irq, action->dev_id);   即調用 handler(irq, dev)

 

一個PCI function可以申請多個irq,那麼CPU怎麼識別irq號呢?在發起中斷以前,設備向data register寫的data最後面8位爲中斷向量(0x10~0xFE)。在FreeScale的powerPC處理器使用的MPIC通用中斷控制器上,中斷控制器向CPU提交中斷後,CPU再讀ACK寄存器得到中斷向量;P4080處理器對此做出了改進,在提交中斷的同時提交中斷向量,縮短了中斷延時。

x86處理器使用FSB Interrupt Message總線事務轉發MSI/MSI-X中斷請求。使用這種方法的優點是向CPU內核提交中斷請求的同時,提交PCIe設備使用的中斷向量,從而CPU不需要使用中斷響應週期從寄存器中獲得中斷向量。

 

X86平臺在2.6.38才增加了對msi的支持:native_setup_msi_irqs

發佈了22 篇原創文章 · 獲贊 7 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章