Peripheral Component Interconnect

Aus Lowlevel
Version vom 28. Februar 2010, 21:20 Uhr von Erik.vikinger (Diskussion | Beiträge) (→‎Aufbau des Konfigurations-Adressraum)
Wechseln zu:Navigation,

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.

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 Bus-Master fä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 so das 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, so das IRQs erst mal nicht verboten sind. MSI(-X) ist davon unabhängig, dafür gibt es extra 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>

  1. define PCI_CONFIG_DATA 0xCFC
  2. 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