如何在中断中获取相应的MSI消息?

时间:2013-05-14 18:49:21

标签: linux driver interrupt pci-e

我们在PCIe卡上使用FPGA。我能够保留适当的资源并正确触发MSI中断。我的问题是辨别中断源:我的Linux驱动程序只接收来自FPGA的不同中断源的单个MSI中断。因此,FPGA人员通过总线发送MSI消息中编码的原因。

问题:

  1. 是否有可能访问此消息以便在我的ISR中从此框架中获取信息? (我知道我总是可以检查FPGA的中断状态寄存器,但使用MSI消息会更优雅,并且可以避免额外的总线访问。)
  2. 如果1不可能,切换到MSI-X会解决这个问题,以便我可以直接获取信息吗? (我知道MSI-X是首选解决方案,但FPGA人员指定了MSI)
  3. 感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

希望您现在已经得到了所需的答案,但我会尝试根据我对Windows驱动程序中MSI的理解做出贡献,因为它是PCIe 2.2标准行为,不应该有所不同。我正在编写一个Windows PCIe驱动程序来处理源自配置为pcie端点的TI DM8168的MSI中断。

当FPGA器件发出常规(非msi-x)MSI中断信号时,它实际上并不发送“消息”,因为必须在某处填充和传输数据结构。简单地通过让FPGA将特定数据字值写入在主机和设备之间通过PCIe共享的特定存储器位置来实现MSI。必须写入的特定内存位置和数据值由主机的总线管理器选择,它不能只是任意值。

指向MSI内存位置的指针和要使用的特定预定义数据值由PCIe配置空间中的总线管理器设置,以便设备和主机都可以看到它们。 MSI内存位置是物理总线地址,因此必须将其转换为设备和主机上的虚拟地址空间。

常规(非msi-x)MSI可以支持的最大消息数必须是2的整数幂,最大值为32(即1,2,4,8,16,32)。例如,如果FPGA支持8条消息,那么它将复制数据值(来自PCIe配置空间)并设置最低3位以指示MessageID号(0-7),然后将此新值写入MSI指针位置。如果FPGA支持16条消息,则必须修改数据值的低4位以指示messageID号(0-15)。不得更改数据值的较高位。

在ISR的接收端,检查相同的最低位以查看哪个MSI已发出信号。没有与MSI本身相关的其他数据或ACK;任何进一步的数据都是特定于实现的,必须从您和硬件团队之间达成的内存位置或寄存器中读取。在Windows WDF框架驱动程序中,此MessageID值已被屏蔽,并作为参数提供给EvtInterruptIsr回调函数。我确信它在linux中有所不同。

我在回复方面有点迟了,但是对于其他人来说,这可能是有用的,就像我过去几周一样。