← ST-Computer 05 / 1998

Das PCI-BIOS Teil 2

Grundlagen

Wie bereits im ersten Teil dieser Serie erwĂ€hnt wurde, hat jedes PCI-GerĂ€t einen eigenen Registersatz. Ein Zugriff auf diesen Konfigurationsbereich erfolgt immer durch paralleles Setzen der IDSEL-Leitung des ensprechenden Slots und dem Anlegen der Registeradresse und des Buskommandos Configuration Read oder Configuration Write auf den Leitungen /C/BE[0..3]. Die IDSEL-Leitung ist dabei fĂŒr jeden Slot separat vorhanden und wird vom Motherboard auskodiert. Nur mit dieser Art der Steuerung ist ein Zugriff auf die einzelnen Karten direkt nach dem Reset möglich, da zu diesem Zeitpunkt noch keine AdressrĂ€ume zugeteilt wurden. Der Zugriff auf diese Register wird auf dem PC vom PCI-BIOS ĂŒber die Befehle Configuration Read / Configuration Write bereitgestellt. Und in der nĂ€chsten Folge möchte ich dann sĂ€mtliche Möglichkeiten eines ATARI PCI-BIOS vorstellen.

Der PCI Configuration Bereich

Jede PCI-Karte enthĂ€lt einen Satz von definierten Registern, die Informationen ĂŒber die Karte bereitstellen und die die automatische Vergabe von Ressourcen ĂŒberhaupt erst ermöglichen. Der Registerbereich ist 256 Bytes lang und teilt sich in einen von der PCI-SIG (PCI - Special Interest Group) vordefinierten und in einen kartenspezifischen Bereich. Dabei mĂŒssen in den jeweiligen PCI-GerĂ€ten von den beiden Bereichen nur die notwendigen Register implementiert werden Das Speicherlayout des 64 Byte langen, vordefinierten Bereichs selbst muss aber von jeder PCI-Karte eingehalten werden und beinhaltet die Identifikationsdaten der Karte und die Möglichkeiten zur generellen Kontrolle ĂŒber die Karte. Die folgenden 192 Bytes sind nicht durch die PCI-Spezifikation vorgegeben, sondern können mit herstellerspezifischen Informationen gefĂŒllt und danach vom Softwaretreiber ausgewertet werden.

Die Register werden wĂ€hrend der Initialisierung des PCI-Busses ausgewertet und mĂŒssen daher schon direkt nach dem Reset gĂŒltige Werte enthalten. Auch spĂ€ter mĂŒssen die Register im freien Zugriff verbleiben, da zum Beispiel die Systemsoftware (PCI-BIOS) die Informationen ĂŒber die AdressrĂ€ume benötigt und eventuelle Statusinformationen abgefragt werden mĂŒssen.

Um herauszufinden, welche Karten nun am PCI-Bus angeschlossen sind, kann man die Vendor ID in jedem der im System vorhandenen Slots auslesen. Die Hostsystem muss daher Zugriffe auf die Konfigurationsbereiche nicht vorhandener Karten (ohne Fehlermeldung) unterstĂŒtzen. Da fĂŒr eine Vendor ID der Wert FFFFhex nicht erlaubt ist, reicht es daher völlig, wenn die Systemhardware bei Lesezugriffen auf den Konfigurations-Bereich nicht vorhandener Karten eben diesen Wert zurĂŒckliefert.

Jedes PCI-GerĂ€t muss Schreibzugriffe auf reservierte oder nicht unterstĂŒtzte Register ignorieren, d.h. der Schreibzugriff muss am PCI-Bus ohne Fehlermeldung abgeschlossen werden. Die Daten selbst werden allerdings von der Karte verworfen. Lesezugriffe auf reservierte oder nicht implementierte Register mĂŒssen ebenfalls ohne Fehlermeldung am Bus abgeschlossen, und ein Wert von 0000hex zurĂŒckgegeben werden.

Tabelle 1: Die vordefinierten Konfigurationsregister

Configuration Register Adress- Offset
Device ID Vendor ID 00h
Status Command 04h
Class Code Revision ID 08h
BIST Header Type Latency Timer Cache Line Size 0Ch
Base Address Registers
10h
14h
18h
1Ch
20h
24h
Reserved 28h
Reserved 2Ch
Expansion ROM Base Address 30h
Reserved 34h
Reserved 38h
Max_lat Min_Gnt Interrupt Pin Interrupt Line 3Ch

Tabelle 1 zeigt das Layout des von der PCI-SIG definierten 64Byte-Bereichs, das jede Karte unterstĂŒtzen muss. Jedem PCI-GerĂ€t ist es natĂŒrlich freigestellt, weitere gerĂ€tespezifischen Register im nachfolgenden Bereich abzulegen. Alle Felder, bestehend aus mehr als einem Byte, liegen dem Little Endian (Intel)-Format zugrunde, d.h. die niederwertigere Adresse beinhaltet auch das niederwertigere Byte.
Die Treibersoftware muss mit bitcodierten Feldern sorgsam umgehen, da diese zumeist reservierte Bitpositionen fĂŒr eine etwaige spĂ€tere Verwendung beinhalten. Die Software muss daher bei Lesezugriffen Masken verwenden um die verwendeten Bits zu extrahieren, und darf sich keinesfalls auf bestimmte Werte in reservierten Bits verlassen. Bei Schreibzugriffen muss die Software sicherstellen, dass die Werte von reservierten Bits nicht verĂ€ndert werden, d.h. ihr Wert muss vorher ausgelesen und zum gewĂŒnschten Wert der anderen Bits 'gemerged' werden.

Auch dieser von der PCI-SIG vordefinierte Bereich gliedert sich in zwei Bereiche. Der erste 16 Bytes lange Bereich gilt fĂŒr alle Arten von PCI-GerĂ€ten und ist immer gleich. Den verbleibenden 48 Bytes können in AbhĂ€ngigkeit von der Funktion des PCI-GerĂ€ts verschiedene Layouts zugewiesen werden. Das Feld 'Header Type' an Adresse 0Ehex legt fest, um welches Layout es sich in diesem zweiten Bereich handelt.
Alle PCI-GerĂ€te mĂŒssen die Register fĂŒr Vendor ID, Device ID, Command und Status implementieren. Die Implementierung der anderen Register ist optional und hĂ€ngt wieder einmal mehr von der FunktionalitĂ€t des PCI-GerĂ€ts ab. Nicht implementierte Register können vom PCI-GerĂ€t wie reservierte Register behandelt werden. Wenn allerdings ein PCI-GerĂ€t eine Funktion beinhaltet, deren Verhalten durch eines der definierten Register festgelegt wird, so muss das PCI-GerĂ€t dieses Register an der dafĂŒr definierten Stelle mit dem definierten Verhalten zur VerfĂŒgung stellen.

Bedeutung der Konfigurations-Register

Der PCI-Bus hat das Potential, die Konfiguration von Zusatzkarten wesentlich zu vereinfachen. Dazu mĂŒssen aber diese PCI-GerĂ€te bestimmte Funktionen (ĂŒber Register) der Konfigurationssoftware (PCI-BIOS) zur VerfĂŒgung stellen. Im folgenden werden also die Register dieses vordefinierten Konfigurations-Bereichs vorgestellt. Das exakte Format der Register (d.h. die Anzahl der implementierten Bits usw.) hĂ€ngt wiederrum vom jeweiligen PCI-GerĂ€t ab. Jedoch mĂŒssen einige allgemeine Regeln beachtet werden. So mĂŒssen alle Register die Möglichkeit bieten, die eingestellten Werte zurĂŒckzulesen, und diese gelesenen Daten mĂŒssen einen Wert reprĂ€sentieren, den die Karte fĂŒr die aktuellen Einstellungen gerade verwendet.
Die Konfigurationsregister werden zur Konfiguration, Initialisierung und fĂŒr die Behandlung schwerer Fehler verwendet, und sollten nur von der Initialisierungssoftware (d.h. PCI-BIOS) und eventuellen Fehlerbehandlungsroutinen verwendet werden. Die GerĂ€tetreiber selbst sollen nur Zugriffe auf I/O und/oder Memory Bereiche verwenden, um gerĂ€tespezifische Register und damit die FunktionalitĂ€t des PCI-GerĂ€ts zu manipulieren.

Die Identifikationsregister

FĂŒnf Felder im vordefinierten Bereich sind fĂŒr die Identifikation des GerĂ€ts vorgesehen. Alle PCI-GerĂ€te mĂŒssen diese Felder unterstĂŒtzen. Die Konfigurationssoftware kann somit leicht feststellen, welche GerĂ€te am PCI-Bus des Rechners verfĂŒgbar sind. Alle diese Register sind 'read only'.

Vendor ID:
Dieses Feld identifiziert den Hersteller des PCI-GerĂ€ts. GĂŒltige Kennungen werden von der PCI-SIG an zahlende (!) Mitglieder vergeben, um eine Eindeutigkeit zu gewĂ€hrleisten. Diese Herstellerkennung ist 16 Bit breit, wobei der Wert FFFFhex eine ungĂŒltige Vendor ID darstellt und vom Motherboard bei einem nicht belegten Slot zurĂŒckgeliefert wird. Anhand dieses Wertes kann also das PCI-BIOS unterscheiden, ob in dem betreffenden Slot eine Karte vorhanden ist oder nicht

