繁体   English   中英

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>或其他一些命令行函数来写入值并触发它。 我在哪里/如何写入以触发特定的 MSI 中断?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM