Peripheral Component Interconnect — Änderungen 7259 → 7260

Zeile 3: Zeile 3:
 
Die Informationen in diesem Artikel beziehen sich auch auf die vom klassischen PCI-Bus abgeleiteten Bus-Standards: PCI-Express, Hypertransport, PCI-X und AGP. Diese Busse basieren vom logischen Protokoll her auf PCI aber benutzen andere physikalische Daten-Übertragungsmechanismen bzw. andere Topologien.
 
Die Informationen in diesem Artikel beziehen sich auch auf die vom klassischen PCI-Bus abgeleiteten Bus-Standards: PCI-Express, Hypertransport, PCI-X und AGP. Diese Busse basieren vom logischen Protokoll her auf PCI aber benutzen andere physikalische Daten-Übertragungsmechanismen bzw. andere Topologien.
  
−
== Konfigurations-Register ==
+
== Konfigurations-Adressraum ==
−
Jedes PCI-Gerät besitzt einen eigenen Konfigurations-Adressraum, welcher 256 Byte groß ist. Bei PCI-Express, Hypertransport und PCI-X ist der Konfigurations-Adress-Raum 4096 Byte groß. Auf den Konfigurations-Adressraum kann immer Zugegriffen werden, unabhängig vom Zustand des PCI-Geräts (von den Zuständen "defekt", "abgeschaltet" oder "ausgebaut" mal abgesehen). Für den Zugriff auf den Konfigurations-Adressraum werden die PCI-Geräte über ihre Bus-Nummer, Device-Nummer und Function-Nummer angesprochen, dazu müssen eventuelle PCI-to-PCI-Bridges korrekt konfiguriert sein.
+
Jedes PCI-Gerät besitzt einen eigenen Konfigurations-Adressraum, welcher 256 Byte groß ist und verschiedene Konfigurations-Register enthält. Bei PCI-Express, Hypertransport und PCI-X ist der Konfigurations-Adress-Raum 4096 Byte groß. Auf den Konfigurations-Adressraum kann immer Zugegriffen werden, unabhängig vom Zustand des PCI-Geräts (von den Zuständen "defekt", "ausgebaut" oder "abgeschaltet" mal abgesehen). Für den Zugriff auf den Konfigurations-Adressraum werden die PCI-Geräte über ihre Bus-Nummer, Device-Nummer und Function-Nummer angesprochen, dazu müssen eventuelle PCI-to-PCI-Bridges korrekt konfiguriert sein.
−
 
 
−
=== Zugriff auf den Konfigurations-Adressraum ===
 
−
Gelesen und beschrieben wird der Konfigurations-Adressraum, bei PCs, 32bit-weise mithilfe eines Adress-I/O-Ports (0xCF8) und eines Daten-I/O-Ports (0xCFC).
 
−
 
 
−
==== Aufbau des Adress-I/O-Ports ====
 
−
{| {{Prettytable}}
 
−
|- align="center"
 
−
! 31        || 30-24      || 23-16    || 15-11        || 10-8            || 7-0
 
−
|- align="center"
 
−
| Enable Bit || bgcolor="#bbb" | Reserviert || Busnummer || Gerätenummer || Funktionsnummer || Registernummer<br> bit0 u. bit1 sind 0
 
−
|}
 
−
<br />
 
  
 
=== Aufbau des Konfigurations-Adressraum ===
 
=== Aufbau des Konfigurations-Adressraum ===
Zeile 80: Zeile 68:
 
*Im ''Interrupt Line''-Register legt das BIOS die zugewiesene x86-Interrupt-Nummer ab, welche das #INT?-Signal des betreffendem PCI-Geräts auslöst. Diese Info ist nur relevant wenn man die IRQs über den klassischen PIC vermitteln lässt, wenn die APICs benutzt werden ist diese Info unter Umständen nur noch von begrenztem Nutzen. Diese Info ist eine reine Freundlichkeit des BIOS der x86-Plattform, auf allen anderen Plattformen bleibt dieses Register leer. Dem PCI-Gerät ist der Wert in diesem Register egal und wird es auch nicht verändern. Falls das PCI-Gerät keine Interrupts benutzt, oder nur per MSI(-X) signalisiert, kann dieses Register auch fest auf 0x00 geklemmt sein.
 
*Im ''Interrupt Line''-Register legt das BIOS die zugewiesene x86-Interrupt-Nummer ab, welche das #INT?-Signal des betreffendem PCI-Geräts auslöst. Diese Info ist nur relevant wenn man die IRQs über den klassischen PIC vermitteln lässt, wenn die APICs benutzt werden ist diese Info unter Umständen nur noch von begrenztem Nutzen. Diese Info ist eine reine Freundlichkeit des BIOS der x86-Plattform, auf allen anderen Plattformen bleibt dieses Register leer. Dem PCI-Gerät ist der Wert in diesem Register egal und wird es auch nicht verändern. Falls das PCI-Gerät keine Interrupts benutzt, oder nur per MSI(-X) signalisiert, kann dieses Register auch fest auf 0x00 geklemmt sein.
  
−
====Header Type 0x00====
+
==== Header Type 0x00 ====
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
|- align="center"
 
|- align="center"
 
! Register || width="22%" | 31-24 || width="22%" | 23-16 || width="22%" | 15-8 || width="22%" | 7-0
 
! Register || width="22%" | 31-24 || width="22%" | 23-16 || width="22%" | 15-8 || width="22%" | 7-0
 
|- align="center"
 
|- align="center"
−
| 0x010    || colspan="4" | Base Address 0 (BAR0)
+
| 0x010    || colspan="4" | Base Address #0 (BAR0)
 
|- align="center"
 
|- align="center"
−
| 0x014    || colspan="4" | Base Address 1 (BAR1)
+
| 0x014    || colspan="4" | Base Address #1 (BAR1)
 
|- align="center"
 
|- align="center"
−
| 0x018    || colspan="4" | Base Address 2 (BAR2)
+
| 0x018    || colspan="4" | Base Address #2 (BAR2)
 
|- align="center"
 
|- align="center"
−
| 0x01C    || colspan="4" | Base Address 3 (BAR3)
+
| 0x01C    || colspan="4" | Base Address #3 (BAR3)
 
|- align="center"
 
|- align="center"
−
| 0x020    || colspan="4" | Base Address 4 (BAR4)
+
| 0x020    || colspan="4" | Base Address #4 (BAR4)
 
|- align="center"
 
|- align="center"
−
| 0x024    || colspan="4" | Base Address 5 (BAR5)
+
| 0x024    || colspan="4" | Base Address #5 (BAR5)
 
|- align="center"
 
|- align="center"
 
| 0x028    || colspan="4" | Cardbus CIS Pointer
 
| 0x028    || colspan="4" | Cardbus CIS Pointer
Zeile 110: Zeile 98:
 
|}
 
|}
  
−
====Header Type 0x01====
+
==== Header Type 0x01 ====
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
|- align="center"
 
|- align="center"
−
! Register || width="22%" | 31-24 || width="22%" | 23-16 || width="22%" | 15-8 || width="22%" | 7-0
+
! Register !! width="22%" | 31-24 !! width="22%" | 23-16 !! width="22%" | 15-8 !! width="22%" | 7-0
 
|- align="center"
 
|- align="center"
−
| 0x010 || colspan="4" | Base Address 0 (BAR0)
+
| 0x010 || colspan="4" | Base Address #0 (BAR0)
 
|- align="center"
 
|- align="center"
−
| 0x014 || colspan="4" | Base Address 1 (BAR1)
+
| 0x014 || colspan="4" | Base Address #1 (BAR1)
 
|- align="center"
 
|- align="center"
 
| 0x018 || Secondary latency timer || Subordinate bus № || Secondary bus № || Primary bus №
 
| 0x018 || Secondary latency timer || Subordinate bus № || Secondary bus № || Primary bus №
Zeile 202: Zeile 190:
  
 
==== Base-Address-Register ====
 