Device ID:
Dieses Feld identifiziert ein spezielles GerÀt. Die Kennung wird vom Hersteller der Karte selbst vergeben, und dient zusammen mit der Vendor ID dem Softwaretreiber zum eindeutigen Erkennen eines PCI-GerÀtes. Die Funktion FindPCIDevice eines PCI-BIOS macht von dieser Möglichkeit Gebrauch. Ein spezielles Problem ergibt sich aber bei der Verwendung von Standard Interface Chips wie dem PCI9060. Verwendet man nÀmlich z.B. auf einer selbst gebauten Karte einen solchen Interface Chip, so meldet sich dieser mit seiner eigenen Vendor und Device ID und zu einer eindeutigen Erkennung und Unterscheidung solcher Karten ist daher noch eine Subsystem Vendor ID sowie eine Subsystem Device ID notwendig. Mit diesem Thema wird sich zu einem spÀteren Zeitpunkt ein weiterer Artikel beschÀftigen.

Revision ID:
Dieses Register beinhaltet eine gerÀtespezifische Revisionsnummer. Der Wert selbst wird wieder vom Hersteller der Karte vergeben, wobei auch die Revisionsnummer 00hex erlaubt ist. Dieses Feld sollte daher als herstellerspezifische Erweiterung zur Device ID angesehen werden.

Header Type:
Dieses Byte legt sowohl das Layout der Bytes 10hex bis 3Fhex des Konfigurationsbereiches fest, als auch die Information, ob das GerĂ€t weitere Funktionen beinhaltet. Bit 7 dieses Registers wird dazu verwendet, um sogenannte multi function devices zu kennzeichnen. Ist das Bit 0, so handelt es sich bei diesem GerĂ€t um ein single function device, ist es hingegen gesetzt, so hat dieses GerĂ€t mehrere Funktionseinheiten. Bits 6..0 legen schließlich das Format des zweiten Teils des Konfigurationsbereiches fest. Das in Tabelle 1 gezeigt Layout gilt fĂŒr Standard-GerĂ€te und ist mit Header Type 00hex gekennzeichnet. Zur Zeit ist noch Header Type 01hex fĂŒr PCI to PCI-Bridges definiert.

Class Code:
Das Class Code Register ist ebenfalls nur 'read only' und wird dazu verwendet, um die 'Gattung' (die generelle Funktion) eines PCI-GerÀtes festzulegen, sowie in einigen wenigen FÀllen ein Register Interface.
Das Register ist dazu in 3 Bytes unterteilt. Das oberste Byte (an Adresse 0Bhex) stellt die Basisklasse dar, welche die Funktion dieser Karte ganz allgemein beschreibt. Das mittlere Byte (an Adresse 0Ahex) ist eine Subklasse, welches die in der Basisklasse definierte Funktion genauer beschreibt. Im Falle von Basisklasse 02hex fĂŒr Network Controller wird hier z.B. weiter zwischen Ethernet, Token Ring, FDDI und anderen Arten unterschieden. Das niedrigste Byte (an Adresse 09hex) ist schließlich das gerĂ€tespezifische Register Interface, ĂŒber das gerĂ€teunabhĂ€ngige Software mit dem GerĂ€t kommunizieren kann. Tabelle 2 zeigt die definierten Werte fĂŒr die Basisklasse. Der Class Code selbst ermöglicht ĂŒberhaupt erst die Zusammenarbeit von gerĂ€teunabhĂ€ngiger Software mit Standardkomponenten wie etwa einer Grafikkarte, da es eben eine FĂŒlle an verschiedenen Herstellern (Vendor ID) und verschiedenen kompatiblen Grafikkarten (Device ID) gibt, die ein Treiber sonst alle implementieren mĂŒĂŸte.

Tabelle 2: Die Definition der Basisklassen

Basisklasse Bedeutung
00h PCI-GerÀt wurde bereits vor der Definition der Class Codes gefertigt
01h Mass Storage controller
02h Network controller
03h Display controller
04h Multimedia device
05h Memory controller
06h Bridge device
07h - FEh Reserviert
FFh GerĂ€t paßt in keine der obigen Klassen

Die Basisklasse 00 hex

Diese Basisklasse wurde definiert, um AbwĂ€rtskompatibilitĂ€t fĂŒr diejenigen PCI-GerĂ€te zu gewĂ€hrleisten, die bereits vor der Definition der Basisklassen gebaut wurden. Neue GerĂ€te dĂŒrfen diesen Wert nicht mehr verwenden, und Ă€ltere GerĂ€te sollten soweit als möglich auf einen aussagekrĂ€ftigeren Wert umsteigen. FĂŒr diese Basisklasse existieren nur zwei Subklassen, alle anderen Werte sind reserviert.
Basisklasse Subklasse Interface Bedeutung
00h 00h 00h alle PCI-GerĂ€te außer VGA-kompatibler GerĂ€te
01h 00h VGA-kompatible GerÀte

