Peripheral Component Interconnect
Peripheral Component Interconnect (kurz PCI) ist ein Bus zur leichten Verbindung von Peripheriegeräten mit der CPU.
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.
Inhaltsverzeichnis
- 1 Konfigurations-Register
- 2 Classcodes
- 2.1 Class 0x00 - Pre 2.0
- 2.2 Class 0x01 - Massenspeicher
- 2.3 Class 0x02 - Netzwerk-Controller
- 2.4 Class 0x03 - Bildschirm-Controller
- 2.5 Class 0x04 - Multimedia-Geräte
- 2.6 Class 0x05 - Speicher-Controller
- 2.7 Class 0x06 - Bridge-Geräte
- 2.8 Class 0x07 - Controller zur einfachen Kommunikation
- 2.9 Class 0x08 - System-Peripherie
- 2.10 Class 0x09 - Input-Geräte
- 2.11 Class 0x0A - Docking-Stationen
- 2.12 Class 0x0B - Prozessoren
- 2.13 Class 0x0C - Serielle Buscontroller
- 2.14 Class 0x0D - Wireless-Controller
- 2.15 Class 0x0E - Intelligente Controller
- 2.16 Class 0x0F - Satelliten-Kommunikations-Controller
- 2.17 Class 0x10 - Encryption/Decryption-Controller
- 2.18 Class 0x11 - Datenerfassungs- und Signalprozessor-Controller
- 3 Weblinks
Konfigurations-Register
Jedes PCI-Gerät besitzt einen eigenen Konfigurations-Adressraum, welcher 256 Byte groß ist. Gelesen und beschrieben wird er 32bit-weise mithilfe eines Adress-I/O-Ports (0xCF8) und eines Daten-I/O-Ports (0xCFC).
Bei PCI-Express, Hypertransport und PCI-X ist der Konfigurations-Adress-Raum 4096 Byte groß.
Aufbau des Adress-I/O-Ports
| 31 | 30-24 | 23-16 | 15-11 | 10-8 | 7-0 |
|---|---|---|---|---|---|
| Enable Bit | Reserviert | Busnummer | Gerätenummer | Funktionsnummer | Registernummer bit0 u. bit1 sind 0 |
Aufbau des Konfigurations-Adressraum
| Register | 31-24 | 23-16 | 15-8 | 7-0 |
|---|---|---|---|---|
| 0x00 | Device ID | Vendor ID | ||
| 0x04 | Status | Command | ||
| 0x08 | Classcode | Revision ID | ||
| 0x0C | BIST | Header Type | Latency Timer | Cache Line Size |
Die ersten 16 Byte sind für alle PCI-Geräte gleich.
- Die Vendor IDs werden von PCI-SIG verwaltet und den Herstellern zugewiesen. Der Wert 0xffff ist für den Fall reserviert, dass an dieser Stelle kein Gerät vorhanden ist.
- Die Device IDs verwalten die Hardwarehersteller selbst. Sie dient zusammen mit der Vendor ID der eindeutigen Identifikation des Gerätes.
- Classcode ist noch einmal geteilt. Die oberen 8 Bit repräsentieren die Base Class. Die mittleren 8 Bit stehen für die Subclass und die unter 8 Bit für das Programming Interface.
- Die Revision ID wird vom Hardwarehersteller selbst verwaltet.
| Header Type | Kurze Beschreibung |
|---|---|
| 0x00 | Standard |
| 0x01 | PCI/PCI-Bridge |
| 0x02 | CardBus-Bridge |
- Header Type spezifiziert den Inhalt der Register 0x10-0x3C, wobei Bit 7 angibt ob es sich um ein Multifunction-Device handelt oder nicht.
Header Type 0x00
| Register | 31-24 | 23-16 | 15-8 | 7-0 |
|---|---|---|---|---|
| 0x10 | Base Address 0 (BAR0) | |||
| 0x14 | Base Address 1 (BAR1) | |||
| 0x18 | Base Address 2 (BAR2) | |||
| 0x1C | Base Address 3 (BAR3) | |||
| 0x20 | Base Address 4 (BAR4) | |||
| 0x24 | Base Address 5 (BAR5) | |||
| 0x28 | Cardbus CIS Pointer | |||
| 0x2C | Subsystem ID | Subsystem Vendor ID | ||
| 0x30 | Expansion ROM base address | |||
| 0x34 | Reserviert | Capabilities Pointer | ||
| 0x38 | Reserviert | |||
| 0x3C | Max Latency | Min Grant | Interrupt Pin | Interrupt Line |
Header Type 0x01
| Register | 31-24 | 23-16 | 15-8 | 7-0 |
|---|---|---|---|---|
| 0x10 | Base address 0 | |||
| 0x14 | Base address 1 | |||
| 0x18 | Secondary latency timer | Subordinate bus № | Secondary bus № | Primary bus № |
| 0x1C | Secondary Status | I/O Limit | I/O base | |
| 0x20 | Memory limit | Memory base | ||
| 0x24 | Prefetchable memory limit | Prefetchable memory base | ||
| 0x28 | Prefetchable base upper 32 bits | |||
| 0x2C | Prefetchable limit upper 32 bits | |||
| 0x30 | I/O limit upper 16 bits | I/O base upper 16 bits | ||
| 0x34 | Reserviert | Capabilities pointer | ||
| 0x38 | Extension ROM base address | |||
| 0x3C | Bridge control | Interrupt pin | Interrupt line | |
Bedeutung einiger Register
Status-Register
TODO
Command-Register
| Bit | Name | Bedeutung |
|---|---|---|
| 0 | IO Space | Nur wenn dieses Bit gesetzt ist, kann der I/O-Raum des Geräts verwendet werden, sonst ist er deaktiviert. Falls das Gerät keine IO-Ports anbietet, ist dieses Bit fest auf 0 geklemmt. |
| 1 | Memory Space | Nur wenn dieses Bit gesetzt ist, können MMIO-Register verwendet werden, sonst sind diese deaktiviert. Falls das Gerät kein MMIO (oder andere Speicherbereiche) anbietet, ist dieses Bit fest auf 0 geklemmt. |
| 2 | Bus Master | Ist dieses Bit gesetzt, so darf das Gerät als Busmaster auf dem PCI-Bus arbeiten. Das ist z. B. für PCI-DMA notwendig (wird u. a. von Netzwerkkarten und (S)ATA-Host-Controllern verwendet). Falls das Gerät nicht busmasterfähig ist, ist dieses Bit fest auf 0 geklemmt. Wenn dieses Bit auf 0 steht, wird damit auch MSI(-X) unterbunden. |
| 3 | Special Cycles | Wenn dieses Bit gelöscht ist, dann muss das Gerät alle Special Cycles auf dem PCI-Bus ignorieren. Special Cycles werden zum broadcasten von speziellen Nachrichten an alle PCI-Geräte benutzt. Es gibt nur wenige PCI-Geräte, bei denen dises Bit überhaupt beschreibbar ist, bei den meisten ist es fest auf 0 geklemmt. Bei PCI-Express ist es immer fest auf 0 geklemmt. |
| 4 | Memory Write and Invalidate Enable | Falls gesetzt, kann das Gerät diesen Befehl (Memory Write and Invalidate) ausführen, sonst muss es sich mit einem einfachen Memory Write begnügen. Bei PCI-Express ist dieses Bit immer fest auf 0 geklemmt. |
| 5 | VGA Palette Snoop | Dieses Bit ist nur für VGA-kompatible Geräte interessant (ist es gesetzt, so werden Zugriffe auf die VGA-Palettenregister gesondert behandelt), auf allen anderen Geräten ist es immer fest auf 0 geklemmt. Bei PCI-Express und Hypertransport ist dieses Bit immer fest auf 0 geklemmt, dort wird sowas in den Bridges konfiguriert. |
| 6 | Parity Error Response | Ist dieses Bit gesetzt, so wird bei Parityfehlern auf dem PCI-Bus das Detected-Parity-Error-Statusbit im Statusregister gesetzt. Nicht jede PCI-Hardware unterstützt die Generierung und Prüfung des Paritybits auf dem PCI-Bus, sodass dieses Bit dann fest auf 0 geklemmt ist. Daher sollte dieses Bit nur dann auf 1 gesetzt werden, wenn alle PCI-Geräte auf dem betreffenden physischen PCI-Bus-Segment die Parity-Bit-Generierung unterstützen. Bei PCI-Express und Hypertransport gibt es leistungsfähigere Fehlererkennungsmechanismen, deren Benutzung zu bevorzugen ist. |
| 7 | IDSEL Stepping / Wait Cycle Control |
Dieses Bit war nur in den ersten PCI-Spezifikationen gültig (vor 2.0) und muss immer auf 0 gesetzt werden. Auf allen PCI-Geräten seit der PCI-Spezifikation 2.0 (ab 1993) ist dieses Bit immer fest auf 0 geklemmt. |
| 8 | SERR# Enable | Wenn dieses Bit gesetzt ist darf/soll das Gerät erkannte schwerwiegende Fehler (z. B. Parityfehler während der Adressierungsphase oder ungültige Kommandos) über die extra #SERR-Leitung, oder bei PCI-Express über spezielle Messages, melden. Solche Fehler lösen für gewöhnlich einen NMI oder eine Machine-Check-Exception aus. Bei PCI-Express und Hypertransport gibt es leistungsfähigere Fehlererkennungsmechanismen, deren Benutzung zu bevorzugen ist. |
| 9 | Fast Back-to-Back Enable | Wenn dieses Bit auf 1 gesetzt ist soll das PCI-Gerät Back-to-Back-Zugriffe (als Slave)unterstützen und darf auch solche Zugriffe (als Master) ausführen. Dieses Bit lässt sich nur auf 1 setzen, wenn das zugehörige Bit im Status-Register diese Fähigkeit signalisiert, andernfalls ist es fest auf 0 geklemmt. Dieses Bit darf nur dann auf 1 gesetzt werden wenn alle PCI-Geräte auf dem betreffenden physischen PCI-Bus-Segment Back-to-Back-Zugriffe unterstützen. Wenn alle Geräte diesen Modus unterstützen, kann die Idle-Phase zwischen zwei PCI-Zyklen entfallen. Das erhöht etwas den Datendurchsatz auf dem PCI-Bus. Bei PCI-Express, Hypertransport und PCI-X ist es immer fest auf 0 geklemmt. |
| 10 | Interrupt Disable | Ist dieses Flag gesetzt, dann kann das entsprechende Gerät keine IRQs auslösen. Nach dem Hardware-Reset muss dieses Bit dummerweise immer gelöscht sein, sodass IRQs anfangs nicht verboten sind. MSI(-X) ist davon unabhängig, dafür gibt es spezielle Interrupt-Enable-Bits in den entsprechenden Capabilities. |
Bit 7 ist auf 0 zu setzen, Bits 11 bis 15 sind reserviert (und undefiniert) und müssen ebenfalls immer auf 0 gesetzt werden. Nach dem Reset des Geräts sind alle hier aufgeführten Bits auf 0 gesetzt (wobei das BIOS wohl einige davon setzen wird). Die Software sollte immer prüfen, ob sich die gewünschten Bits auch wirklich auf 1 setzen lassen, einige Bits sind eben fest auf 0 geklemmt.
Base-Address-Register
TODO
Codebeispiel
<c>
- define PCI_CONFIG_DATA 0xCFC
- define PCI_CONFIG_ADDRESS 0xCF8
/**
* Liest ein Dword aus einem PCI-Konfigurations-Register * @param bus Bus * @param dev Gerät * @param func Funktion * @param offset Registernummer * @return Register content */
int pci_config_readd(int bus,int dev,int func,int offset) {
int val; int address = 0x80000000|(bus<<16)|(dev<<11)|(func<<8)|(offset&0xFC); outl(PCI_CONFIG_ADDRESS,address); val = inl(PCI_CONFIG_DATA); return val;
}
/**
* Schreibt ein Dword in in ein PCI-Konfigurations-Register * @param bus Bus * @param dev Gerät * @param func Funktion * @param offset Registernummer * @param val Wert zum Schreiben */
void pci_config_writed(int bus,int dev,int func,int offset,int val) {
int address = 0x80000000|(bus<<16)|(dev<<11)|(func<<8)|(offset&0xFC); outl(PCI_CONFIG_ADDRESS,address); outl(PCI_CONFIG_DATA,val);
} </c>
Classcodes
| Class | Beschreibung |
|---|---|
| 0x00 | Alle Geräte die gebaut wurden bevor Classcodes eingeführt wurden |
| 0x01 | Massenspeicher |
| 0x02 | Netzwerk-Controller |
| 0x03 | Bildschirm-Controller |
| 0x04 | Multimedia-Geräte |
| 0x05 | Speicher-Controller |
| 0x06 | Bridge-Geräte |
| 0x07 | Controller zur einfachen Kommunikation |
| 0x08 | System-Peripherie |
| 0x09 | Input-Geräte |
| 0x0A | Docking-Stationen |
| 0x0B | Prozessoren |
| 0x0C | Serielle Buscontroller |
| 0x0D | Wireless-Controller |
| 0x0E | Intelligente Controller |
| 0x0F | Satelliten-Kommunikations-Controller |
| 0x10 | Encryption/Decryption-Controller |
| 0x11 | Datenerfassungs- und Signalprozessor-Controller |
| 0x12-0xFE | Reserviert |
| 0xFF | Sonstige |
Class 0x00 - Pre 2.0
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Alle nicht- VGA-Geräte |
| 0x01 | 0x00 | VGA-Geräte |
Class 0x01 - Massenspeicher
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | SCSI |
| 0x01 | 0x?? | IDE |
| 0x02 | 0x00 | Floppy |
| 0x03 | 0x00 | IPI |
| 0x04 | 0x00 | RAID |
| 0x05 | 0x20 | ATA-Controller (Single DMA) |
| 0x05 | 0x30 | ATA-Controller (Chained DMA) |
| 0x80 | 0x00 | Anderer Massenspeicher |
Class 0x02 - Netzwerk-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Ethernet |
| 0x01 | 0x00 | Token Ring |
| 0x02 | 0x00 | FDDI |
| 0x03 | 0x00 | ATM |
| 0x04 | 0x00 | ISDN |
| 0x05 | 0x00 | World FIP (Feldbus) |
| 0x06 | 0x?? | PICMG 2.14, Multi-Computing |
| 0x80 | 0x00 | Anderer Netzwerk-Controller |
Class 0x03 - Bildschirm-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | VGA |
| 0x00 | 0x01 | 8514 |
| 0x01 | 0x00 | XGA |
| 0x02 | 0x00 | 3D |
| 0x80 | 0x00 | Anderer Bildschirm-Controller |
Class 0x04 - Multimedia-Geräte
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Video-Gerät |
| 0x01 | 0x00 | Audio-Gerät |
| 0x02 | 0x00 | Telefonie |
| 0x80 | 0x00 | Anderes Multimedia-Gerät |
Class 0x05 - Speicher-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | RAM |
| 0x01 | 0x00 | Flash-Speicher |
| 0x80 | 0x00 | Anderer Speicher |
Class 0x06 - Bridge-Geräte
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Host/PCI-Bridge |
| 0x01 | 0x00 | PCI/ISA-Bridge |
| 0x02 | 0x00 | PCI/EISA-Bridge |
| 0x03 | 0x00 | PCI/MicroChannel-Bridge |
| 0x04 | 0x00 | PCI/PCI-Bridge (hat Header Type 0x01) |
| 0x04 | 0x01 | PCI/PCI-Bridge (Subtractive Decode, hat Header Type 0x01) |
| 0x05 | 0x00 | PCI/PCMCIA-Bridge |
| 0x06 | 0x00 | PCI/NuBus-Bridge |
| 0x07 | 0x00 | PCI/CardBus-Bridge |
| 0x08 | 0x?? | Raceway, Switched Fabric |
| 0x09 | 0x40 | Semitransparente PCI/PCI-Bridge
(primär zum Host) |
| 0x09 | 0x80 | Semitransparente PCI/PCI-Bridge (sekundär zum Host) |
| 0x0A | 0x00 | InfiniBand/PCI-Brige |
| 0x80 | Anderer Bridge-Typ |
Class 0x07 - Controller zur einfachen Kommunikation
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Serielle Schnittstelle
(XT-kompatibel) |
| 0x00 | 0x01 | Serielle Schnittstelle (16450) |
| 0x00 | 0x02 | Serielle Schnittstelle (16550) |
| 0x00 | 0x03 | Serielle Schnittstelle (16650) |
| 0x00 | 0x04 | Serielle Schnittstelle (16750) |
| 0x00 | 0x05 | Serielle Schnittstelle (16850) |
| 0x00 | 0x06 | Serielle Schnittstelle (16950) |
| 0x01 | 0x00 | Parallelport
(Standard) |
| 0x01 | 0x01 | Parallelport (Bidirektional) |
| 0x01 | 0x02 | Parallelport (ECP 1.0) |
| 0x01 | 0x03 | Parallelport (IEEE 1284) |
| 0x01 | 0xFE | IEEE-1284-Gerät, Target |
| 0x02 | 0x00 | Multiport Serial Controller |
| 0x03 | 0x00 | Standard-Modem |
| 0x03 | 0x01 | Hayes-kompatibles Modem (16450) |
| 0x04 | 0x00 | GPIB (IEEE488.1/2) Controller |
| 0x04 | 0x02 | Hayes-kompatibles Modem (16550) |
| 0x04 | 0x03 | Hayes-kompatibles Modem (16650) |
| 0x04 | 0x04 | Hayes-kompatibles Modem (16750) |
| 0x05 | 0x00 | SmartCard |
| 0x80 | 0x00 | Andere
Controller |
Class 0x08 - System-Peripherie
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | 8259- PIC |
| 0x00 | 0x01 | ISA-PIC |
| 0x00 | 0x02 | EISA-PIC |
| 0x00 | 0x10 | IO- APIC (EISA) |
| 0x00 | 0x20 | IOx-APIC |
| 0x01 | 0x00 | 8237-DMA-Controller |
| 0x01 | 0x01 | ISA-DMA-Controller |
| 0x01 | 0x02 | EISA-DMA-Controller |
| 0x02 | 0x00 | Standard-8254-Timer |
| 0x02 | 0x01 | ISA-System-Timer |
| 0x02 | 0x02 | EISA-System-Timer |
| 0x03 | 0x00 | Standard Real Time Clock |
| 0x03 | 0x01 | ISA Real Time Clock |
| 0x04 | 0x00 | PCI Hot Plug Controller |
| 0x80 | 0x00 | Andere System-Peripherie |
Class 0x09 - Input-Geräte
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Tastatur |
| 0x01 | 0x00 | Digitizer (Stift) |
| 0x02 | 0x00 | Maus |
| 0x03 | 0x00 | Scanner |
| 0x04 | 0x00 | Standard-Gameport |
| 0x04 | 0x10 | Gameport |
| 0x80 | 0x00 | Anderes Input-Gerät |
Class 0x0A - Docking-Stationen
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Normale Docking-Station |
| 0x80 | 0x00 | Andere Docking-Station |
Class 0x0B - Prozessoren
| Subclass | Programming-Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | 386 |
| 0x01 | 0x00 | 486 |
| 0x02 | 0x00 | Pentium |
| 0x10 | 0x00 | Alpha |
| 0x20 | 0x00 | PowerPC |
| 0x30 | 0x00 | MIPS |
| 0x40 | 0x00 | Coprozessor |
Class 0x0C - Serielle Buscontroller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Firewire (IEEE 1394) |
| 0x00 | 0x10 | Firewire (OHCI) |
| 0x01 | 0x00 | ACCESS-Bus |
| 0x02 | 0x00 | SSA (Serial Storage Architecture) |
| 0x03 | 0x00 | USB-Host (UHCI) |
| 0x03 | 0x10 | USB-Host (OHCI) |
| 0x03 | 0x20 | USB-Host (EHCI) |
| 0x03 | 0x80 | USB-Host (kein HCI) |
| 0x03 | 0xFE | USB-Gerät |
| 0x04 | 0x00 | Fibre Channel |
| 0x05 | 0x00 | SMB (System Management Bus) |
| 0x06 | 0x00 | InfiniBand |
| 0x07 | 0x00 | IPMI SMIC Interface |
| 0x07 | 0x01 | IPMI Keyboard Style Interface |
| 0x07 | 0x02 | IPMI Block Transfer Device |
| 0x08 | 0x00 | SERCOS Interface |
| 0x09 | 0x00 | CANBus |
Class 0x0D - Wireless-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | iRDA |
| 0x01 | 0x00 | Consumer Infrared |
| 0x10 | 0x00 | Radio Frequency |
| 0x11 | 0x00 | Bluetooth |
| 0x12 | 0x00 | Broadband |
| 0x80 | 0x00 | Anderer Wireless-Controller |
Class 0x0E - Intelligente Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x?? | I²O-Architektur |
| 0x00 | 0x00 | Message FIFO |
Class 0x0F - Satelliten-Kommunikations-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x01 | 0x00 | TV |
| 0x02 | 0x00 | Audio |
| 0x03 | 0x00 | Sprache |
| 0x04 | 0x00 | Daten |
Class 0x10 - Encryption/Decryption-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x01 | 0x00 | Netzwerk |
| 0x10 | 0x00 | Entertainment |
| 0x80 | 0x00 | Anderer Controller |
Class 0x11 - Datenerfassungs- und Signalprozessor-Controller
| Subclass | Programming Interface | Beschreibung |
|---|---|---|
| 0x00 | 0x00 | Digital Input/Output Module |
| 0x01 | 0x00 | Zähler |
| 0x10 | 0x00 | Synchronisation und Frequenzmessung |
| 0x20 | 0x00 | Management Card |
| 0x80 | 0x00 | Anderer Controller |
Weblinks
- Linux PCI ID Repositorium - Enthält viele VendorIDs und die dazugehörigen DeviceIDs