Linux: コマンド ラインから PCIe MSI 割り込みを強制的にトリガーする

okwaves2024-01-25  10

背景

32 ビット Linux カーネルでは、マルチ MSI を備えた PCIe ドライバーとカスタム ハードウェア デバイスが完全に動作するという問題が発生しています。現在は 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 割り込みをトリガーするには、どこにどのように記述すればよいですか?



------------------------

MSI は CPU によってトリガーできません。二重単語はそれを書きます割り込みをトリガーする場合、割り込みはデバイスから発生した場合にのみ割り込みとして認識されます。

CPU は、ローカル APIC ICR レジスタに書き込むことで、同様の方法で割り込みを開始できます。これはカーネルからのみ実行でき、私の知る限り、任意の割り込みを挿入できる既存のカーネル サービスはありません。おそらく、それを行うためにカーネルドライバーにサービスを追加できるでしょう。 (一時的なデバッグ補助として注意してください。これをドライバー内に残しておくのは非常に不適切です。)

ICR のフィールドは MSI のフィールドと同一ではありませんが、似ています。 2 つのドキュメントを比較して、一方を他方にマッピングするのは簡単です。

1

私はあなたの解決策を試しませんでした。カーネルを再構築したところ、すべてが動作するようになりました。

– user2205930

2020 年 9 月 11 日 20:19

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。