Die Basisklasse 01 hex (Mass Storage controller)
Diese Basisklasse wurde fĂŒr alle möglichen Massenspeicher-Anwendungen definiert.
Bisher sind fĂŒr diese GerĂ€te keinerlei Register Interfaces definiert

Basisklasse Subklasse Interface Bedeutung
01h 00h 00h SCSI bus controller
01h 00h IDE controller
02h 00h Floppy disk controller
03h 00h IPI bus controller
80h 00h andere mass storage controller

Die Basisklasse 02 hex (Network controller)

Diese Basisklasse wurde fĂŒr die verschiedensten Arten an Netzwerkkarten definiert.
Auch hier gibt es bisher noch keine definierten Register Interfaces.
Basisklasse Subklasse Interface Bedeutung
02h 00h 00h Ethernet controller
01h 00h Token Ring controller
02h 00h FDDI controller
80h 00h andere Netzwerk controller

Die Basisklasse 03 hex (Display controller)

Diese Basisklasse wurde fĂŒr alle Arten an Grafikkarten definiert.
Dazu gibt es einige Subklassen, zu denen jeweils ein eigenes Register Interface existiert.

Basisklasse Subklasse Interface Bedeutung
03h 00h 00h VGA - kompatible Grafikkarte
01h 00h XGA - kompatible Grafikkarte
80h 00h alle andere Grafikkarten

Die Basisklasse 04 hex (Multimedia device)
Diese Basisklasse definiert die möglichen Typen von Multimedia GerĂ€ten, fĂŒr die aber keinerlei spezifische Register Interfaces definiert sind.

Basisklasse Subklasse Interface Bedeutung
04h 00h 00h Video
01h 00h Audio
80h 00h andere Multimedia GerÀte

Die Basisklasse 05 hex (Memory controller)

Diese Basisklasse definiert alle möglichen Arten an Memory controllern.
Es sind keine spezifischen Register Interfaces definiert.

Basisklasse Subklasse Interface Bedeutung
05h 00h 00h RAM
01h 00h FLASH
80h 00h andere Memory controller

Die Basisklasse 06 hex (Bridge device)
Diese Basisklasse ist fĂŒr alle möglichen Typen von 'bridge devices' reserviert.
Eine solche PCI-bridge ist ein PCI-GerÀt, das PCI Ressourcen (Memory oder I/O) von der einen Seite dieses GerÀts auf die andere Seite des GerÀts mappt. Es gibt mehrere Subklassen, und es sind keine spezifischen Register Interfaces definiert.

Basisklasse Subklasse Interface Bedeutung
06h 00h 00h Host bridge
01h 00h ISA bridge
02h 00h EISA bridge
03h 00h MC bridge
04h 00h PCI to PCI bridge
05h 00h PCMCIA bridge
80h 00h alle anderen bridge devices

Die Kontrollregister
Command:
Über das Command Register können die verschiedenen Möglichkeiten des PCI-GerĂ€tes ĂŒber einzelne Bits freigeschalten werden, sofern das GerĂ€t dies auch unterstĂŒtzt. Das Command Register stellt auch eine einfache Kontrolle ĂŒber das PCI-GerĂ€t dar, ob es PCI-Cycles generieren beziehungsweise darauf antworten darf. Schreibt man eine 0 in das Command Register, so ist dieses GerĂ€t mit Ausnahme von Zugriffen auf den Konfigurationsbereich logisch vom PCI-Bus getrennt. Alle PCI-GerĂ€te mĂŒssen diese FunktionalitĂ€t dem System zur VerfĂŒgung stellen. Die anderen Bits im Command Register können in AbhĂ€ngigkeit der weiteren Funktionen und Möglichkeiten der betreffenden Karte wahlweise implementiert werden. Eine Karte, die z.B. keine I/O- Zugriffe erlaubt, wird auch das Setzen des entsprechenden Bits im Register nicht zulassen. Die PCI-GerĂ€te beinhalten typisch den Wert 00hex nach dem Power up, d.h. die Funktionen werden erst vom PCI-BIOS freigegeben (oder auch nicht).

Tabelle 3: Bits im Command Register

Bit Bedeutung
0 IO Space

0: GerÀt reagiert nicht auf I/O Zugriffe

1: GerÀt reagiert auf I/O Zugriffe
1 Memory Space

