Wie wird das Gerät bei der PCI-Aufzählung ermittelt? (Bus / Gerät / Funktion)

10876
simple_symbols

Ich bin verwirrt über die Aufzählung von PCI-Bus / Gerät / Funktion. Auf der Wikipedia-Seite für PCI-Konfiguration sehe ich, dass der Master für einen bestimmten Bus die Hersteller-ID und die Geräte-ID für alle Geräte anfordert, die die Funktion 0 verwenden. Wenn alle 0xFFs zurückgegeben werden, ist kein Gerät vorhanden und die Aufzählung wird fortgesetzt. Wenn eine gültige Geräte-ID und eine Hersteller-ID gefunden werden, ist dort eine PCI-Einheit vorhanden, die aufgelistet wird. Ich bin nicht sicher, wie das Gerät in der bus.device.function ermittelt wird.

Angenommen, ich habe eine CPU mit einem PCI-Bus und einem daran angeschlossenen PCI-Peripheriegerät. Ich verstehe, dass die CPU (standardmäßig) auf Bus 0 schaut und alle Gerätenummern in Funktion 0 überprüft. Wie wird die Gerätenummer des Peripheriegeräts ermittelt?

8

1 Antwort auf die Frage

6
Gil Hamilton

Im ursprünglichen PCI-Framework ("Konventionelle PCI") und auch in PCI-X entsprachen die Geräte den "Steckplätzen", die jeweils über einen eigenen parallelen Bus verfügen. Jeder Slot hatte einen eindeutigen ID-Pin, der während der Aufzählung aktiviert wurde. Die Aufzählung bestand im Wesentlichen (für jeden Slot): "Hey, gibt es etwas in diesem Slot?" Das Gerät reagierte, indem es auf dieses Signal Daten auf den Bus ansteuerte. Fehlende Reaktion bedeutete kein Gerät.

Ein Gerät könnte auch eine "Brücke" sein, was bedeutet, dass es einen untergeordneten Bus bildete. Dieser Bus hätte eine separate ID (vom Upstream zugewiesen) und hätte seinen eigenen Satz von Slots, die unabhängig voneinander aufgezählt wurden.

PCI-Express (PCIe) ist völlig anders. PCIe ist nicht wirklich ein Bus - wie in einer von Geräten gemeinsam genutzten Ressource. Stattdessen verfügt jedes Gerät über eine eigene serielle Punkt-zu-Punkt-Verbindung zu seinem Upstream-Gerät (und zu allen Downstream-Geräten - und wenn es über Downstream-Geräte verfügt, funktioniert es auch als Bridge). Stellen Sie sich PCIe wie ein LAN vor. Jede Bridge ist analog zu einem Switch, an dem mehrere Ports mit anderen Geräten verbunden sind. Bei den anderen Geräten kann es sich um Endgeräte oder um andere Switches (z. B. PCIe-Bridges) handeln.

PCIe wurde so konzipiert, dass sein konzeptioneller Rahmen und seine Adressierung (und damit das Verhalten der Software) mit PCI und PCI-X kompatibel ist. Die Implementierung ist jedoch völlig anders. Bei der Aufzählung von Geräten ist die einzige Frage, die an jedem Punkt der Aufzählung bestimmt werden muss, "Punkt da?". Da jedes Gerät über einen eigenen unabhängigen Kabelsatz verfügt, sind die Geräte-IDs im Wesentlichen alle hart codiert (daher teilt jede Brücke, einschließlich des "Root-Komplexes" der obersten Ebene, jedem Gerät mit, welche Geräte-ID es sein wird).

In allen Fällen wird der Teil "Funktion" von Bus / Gerät / Funktion streng innerhalb des Peripheriegeräts behandelt. Beispielsweise hat ein NIC-Controller mit zwei Ports oft zwei Funktionen, eine für jeden Port. Sie können unabhängig voneinander konfiguriert und betrieben werden, der Datenpfad von der CPU zur Funktion ist jedoch für beide gleich.

Die Antwort ist etwas verwirrend: 1) In PCI bedeutet "Gerätenummer" eigentlich "Steckplatznummer" (und es ist sinnvoll), 2) Sie sagen "PCIe ist völlig anders" und "da jedes Gerät seinen eigenen unabhängigen Kabelsatz hat , Die Geräte-IDs sind im Wesentlichen alle hartcodiert ", was bedeutet, dass der Satz von Drähten (= der Steckplatz) die ID fest codiert hat, also die gleiche wie in PCI. Nun ist die Frage, wann das "Hardcoding" passiert? Die Switches / Bridges vergeben die IDs beim Reset neu? xealits vor 7 Jahren 1
Ja. Das könnte besser formuliert werden. Der Punkt ist, dass sich die Karte in PCI auf einem gemeinsam genutzten Bus befindet, aber "weiß", in welchem ​​Steckplatz sie sich befindet, und antwortet nur, wenn der Steckplatz-spezifische Pin aktiviert ist. In PCIe hat die Brücke N verschiedene "Drähte". Das Brückengerät hat also für jeden Kabelsatz eine diskrete Steckplatznummer. Aus Sicht der Brücke hat dieser Schlitz eine bestimmte Anzahl; Es muss nur festgestellt werden, ob da etwas ist. Die Karte selbst * weiß * nicht, in welchem ​​Steckplatz sie sich befindet. Sobald die Bridge feststellt, dass dort etwas ist, * teilt * sie dem Gerät mit, wie die Steckplatznummer lautet. Gil Hamilton vor 7 Jahren 2