Hallo,
ich starte eben autoditaktisch mich mit PCIe zu beschäftigen und
hätte eine Frage an PCIe Experten, die den XILINX PCIe V2.0 IP
Core z.b. für Virtex oder Kintex nutzen.
Wenn ich das richtig sehe, bauen die IP Cores selbständig die unterste
Ebene der PCIe Verbindung (Physical Layer) auf, ohne dass irgend eine
SW involviert ist.
Meine Frage ist nun: wenn man ein minimales Design nur zum Test
erzeugt, z.B. eine PCIe Lane mit RX,TX ,REFCLK, PWRGD, WAKE und
PRSNT als Endpoint für einen PCIe Slot im PV, was muss man
denn dem IP Core im FPGA minimal "anbieten" dass die physical
Layer Verbindung aufgebaut wird ? Ich meine würde der passende
Anschluss (jetzt Xilinx spezifisch) bei
pipe_mmcm_rst_n
sys_clk
sys_rst_n
reichen ? Was würde noch fehlen ?
Klar kann man damit noch nichts anfangen, aber wenn die unterste
Verbindung schon mal aufgebaut würde, müsste man dann doch schon
im PCI Tree des PCs den Endpoint finden oder liege ich da total
daneben?
Ich beanke mich schon mal für sachdienliche Hinweise.
Hallo,
ich denke es wird nicht ganz so einfach gehen wie in Deinem OP Text. Es
wird auch eine minimale Configuration Space benötigt (Mindestens ein BAR
und eine PM capability Structure, ggfs auch eine PCIe Capability
Structure. IDs, Classcode etc sind zunächst nicht so wichtig). Sonst
wird Dein Endpoint nicht enummeriert.
Mit PCI Tree meinst Du vermutlich so etwas wie
- lspci -vvv unter Linux
- Systemsteuerung oder Tool unter Windows
Wenn nur das physikalische verdrahtet ist, sagt das System irgendwann
"Hmph, schaut eh nach Messgerät aus" und entweder schaltet den Port
wieder ab oder geht in den Compliance Test Mode damit Du ein
Augendiagram messen kannst.
Viel Erfolg,
Charles
Danke sehr für die Antworten, klingt schon mal nicht schlecht.
Dann liege ich zunächst mal nicht ganz falsch.
Ja, ich benutze Vivado und es ist schon klar, zum Generieren des Cores
muss man eigentlich alles fertig angeben (BAR etc.), das habe ich mir
schon angesehen. Ich will aber zunächst nur den Teil nach "aussen"
nutzen, das AXI Zeugs würde dann später kommen.
Mir geht es darum (zur Selbstmotivation) so bald wie möglich eine
Reaktion am PC zu sehen, bevor man dann weitermacht mit dem "Rest"
Es gibt Tools , in meinem Fall für Windows, die den PCI Tree darstellen
mit allen Parametern die vom Endpoint kommen. Da würde ich dann die
Einstellungen wie z.B. Hersteller ID ect. die man bei der
Coregenerierung
angeben muss erwarten , wenn die physikalische Verbindung zustande
kommt.
Vielen Dank nochmals für die Unterstützung.
Meines Wissens werden da auch Files für ein Beispeilprojekt generiert,
bzw. kann man sich ein solches Projekt generieren lassen. Rechte
Maustaste auf den Core und dann Generate Example Project. Da ist schon
mal das wichtgste drin. Ansonsten gibts zu den Boards mit PCIe immer
fertige Beispiele dazu.
ich versuche es noch einmal
vivado starten, IP catatlog
PCIe core generieren
warten bis alle Dateien fertig sind
dann Beispiel design offnen
PCIe lane, PERST pin und REF clock festlegen
bitgen
flashgen
PCIe kart in linux oder win pc rein
wird erkannt
ehrlich, mehrmals so getan, genau so geht
das ist natürlich ein fertiges Demo Beispiel nur aber für Este Test ok,
wenn es so geht dann:
viado starten, neues IPI block desing
kostenloses microblaze
AXI memory mapped PCIe
und lost geht spass..
Danke, super.
So dachte ich mir das auch. Werde in Kürze mal den ersten Versuch
starten.
Eine möglicherweise dumme Frage zum Prinzip habe ich aber noch.
Die Pinbelegung des PCIe Slots die man findet, gibt diese die
Signale des Motherboards an, so wie sie von der Bridge oder
vom Root Complex kommen? Ich meine also, es muss idealerweise
z.B.
B14(HSoP0) mit HSiP0
B15(HSoN0) mit HSiN0 vom zu steckenden Board
und
A16(HSiP0) mit HSoP0
A17(HSiN0) mit HSoN0 vom zu steckenden Board
verbunden sein. Ist das so richtig?
Vielen Dank.
Jetzt ist aber nicht verständlich was du willst.
In ersten mail war es deutlich: XILINX
bei Xilinx gibt es namen wie: HSxPx nicht.
Das in und out is natürlich immer problem, aber wenn du fertiges FPGA
board hast, dann sollte es schon richtig sein. Wenn du falsch
zuweisungen macht, dann meckern die tools so oder so.
Das stimmt was Xilinx angeht, aber ich habe inzwischen das
http://de.wikipedia.org/wiki/PCI_Express
gefunden und auch anderweitig und da gibt es diese
Bezeichnung schon. Hier sieht man auch die Richtungen.
Das habe dann wohl richtig interpretiert.
Mir geht es hier grundsätzlich ums Verständnis was damit gemeint ist.
Danke für die ausdauernde Unterstützung.
Jetzt muss ich doch noch was nachfragen.
Kann man wirklich mit WAKE (sofern man es bedienen kann), das
Root-port dazu bewegen, die Verbindung ab und dann die
Trainingssequenz wieder anzustoßen um die Verbindung
wieder aufzubauen ? So oft man will in dem anfangs beschriebenen
Status nur zum Test?
Danke
aus Deinem Text verstehe ich leider nicht was Du insgesamt vor hast.
Bzgl. WAKE wage ich zu bezweifeln, dass man das einfach beliebig toggeln
kann.
Ein PCI(e) Endpoint hat 4 Device Powerstates D0, D1, D2, D3. D0 ist
vollfunktionsfähig, D3 ist ausgeschaltet wobei ein D3-hot definiert ist,
der z.b. für wake-on-fax/wake-on-lan verwendet werden kann. D0 und D3
muessen implementiert werden (logisch irgendwie), D1 D2 sind optional.
PCI(e) kennt auch einen Power Management Event (PME) das bedeutet, dass
ein EP vom System in einen anderen Powerzustand versetzt werden möchte.
Was passiert hängt natürlich vom aktuellen EP Powerzustand sowie der
Gerätetreiber ab.
WAKE macht eigentlich nur Sinn wenn der EP im D3 (jedenfalls > D0) ist.
Folge sollte sein, dass der EP periodisch PM_PME Messages an das System
schickt. Wenn der EP ein PME_TURN_OFF Message erhält muss er das senden
von PM_PME unterbinden. Irgendwann wird das System dann das Device von
D3 nach D0 versetzen. Hierbei erfolgt natürlich ein Link-Training beim
Durchgang durch den Recovery State.
Das war jetzt die Vogel-Perspektive. Damit das alles funktioniert muss
natürlich die PM Capability Structure auch richtig konfiguriert werden
und zwar in der Regel zumindest Teilweise vom Gerätetreiber.
Ich vermute sehr stark, dass der EP im D0 gar keinen PM_PME sendet wenn
Du einfach am WAKE# toggelst. m.E. wäre das nicht sinnvoll.
Wenn Du aus welchem Grund auch immer Training Sequenzen auf Knopfdruck
sehen willst, wäre mein Empfehlung, dass Du ein 16550 Kompatiblen UART
an Deinem EP hängst und diesen unter Windows mit dem standard serial.sys
Treiber verbindest. Wenn Du das richtig machst bekommst Du automatisch
einen Com Port zugeteilt. Die Microsft Com-Port Spec verlangt, dass ein
nicht benutztes Com Port nach D3 geschickt wird. Mit einer Applikation,
die den Com Port auf und zu macht muesstest Du bei jedem Übergang einen
Recovery Durchgang auslösen (zuminest von D3 nach D0). Hier werden
Training Sequenzen ausgetauscht.
Es gibt übrigens im Link-Control Register der PCIe Capability Structure
ein 'Retrain Link' bit. Nur, zumindest nach PCIe Spec steht dieses Bit
einem EP nicht zur Verfügung.
Viel Erfolg,
Charles
pcieIP schrieb:> Jetzt muss ich doch noch was nachfragen.>> Kann man wirklich mit WAKE (sofern man es bedienen kann), das> Root-port dazu bewegen, die Verbindung ab und dann die> Trainingssequenz wieder anzustoßen um die Verbindung> wieder aufzubauen ? So oft man will in dem anfangs beschriebenen> Status nur zum Test?>
Mit WAKE# geht da gar nichts. WAKE# ist normalerweise nicht mit dem
Rootport verbunden, sondern direkt mit dem Power Management Controller
des Systems. Und zwar typischerweise von allen Slots gemeinsam um das
System einzuschalten (z.B. bei Wake On Lan, USB Keyboard etc).
Einfach am WAKE# zu ziehen ist aber nicht erlaubt, denn das System will
anschliessend feststellen wer es war.
Was du vermutlich suchst ist Hotplugging, da sieht es allerdings düster
aus. Mir ist bislang nur ein Mainboard untergekommen das es supported,
und das war ein Intel Developmentboard in den Anfangszeiten von PCIe.
Das heisst natürlich nicht dass es heute keine gibt, und ich habe auch
nicht danach gesucht.
Danke euch beiden für die Klarstellung. In meiner naiven Vorstellen
dachte ich das könnte man so machen. Dann habe ich meine spärliche
Doku die ich gefunden haben wohl nicht richtig verstanden.
Vielen Dank nochmals.
Wenn es dir nur darum geht, den FPGA neu laden zu können ohne das System
neu zu starten, da gibt es eine Möglichkeit.
Vorrausgesetzt dass sich an der Definition des Configiration Space
nichts geändert hat, reicht es im Gerätemanager (oder devcon utililty)
den Treiber neu zu starten (d.h. disable/enable).