【问题标题】:Linux: Force a PCIe MSI interrupt to trigger from the command lineLinux:强制从命令行触发 PCIe MSI 中断
【发布时间】:2020-09-04 22:17:06
【问题描述】:

背景

我遇到了一个问题,在 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 中断?

【问题讨论】:

    标签: linux command-line interrupt pci-e


    【解决方案1】:

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

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

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

    【讨论】:

    • 我没有尝试你的解决方案,我重建了内核,现在一切正常。
    猜你喜欢
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多