==== Base-Address-Register ====
−
''TODO''
+
Die Base-Address-Register dienen dem Zuweisen von Adressen an die Ressourcen des PCI-Gerätes. Ein PCI-Gerät kann bis zu 6, bei Bridges nur maximal 2, Ressourcen anbieten dehnen das BIOS oder OS eine Adresse zuweist über welche diese Ressource dann ansprechbar ist. Als Ressourcen können Speicherbereiche aber auch IO-Bereiche angeboten werden, der IO-Adress-Raum wird aber nicht auf jeder Plattform unterstützt, eigentlich nur beim PC. Die IO-Ressourcen haben verschiedene Nachteile, u.a. sind sie langsamer da es keine Burst-Zugriffe gibt und es gibt Einschränkungen bei der Adressenraumgröße. Speicher-Ressourcen können bis zu 64 Bit Adressen nutzen, wofür dann aber 2 hintereinander liegende BARs für eine Ressource benutzt werden müssen.
 +
 
 +
Nur alleine durch lesen eines BAR-Register kann man nicht auf die Größe der betreffenden Ressource schließen.
 +
 
 +
===== Base-Address-Register für Speicher-Ressourcen mit 32 Bit Adresse =====
 +
{| {{Prettytable}}
 +
|- align="center"
 +
! 31-4 !! width="10%" | 3 !! width="20%" | 2-1 !! width="10%" | 0
 +
|- align="center"
 +
| Base Address || P || Typ || 0
 +
|}
 +
 
 +
===== Base-Address-Register für Speicher-Ressourcen mit 64 Bit Adresse =====
 +
{| {{Prettytable}}
 +
|- align="center"
 +
! 63-4 !! width="6%" | 3 !! width="12%" | 2-1 !! width="6%" | 0
 +
|- align="center"
 +
| Base Address || P || Typ || 0
 +
|}
 +
 
 +
===== Base-Address-Register für IO-Ressourcen =====
 +
{| {{Prettytable}}
 +
|- align="center"
 +
! 31-2 !! width="10%" | 1 !! width="10%" | 0
 +
|- align="center"
 +
| Base Address || R || 1
 +
|}
 +
Das Bit 0 signalisiert mit seinem Wert 1 das es sich bei dem betreffenden BAR um eine IO-Ressource handelt. Das Bit 1 ist reserviert und muss beim lesen ignoriert und beim schreiben mit 0 gelöscht werden. Die Bits 31-2 geben die Basis-Adressbits 31-2 der IO-Ressource an. Die IO-Ressource muss also mindestens 4 Byte groß sein. Oft sind die Bits 31-16 fest auf 0 geklemmt so das nur 16 Bit-IO-Adressen benutzt werden können, auf der PC-Plattform unterstützen die CPUs auch nur 16 Bit-IO-Adressen so das normalerweise daraus kein Problem entsteht.
 +
 
 +
=== Zugriff auf den Konfigurations-Adressraum ===
 +
Gelesen und beschrieben wird der Konfigurations-Adressraum, bei PCs, 32bit-weise mithilfe eines Adress-I/O-Ports (0x0CF8) und eines Daten-I/O-Ports (0x0CFC).
 +
 
 +
==== Aufbau des Adress-I/O-Ports ====
 +
{| {{Prettytable}}
 +
|- align="center"
 +
! 31        || 30-24      || 23-16    || 15-11        || 10-8            || 7-0
 +
|- align="center"
 +
| Enable Bit || bgcolor="#bbb" | Reserviert || Busnummer || Gerätenummer || Funktionsnummer || Registernummer<br /> bit0 u. bit1 sind 0
 +
|}
  
−
=== Codebeispiel ===
+
==== Codebeispiel ====
 
<c>
 
<c>
−
#define PCI_CONFIG_DATA    0xCFC
+
#define PCI_CONFIG_DATA    0x0CFC
−
#define PCI_CONFIG_ADDRESS 0xCF8
+
#define PCI_CONFIG_ADDRESS 0x0CF8
  
 
/**
 
/**