目前我需要在我的PCI设备上支持2个向量的MSI。每个向量需要具有不同的处理程序例程。 HW文件说明如下
矢量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);
这里的结果是零,表示调用成功启用了两个向量。
我的问题是:
答案 0 :(得分:2)
pci_enable_msi_block:
如果使用此函数请求2条MSI消息,并且函数调用返回0,则为设备分配2条MSI消息,并将pdev->irq
更新为分配给设备的最低中断。
因此pdev->irq
和pdev->irq+1
是分配给设备的新中断。您现在可以注册两个中断处理程序:
request_irq(pdev->irq, handler1, ...)
request_irq(pdev->irq+1, handler2, ...)
答案 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....)
申请两个irq。因此,无论何时将MSI数据写入MSI地址,都将声明pdev->irq
或pdev->irq + 1
,具体取决于发送MSI的传感器,并且将调用相应的处理程序。
这两个MSI数据可以配置到硬件的MSI数据寄存器中。