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. |
| 1 | Memory Space | Nur wenn dieses Bit gesetzt ist, können MMIO-Register verwendet werden, sonst sind diese deaktiviert. |
| 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 Festplatten verwendet). |
| 3 | Special Cycles | Wenn dieses Bit gelöscht ist, dann muss das Gerät alle Special Cycles auf dem PCI-Bus ignorieren. |
| 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. |
| 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). |
| 6 | Parity Error Response | Ist dieses Bit gelöscht, so wird bei Parityfehlern auf dem PCI-Bus das Detected-Parity-Error-Statusbit im Statusregister gesetzt. |
| 8 | SERR# Enable | TODO |
| 9 | Fast Back-to-Back Enable | TODO |
| 10 | Interrupt Disable | Ist dieses Flag gesetzt, dann kann das entsprechende Gerät keine IRQs auslösen. |
Bit 7 ist auf 0 zu setzen, Bits 11 bis 15 sind reserviert (und undefiniert). Nach dem Reset des Geräts sind alle hier aufgeführten Bits auf 0 gesetzt (wobei das BIOS wohl einige davon setzen wird).
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