Linux:强制从命令行触发 PCIe MSI 中断

Linux: Force a PCIe MSI interrupt to trigger from the command line

背景

我遇到一个问题,在 32 位 Linux 内核上,我的 PCIe 驱动程序、多 MSI 和自定义硬件设备可以完美运行,现在我已经转移到 64 位 iMX8MM CPU 并且 MSI 中断不再触发。驱动程序正确注册了中断,没有任何错误,我可以查看 cat /proc/interrupts 的输出,并查看为我的驱动程序列出的所有 MSI 向量及其中断计数(为零)。有一座桥,但 /sys/bus/pci/devices/<address>/msi_bus 有一个 1,因此它已启用。 lspci -vv 中的所有内容看起来都井井有条,CONFIG_PCI_MSI 已应用于内核。我能够在 PCIe 设备上读取和写入内存缓冲区,以便通信正常工作,我只是无法触发 MSI 中断。这是在 32 位 CPU 上运行的完全相同的驱动程序代码 运行,并在新的 64 位 CPU.

上重新编译

问题

如何在系统上强制 MSI 中断以查看 Linux 是否会拾取它并执行我的代码?从 lspci -vv 我可以看到 MSI 地址并且我知道要写入的 MSI 矢量值。那么我应该在系统的什么地方写这个呢?我查看了 /dev/mem 和其他我希望可以执行 echo 0x1 > <address> 或其他一些命令行函数的区域,以写入一个值并触发它。 Where/how 我是否写入以触发特定的 MSI 中断?

MSI 不能被 CPU 触发;触发中断的双字写入仅在来自设备时才被识别为中断。

A CPU可以通过写入本地APIC ICR寄存器以类似的方式发起中断。这只能从内核完成,据我所知,目前还没有允许注入任意中断的内核服务。也许您可以向您的内核驱动程序添加一个服务来完成它。 (注意,作为临时调试辅助工具;将其留在驱动程序中是非常不合适的。)

ICR 的字段与 MSI 的字段不同,但它们相似。比较两者的文档以将一个映射到另一个应该很简单。