PCIe-Interrupt beind PLX-Switch

594
Tom Carpenter

Erstens bin ich nicht sicher, ob dies der beste Ort ist, um diese Frage zu stellen. Entschuldigung, falls nicht, aber da es eine ziemlich Nischenfrage ist, weiß ich nicht, ob es wirklich eine geeignete Stelle gibt, um diese Frage zu stellen.


Ein kurzer Hintergrund. Im letzten Jahr habe ich ein FPGA-Imaging-System für ein Universitätsforschungsprojekt entwickelt, das über PCIe Gen3 verbunden ist. Ich baue einen Treiber mit KMDF (dem Windows-Treiberframework), der MSI für das Gerät (in der inf-Datei) aktiviert und auf einem Computer einwandfrei funktioniert.

Ich habe vor kurzem auf ein neues Motherboard umgezogen (Asus P9X79-E WS), da mehrere Karten vorgesehen sind. Dieses Motherboard verfügt dank der integrierten PEX8747-Switches über eine bessere Anordnung von PCIe-Steckplätzen. FPGA und Treiber funktionieren einwandfrei in einem Steckplatz (MSI-Interrupts werden korrekt empfangen). Wenn ich jedoch die Karte in einen anderen Steckplatz stecke, der sich hinter einem der beiden PEX8747-Switches befindet, erhalte ich keine MSI-Interrupts mehr.

Ich kann aus dem Konfigurationsraum erkennen, dass der MSI-Konfigurationsraum des FPGAs richtig eingerichtet ist (8 Vektoren werden angefordert und zugewiesen, MSI aktiviert, Legacy-Interrupts deaktiviert und die Adresse ist nicht Null). Die ISR im Treiber wird jedoch niemals ausgelöst.

Ich habe versucht, MSI zu deaktivieren und zur Verwendung eines alten Interrupts zurückzukehren und ein Flag-Register zu haben, das der Treiber liest, um die korrekte Quelle herauszufinden. Das funktioniert auch hinter dem Switch gut, aber der Prozess ist nicht so schnell, daher würde ich lieber MSI verwenden.


Ich denke dann ist die Frage, gibt es etwas über PCIe-Switches (speziell den PEX8747), der das Funktionieren von Message Signal Interrupts verhindert? Gibt es eine Konfiguration, die erforderlich ist, um die Switches zum Laufen zu bringen?

1

1 Antwort auf die Frage

0
Tom Carpenter

Nun, wie sich nach ein paar Versuchen herausstellt, scheinen die PLX-Switches keine MSI-Anforderungen zu übertragen (und wahrscheinlich auch Schreibvorgänge, wenn sie von MSI verwendet werden) mit einer anderen Verkehrsklasse als Null. Durch die Einstellung der Verkehrsklasse meines Interrupt-Generators konnte ich es zum Laufen bringen.

Hoffentlich kann sich dies für alle Nutzer von Google, die das gleiche Problem haben, als nützlich erweisen.