2014-02-19 48 views
1

目前,我需要在我的PCI設備上支持2個向量的MSI。每個矢量需要有不同的處理程序。 HW文件說以下使用不同的IRQ處理程序在PCI驅動程序中啓用多個MSI

矢量0爲溫度傳感器

矢量1是用於功率傳感器

下面是我下面的驅動程序代碼。 1.首先使用pci_enable_msi_block(pdev,2) 啓用兩個向量2.然後使用request_irq(兩個不同的irq,兩個diff中斷處理程序)分配中斷處理程序。

int vecs = 2; 
struct pci_dev *pdev = dev->pci_dev; 
result = pci_enable_msi_block(pdev, vecs); 

這裏的結果是零,表示調用成功啓用兩個向量。

的問題,我已經是:

  1. HW文件說矢量0,我希望這不是OS的矢量0吧?無論如何,我無法在操作系統中獲得向量0。
  2. 我面臨的困難問題是,當我做第一個irq的request_irq()時,我該如何對操作系統說我需要將此請求映射到HW的向量0?對於第二個irq,我如何映射HW的t矢量1?

回答

0

使用MSI和MSI-X,中斷號(irq)是一個CPU「向量」。消息信號中斷允許器件將少量數據寫入特殊的存儲器映射I/O地址;芯片組然後將相應的中斷傳送給處理器。

可能有兩個不同的MSI中斷數據可寫入MSI地址。就像您的硬件支持2個MSI(一個用於溫度傳感器,一個用於功率傳感器)。因此,當您發出pci_enable_msi_block(pdev, 2);時,只要將兩個MSI數據中的任何一個寫入該特殊存儲器映射I/O地址(MSI地址),芯片組就會將該中斷置位到處理器。 致電pci_enable_msi_block(pdev, 2);後,您可以通過request_irq(pdev->irq, handler, flags....)request_irq(pdev->irq + 1, handler, flags....)請求兩個irqs。因此,無論何時將MSI數據寫入MSI地址,pdev->irqpdev->irq + 1將根據發送MSI的傳感器和相應的處理程序將被調用而置位。

這兩個MSI數據可以配置到硬件的MSI數據寄存器中。

2

pci_enable_msi_block:

如果使用該功能,如果該函數調用返回0,然後2 MSI消息被分配給設備和pdev->irq被更新爲最低分配給該設備的中斷請求的2個MSI消息。因此,pdev->irqpdev->irq+1是分配給設備的新中斷。您現在可以註冊兩個中斷處理程序:

request_irq(pdev->irq, handler1, ...) 
request_irq(pdev->irq+1, handler2, ...) 
相關問題