使用不同的IRQ处理程序在PCI驱动程序中启用多个MSI

时间:2014-02-19 10:13:30

标签: linux linux-device-driver interrupt pci

目前我需要在我的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);

这里的结果是零,表示调用成功启用了两个向量。

我的问题是:

  1. HW文件说向量0,我希望这不是OS的向量0对吗?在任何情况下,我都无法在OS中获得向量0。
  2. 我面临的困难问题是当我为第一个irq执行request_irq()时,我如何对操作系统说我需要将此请求映射到HW的向量0?对于第二个irq,我如何映射HW的向量1?

2 个答案:

答案 0 :(得分:2)

pci_enable_msi_block:

如果使用此函数请求2条MSI消息,并且函数调用返回0,则为设备分配2条MSI消息,并将pdev->irq更新为分配给设备的最低中断。

因此pdev->irqpdev->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->irqpdev->irq + 1,具体取决于发送MSI的传感器,并且将调用相应的处理程序。

这两个MSI数据可以配置到硬件的MSI数据寄存器中。