0: GerÀt reagiert nicht auf Memory Zugriffe

1: GerÀt reagiert auf Memory Zugriffe
2 Bus Master

0: GerÀt generiert keinerlei Zugriffe am PCI-Bus

1: GerÀt darf als Busmaster auftreten
3 Special Cycles

0: GerÀt ignoriert Special Cycle Operationen

1: GerÀt reagiert auf Special Cycle Operationen
4 Memory Write and Invalidate Enable (als Busmaster)

0: GerÀt benutzt als Busmaster nur Memory Write Befehle

1: GerÀt darf Memory Write and Invalidate verwenden.
5 VGA Palette Snooping (Bit muss von allen VGA kompatiblen GerĂ€ten zur VerfĂŒgung gestellt weden)

0: GerÀt behandelt Paletten-Befehle wie alle anderen

1: GerÀt antwortet nicht auf Paletten-Befehle
6 Parity Error Response (GerĂ€te, die auf Parity prĂŒfen, mĂŒssen dieses Bit unterstĂŒtzen; GerĂ€te mĂŒssen das Parity Bit immer generieren, auch wenn die Funktion ĂŒber dieses Bit deaktiviert ist)

0: GerÀt ignoriert Parity - Fehler

1: GerÀt signalisiert und reagiert auf Parity - Fehler
7 Wait Cycle Control

0: GerÀt arbeitet ohne Adress Data stepping

1: GerÀt arbeitet mit Adress Data stepping
8 SERR# enable (Parity wird nur dann gemeldet, wenn auch dieses Bit gesetzt wurde)

0: GerÀt darf an Pin /SERR keinen System Error signalisieren

1: GerÀt darf an Pin /SERR System Error signalisieren
9 Fast Back-to-Back Enable (legt fest, ob das PCI-GerĂ€t als Busmaster Transaktionen zu verschiedenen Targets durchfĂŒhren darf; die Initialisierungssoftware setzt dieses Bit, wenn alle Targets Fast Back-to-Back capable signalisieren)

0: GerÀt darf Fast Back-to-Back nicht verwenden

1: GerÀt darf als Busmaster Fast Back-to-Back verwenden
10-15 reserviert

Status:
Das Status-Register wird dazu verwendet, um Informationen bezĂŒglich PCI Bus - relevanter VorgĂ€nge zur VerfĂŒgung zu stellen. Die PCI-GerĂ€te mĂŒssen wiederrum nicht alle Bits implementieren, das hĂ€ngt wieder von der FunktionalitĂ€t der Karte selbst ab. Wenn eine Karte z.B. als Target agiert, aber niemals einen target abort signalisiert, wird auch dieses Bit von der Karte nicht verwendet werden. Lesezugriffe auf diese Register verlaufen normal, Schreibzugriffe auf dieses Register können Bits nur löschen, aber nicht setzen. Ein Bit in diesem Register wird gelöscht, wenn man an der jeweiligen Position eine 1 schreibt. Wenn man z.B. Bit 14 löschen möchte, ohne andere Register zu beeintrĂ€chtigen, so schreibt man in dieses Register den Wert 4000hex. Im Gegensatz dazu kann das PCI-GerĂ€t selbst diese Bits nur setzen, aber nicht löschen.

Tabelle 4: Bits im Status Register

Bit Bedeutung
0 - 6 reserviert
7 Fast Back-to-Back Capable (zeigt an, ob das PCI-GerÀt als Target Fast Back-to-Back Transaktionen zu mehreren Targets verabeitet kann)

0: keine Fast Back-to-Back Transaktionen als Target möglich

1: GerÀt versteht als Target auch Fast Back-to-Back Transaktionen
8 Data Parity Detected (wird nur signalisiert, wenn ein ParitÀtsfehler wÀhrend eines Busmaster-Zugriffs auftritt, und durch das Command Register auch freigeschalten wurde)

0: kein Parity Error bei Master Zugriff oder durch Command Register gesperrt

1: Parity Error bei Master Zugriff aufgetreten
9 - 10 DEVSEL timing (ein PCI-Target zeigt an Pin /DEVSEL an, dass es einen Zugriff auf eine Adresse registriert hat, die sich in einem durch das Basisadreßregister zugewiesenem Adressbereich befindet; der Wert legt fest, zu welchem Zeitpunkt nach der Adressphase der Pin /DEVSEL von High nach Low wechselt.)

00: schnell (nach einem PCI-Taktzyklus)

01: mittel (nach zwei PCI-Taktzyklen)

10: langsam (nach drei PCI-Taktzyklen)

11: reserviert
11 Signaled Target Abort (zeigt an, wenn das PCI-GerÀt selbst die laufende Transaktion am PCI-Bus abbricht)

