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

8

Ich bin verwirrt über die Aufzählung von PCI-Bus / Gerät / Funktion. Auf der Wikipedia-Seite zur PCI-Konfiguration sehe ich, dass der Master für einen bestimmten Bus mithilfe der Funktion 0 die Hersteller-ID und die Geräte-ID für alle Geräte anfordert. Wenn alle 0xFFs zurückgegeben werden, ist kein Gerät vorhanden, und die Aufzählung wird fortgesetzt. Wenn eine gültige Geräte- und Hersteller-ID gefunden wird, befindet sich dort eine PCI-Einheit, die aufgelistet wird. Ich bin mir 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 sucht und nach allen Gerätenummern sucht, die Funktion 0 betrachten. Wie wird die Gerätenummer des Peripheriegeräts ermittelt?

simple_symbols
quelle

Antworten:

6

Im ursprünglichen PCI-Framework ("konventionelle PCI") und auch in PCI-X entsprachen Geräte "Steckplätzen", von denen jeder seine eigenen Anschlüsse an denselben parallelen Bus angeschlossen hatte. Jeder Steckplatz hatte einen eindeutigen ID-Pin, der während der Aufzählung bestätigt wurde. Die Aufzählung fragte im Wesentlichen (für jeden Slot): "Hey, ist in diesem Slot etwas vorhanden?" Das Gerät reagierte, indem es als Reaktion auf dieses Signal Daten auf den Bus fuhr. Mangelnde Reaktion bedeutete kein Gerät.

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

PCI-Express (PCIe) ist völlig anders. PCIe ist nicht wirklich ein Bus - wie bei einer Ressource, die von Geräten gemeinsam genutzt wird. 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 Downstream-Geräte hat, bedeutet dies, dass es auch als Brücke fungiert). 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. Die anderen Geräte können Endgeräte oder andere Switches (dh PCIe-Bridges) sein.

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

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

Gil Hamilton
quelle
1
Die Antwort ist etwas verwirrend: 1) In PCI bedeutet "Gerätenummer" tatsächlich "Steckplatznummer" (und es ist sinnvoll), 2) Sie sagen "PCIe ist völlig anders" und "da jedes Gerät seinen eigenen unabhängigen Kabelsatz hat sind die Geräte-IDs im Wesentlichen alle fest codiert ", was bedeutet, dass dem Kabelsatz (= dem Steckplatz) die ID fest codiert ist, daher ist sie dieselbe wie bei PCI. Die Frage ist nun, wann die "Hardcodierung" stattfindet. Die Switches / Bridges weisen die IDs beim Zurücksetzen neu zu?
Xealits
2
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 nur reagiert, wenn ihr steckplatzspezifischer Pin aktiviert ist. In PCIe hat die Brücke N verschiedene Sätze von "Drähten". Das Brückengerät hat also eine diskrete Steckplatznummer für jeden Kabelsatz. Aus Sicht der Brücke hat dieser Schlitz eine bestimmte Nummer; es muss nur feststellen, ob da etwas ist. Die Karte selbst weiß nicht , in welchem ​​Steckplatz sie sich befindet. Sobald die Bridge feststellt, dass sich dort etwas befindet, teilt sie dem Gerät die Steckplatznummer mit.
Gil Hamilton