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

koh*_*hpe 1 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)

谢谢您的帮助!

小智 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中有所不同.

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