0: keine abgebrochene Transaktion

1: GerÀt hat Transaktion mit 'Target Abort' abgebrochen
12 Received Target Abort (zeigt an, wenn das PCI-GerÀt als Busmaster agiert und die laufende Transaktion am PCI-Bus durch das Target abgebrochen wird)

0: keine abgebrochene Transaktion

1: Target hat Transaktion mit 'Target Abort' abgebrochen
13 Received Master Abort (zeigt an, wenn das PCI-GerĂ€t als Busmaster agiert und die laufende Transaktion mit Ausnahme von Special Cycle am PCI-Bus durch 'Master Abort' abgebrochen wird - alle Busmaster-fĂ€higen GerĂ€te mĂŒssen dieses Bit implementieren)

0: keine abgebrochene Transaktion

1: Busmaster - Transaktion wurde durch 'Master Abort' abgebrochen
14 Signaled System Error (zeigt an, ob das GerÀt an Pin /SERR einen System Error signalisiert hat)

0: kein System Error

1: System Error signalisiert
15 Detected Parity Error (zeigt an, ob das GerÀt einen Parity Error erkannt hat - auch wenn das Parity Handling durch das Command Register abgeschalten wurde)

0: kein Parity Error erkannt

1: Parity Error erkannt

Verschiedene Funktionen
Die nachfolgenden Register sind gerĂ€tespezifisch und mĂŒssen nur von denjenigen Karten zur VerfĂŒgung gestellt werden, die die beschriebene FunktionalitĂ€t beinhalten. FĂŒr den Standardbetrieb sind diese Register nicht nötig.

Cache Line Size
Dieses Register legt die GrĂ¶ĂŸe der Cache Line in Langworten (32 Bit) fest. Dieses Register muss von allen busmasterfĂ€higen GerĂ€ten zur VerfĂŒgung gestellt werden, die das Kommando Write and Invalidate generieren können. GerĂ€te die am caching protocol beteiligt sind, verwenden dieses Register um herauszufinden, wann Burst-Zugriffe an den Cache Grenzen zu wiederholen sind. Wenn das Register auf 0 gesetzt ist, können die jeweiligen GerĂ€te die PCI Cache Leitungen /SDONE und /SBO ignorieren. GerĂ€te, die dieses Register zur VerfĂŒgung stellen, mĂŒssen dessen Wert bei Reset auf 0 setzen.

Latency Timer
Der Standardzugriff auf dem PCI-Bus ist der Burst. Ein Einzelzugriff ist somit nichts anderes als ein nach dem ersten Datenwort beendeter Burst. Sowohl der Master als auch der Slave (Target) können einen Bursttransfer abbrechen. Der Busmaster bricht dann einen Transfer ab, wenn ihm der Bus ĂŒber /GNT entzogen wird, und seine interne Verzögerung (latency timer) abgelaufen ist.
Dieses Register legt den Wert des Latency Timers fĂŒr Busmaster fest, und muss daher auch von allen busmasterfĂ€higen GerĂ€ten zur VerfĂŒgung gestellt werden, die mehr als zwei Datenphasen im Burst-Betrieb verarbeiten. Bei zwei oder weniger Datenphasen im Burst-Betrieb kann dieses Register auch als 'read-only' ausgefĂŒhrt sein, der somit fixierte Wert sollte allerdings kleiner gleich 16 (bus clocks) sein. Eine durchaus verbreitete Implementierung sieht z.B. die untersten 3 Bits als 'read-only' vor, wĂ€hrend die oberen 5 Bits beliebig verĂ€ndert werden können. Dadurch ergibt sich eine Auflösung des Latency Timers von 8 bus clocks. Ist dieses Register allerdings nicht als reines 'read only'-Register ausgefĂŒhrt, muss das PCI-GerĂ€t dessen Wert bei Reset auf 0 setzen.

Built-in Self Test (BIST)
Dieses optionale Register dient zur Steuerung eines auf der PCI-Karte implementierten Eigentests, sofern dieser ĂŒberhaupt vorhanden ist. PCI-GerĂ€te die keinen Selbsttest zur VerfĂŒgung stellen, liefern in diesem Register den Wert 0 zurĂŒck. Ein GerĂ€t, dessen Selbsttest gestartet wurde, darf den Normalbetrieb des PCI-Busses in keinster Weise beeintrĂ€chtigen.

Tabelle 5: Bits im BIST Register

Bit Bedeutung
7 BIST capable

0: GerĂ€t unterstĂŒtzt keinen Selbsttest

1: GerĂ€t stellt einen eingebauten Selbsttest zur VerfĂŒgung
6 Start BIST

1: Selbsttest starten. Nach Beendigung des Tests wird dieses Bit vom PCI-GerÀt wieder auf 0 gesetzt. Trifft dies auch nach dem Ablauf von 2 Sekunden nicht zu, so ist diese Karte als defekt einzustufen.
5 - 4 reserviert
3 - 0 Completion code

0000: PCI-GerÀt hat den Selbsttest bestanden.

Alle von 0000 verschiedenen Werte stellen gerÀtespezifische Fehlercodes dar.

Interrupt Line:
Dieses 8-bit breite Register wird vom Hostsystem dazu verwendet, die Information ĂŒber den dem GerĂ€t zugeteilten Hardware-Interrupt allgemein zur VerfĂŒgung zu stellen. Der Wert in diesem Register zeigt an, welcher Eingang des Interruptcontrollers mit dem Interrupt-Pin des PCI-GerĂ€tes verbunden ist. Sowohl GerĂ€tetreiber als auch das Betriebssystem selbst können diese Information dazu benutzen, um InterruptprioritĂ€ten und Vektorinformationen zu ermitteln. Die Werte in diesem Register hĂ€ngen von der jeweilig verwendeten Systemarchitektur ab. Der Wert FFhex wird dann verwendet, wenn keine Zuordnung zum Interrupt Controller ermittelt werden konnte, oder wenn keine Verbindung zu diesem besteht. Vom PCI-GerĂ€t selbst wird dieses Register.nicht weiter beachtet.

Interrupt Pin:
Das Interrupt Pin Register kann nur gelesen werden. Über dieses Register teilt das PCI-GerĂ€t dem Hostsystem mit, welche Interruptleitung des PCI-Busses es benutzt. PCI-GerĂ€te, die keine Interrupts generieren, mĂŒssen dieses Register auf 0 setzen.

Tabelle 6: Interrupt Pin Register

Wert Bedeutung
0 PCI-GerÀt generiert keine Interrupts
1 PCI-GerÀt verwendet Interrupt Pin /INTA
2 PCI-GerÀt verwendet Interrupt Pin /INTB
3 PCI-GerÀt verwendet Interrupt Pin /INTC
4 PCI-GerÀt verwendet Interrupt Pin /INTD
5-255 reserviert

MIN_GNT und MAX_LAT
Diese beiden 'read only' Register legen die Grenzwerte fĂŒr das Setzen des Latency Timers (nur fĂŒr den Busmaster-Betrieb nötig) fest. Beide Register haben hierbei eine Auflösung von 0,25 Mikrosekunden. Ein Wert von 0 zeigt an, dass dieses PCI-GerĂ€t keine speziellen Anforderungen an die Konfiguration des Latency Timers stellt.
MIN_GNT zeigt an, wie lange das PCI-GerĂ€t fĂŒr eine einzige Burst-Periode (nur eine Datenphase) in Bezug auf eine PCI-Taktrate von 33 MHz mindestens benötigt. Dem PCI-GerĂ€t (als Busmaster) sollte also fĂŒr mindestens diese Zeit der Bus durch den Bus Arbiter zugeteilt werden. MAX_LAT definiert, fĂŒr wie lange das PCI-GerĂ€t als Busmaster Zugriff auf den PCI-Bus erwirken möchte. Aus beiden Werten kann man dann einen geeigneten Wert fĂŒr das Latency Timer Register wĂ€hlen. Der Busmaster gibt den Bus ja erst dann zurĂŒck, wenn ihm der Bus Arbiter den PCI-Bus ĂŒber /GNT entzieht, und der eigene latency timer abgelaufen ist. Ein Master darf sich aber nicht durch stĂ€ndiges Aktivieren der /REQ-Leitung den Bus auf Dauer sichern, sondern nur fĂŒr den aktuellen Zugriff benutzen. Der Algorithmus zur Arbitrierung ist in der PCI-Spezifikation allerdings nicht festgelegt. Die PCI-GerĂ€te sollten daher auch solche Werte angeben, die eine effektive Verwendung sowohl des PCI-Busses als auch ihrer eigenen internen Ressourcen ermöglichen.

Basis-Addressen:
Die Basisadressen sind eine der wichtigsten Funktionen, um eine einfache Konfiguration und Einbindung von PCI-GerĂ€ten in das Rechnersystem zu gewĂ€hrleisten. Die sechs Basisadreßregister enthalten die in der Initialisierungsphase (vom PCI-BIOS) vergebenen Adressen zum Zugriff auf die einzelnen AdressrĂ€ume des PCI-GerĂ€tes. Bit 0 in diesen Adressregistern kann nur gelesen werden und zeigt an, ob der Adressraum im Memory-Bereich oder im I/O-Bereich liegt.

Memory-Bereiche:
Register, die einen Memory-Bereich anfordern, mĂŒssen Bit 0 auf den Wert 0 setzen. Die Register selbst sind dabei entweder 32 bit oder aber auch 64 bit breit. Zur Auskodierung der Basisadresse verwendet das PCI-GerĂ€t allerdings nur Bit 4 bis Bit 31 bzw. Bit63, d.h. Memory-Bereiche beginnen stets an 16 Byte - Grenzen.
Die anderen Bits sind 'read only'. In Bit 3 des Registers wird mitgeteilt, ob der Adressbereich 'prefetchable' ist, und in Bit 2 und Bit 1 steht die gewĂŒnschte Art des Memory mappings in der Initialisierungsphase

Tabelle 7: Adressregister fĂŒr Memory-Bereiche

Bit Bedeutung
31(63)..4 Memory-Basisadresse (32 oder 64 bit breit)
3 Prefetchable
2 - 1 Type (GrĂ¶ĂŸe des Registers 32/64 bit, sowie gewĂŒnschter Adressraum)

00: 32 bit breit, beliebig im 32 bit Adressraum

01: 32 bit breit, Adressraum unterhalb 1 MB

10: 64 bit breit, beliebig im 64 bit Adressraum

11: reserviert
0 Memory Space Indicator = 0

I/O-Bereiche:

Register, die einen I/O-Bereich anfordern, sind immer 32 Bit breit und mĂŒssen in Bit 0 den Wert 1 zurĂŒckliefern. Bit 1 ist reserviert (read only) und muss immer gelöscht sein, alle anderen Bits (Bit 2 bis Bit 31) beschreiben schließlich die Adresse im I/O-Bereich, d.h. diese Bereiche beginnen stets an 4 Byte - Grenzen.

Tabelle 8: Adressregister fĂŒr IO-Bereiche

Bit Bedeutung
31..2 I/O-Basisadresse
1 reserviert (immer 0)
0 IO Space Indicator = 1

Insgesamt ist im Konfigurationsbereich Platz fĂŒr sechs Adressregister. Das erste Adressregister beginnt immer an Offset 10hex. Die Lage des zweiten Adressregisters hĂ€ngt dann allerdings von der GrĂ¶ĂŸe (32/64 Bit) des ersten Registers ab, und beginnt demnach an Offset 14hex bzw. 18hex.
Grafikkarten fordern typischerweise einen I/O-Bereich fĂŒr die Kontrollregister und einen Memory-Bereich fĂŒr den Grafikspeicher an. Wenn ein PCI-GerĂ€t seine Kontrollregister in den Memory- und in den I/O-Bereich legen will, muss es dafĂŒr auch zwei Adressregister 'spendieren'. GrundsĂ€tzlich sollten es alle PCI-GerĂ€te ermöglichen, Kontrollregister in den Memory-Bereich zu mappen. Das ist aus der UnzulĂ€nglichkeit der PCs entstanden, die einen viel zu kleinen I/O-Bereich besitzen.

Anforderung von AdressrÀumen

Um nun zu bestimmen, wieviel Speicher das jeweilige GerĂ€t mittels der Adressregister anfordert, beschreibt das Hostsystem jedes Adressregister mit dem Wert FFFF'FFFFhex und liest danach das Register wieder zurĂŒck. Das PCI-GerĂ€t liefert an jenen Bitpositionen 0 zurĂŒck, die es zur Auskodierung des gewĂŒnschten Speicherbereichs verwendet. Fordert das GerĂ€t z.B. einen 1MB großen Memory-Bereich im 32-bit Adressraum und einen 256 Byte großen I/O-Bereich an, so findet man nach dem Beschreiben mit FFFF'FFFFhex in einem Adressregister FFF0'0000hex fĂŒr den Memory-Bereich und in dem anderen FFFF'FF01hex fĂŒr den I/O-Bereich vor. Das Hostsystem kann danach die Basisadressen fĂŒr die jeweiligen PCI-GerĂ€te vergeben. Ab diesem Zeitpunkt dekodieren die PCI-GerĂ€te die Zugriffe dann selbst aus. Die Vergabe der AdressrĂ€ume beim Booten des Rechnersystems ist Aufgabe eines PCI-BIOS.
Damit wÀren nun die wichtigsten Register vorgestellt und in der nÀchsten Folge können wir uns dann endlich mit der Definition und den Aufgaben eines ATARI PCI-BIOS beschÀftigen. Die bereits in der ersten Folge bechriebene Möglichkeit von Erweiterungs-ROMs auf den Karten werden zu einem spÀteren Zeitpunkt behandelt.

Markus Fichtenbauer