Programmation modules sous Linux  (partie 1)

Suivant
Programmation module
V . Le bus PCI
1 . Historique
2 . Présentation
3 . Interconnexion
4 . Fonctionnement
5 . Evolution et variantes
6 . Espace mémoire
7 . Espace de configuration
8 . Utilisation des outils

1 . Historique

Le bus PCI (Peripheral Component Interconnect) est une norme développée initialement par INTEL et distribuée en version 1.0 en 1992. Cette toute première définition présentait le PCI comme un bus local, proche des ressources, gravitant autour du processeur central.

La spécification du bus a été étendue en 1993 de manière à inclure une environnement plus large, avec des ressources disposées sur des cartes enfichables dans une connectique normalisée.

Enfin, en 1995, la révision 2.1 de cette norme, a incorporé des clarifications, ainsi que les spécifications nécessaires à la migration du bus vers la technologie de cadencement à 66 MHz.

Une révision 2.2 est actuellement finalisée, elle devrait inclure des définitions sur la gestion de l’énergie des alimentations.


2 . Présentation

Le bus PCI est un bus synchrone supportant un multiplexage des signaux d’adressages et de données.
Il est avant tout prévu pour travailler avec des systèmes 32 bits, dans un fonctionnement en échange entre un maître et un esclave sous le contrôle d’un arbitre.
D’après la spécification du bus, un minimum de 49 signaux est nécessaire pour un module capable d’assurer des fonctions de maître, tandis que les autres signaux normalisés peuvent n’être que des options.

    


3 . Interconnexion

La spécification du bus autorise l’interconnexion de quatre cartes sur le bus PCI.
La norme prévoit également l’emploi de passerelles (bridges) d’un bus PCI vers un autre bus PCI ou vers un autre type de bus (ISA par exemple).
Dans le cas de l’utilisation de bridges PCI/PCI, jusqu’à 256 passerelles sont possibles.


4 . Fonctionnement

Le principe de transfert de données sur le bus PCI exploite les échanges par paquets (burst).

Pour le transfert de données, le PCI se compose donc :

Du bus d’adresses et de données multiplexé, noté AD[31..00], qui permet donc d’exploiter 32 bits en adressage (4 Go). Ce bus réalise tout d'abord la phase dite d’adressage, puis il devient bus de données (multiplexage).

Du bus de commandes et de validation d’octets, noté C/BE[3..0]*, qui permet, durant la phase d’adressage, de transmettre la commande de bus, puis il devient bus de validation des données (groupes de 32 bits sur le bus de données).

Du bus de contrôle qui regroupe les signaux gérés par le maître :

    FRAME* : Départ et validation de transaction.
    IRDY* : Etat du maître de l'échange.

  En réponse l’esclave fournit :

    TRDY* : Etat de l’esclave dans échange.
    DEVSEL* : Indique la sélection d’un esclave s’étant reconnu après l’adressage.
    STOP* : Demande d’arrêt de l'échange.

Pour exécuter un transfert sur le bus PCI, le maître concerné doit d’abord s’assurer de la disponibilité du bus pour son propre usage. Le maître engage alors l’accès bus en positionnant l’adresse et la commande, en même temps que le FRAME*. Après un front d’horloge, le maître positionne alors l’IRDY*, qui signale qu’il est paré pour le transfert, mais surtout qu'il termine la phase d’adressage.

Les esclaves potentiellement concernés sont alors amenés à répondre au maître consécutivement aux décodage d’adresses qu’ils ont chacun réalisés. Le signal DEVSEL* positionné indique alors qu’un esclave s’est reconnu pour l’échange, et le positionnement de TRDY* indique qu’il est prêt pour le transfert.

Le maître positionne alors les signaux de validation des octets C/BE[3..0]* , et dans le cas de l’écriture, émet la donnée. L’esclave positionne, ou lit, la donnée et informe qu’il est paré pour la suite en conservant TRDY*.

Le maître termine enfin l’échange, ou l’esclave réclame la fin du transfert par STOP*,

Signaux de contrôle (CLK, RST*, PAR, PERR* et SERR*)

Le bus PCI étant synchrone, il intègre un signal d’horloge global CLK. Une commande d’initialisation par le signal RST* est également distribuée à tous les agents du bus. Par ailleurs, les agents du PCI gèrent la parité par un signal PAR calculé sur les bus AD[31..0] et C/BE[3..0]*. Une détection d’erreur pouvant entraîner le positionnement d’un signal d’erreur PERR*. Enfin, une erreur système, considérée comme grave, est signalée par SERR* vers, en général, l’arbitre du bus.

Gestion des interruptions

Les interruptions sur le PCI sont optionnelles par rapport à la configuration minimale nécessaire. Lorsqu’elles sont utilisées, elles sont au nombre de quatre et fonctionnent de manière asynchrone. Cependant, seule l’interruption INTA* est distribuée à tous les agents par défaut. Lorsqu’une interruption est prise en compte par le gestionnaire, l’acquittement et le transfert du vecteur correspondant se font classiquement par le bus, mais en utilisant le bus de commande C/BE[3..0]* positionné spécifiquement.


5 . Evolutions et variantes

Les évolutions successives du bus PCI sont intervenues sur les facteurs suivants :

Fréquence : passage de 33 Mhz à 66 Mhz
Taille : de 32 bits à 64 bits
Tension : de 5V à 3.3V
Bande passante max. : de 132 MO/s à 528 MO/s

Remarque: Si on ne considère que le transfert de données, il faut ramener le taux de transfert à environ 80 à 90 MO/s pour le mode 32 bits et 320 à 360 MO/s pour le mode 64 bits.

Le bus PCI a connu aussi des variantes en fonction de divers besoins :

Le CompactPCI : cette norme est en fait l'adaptation aux besoins industriels (connectique plus résistante). Elle compatible électriquement même si elle peut fonctionner sous 3.3V. Elle intègre aussi le Hot Swap qui permet l'ajout et le retrait des cartes à chaud.

Le PXI (PCI eXtension for Instrumentation) est également un bus adapté selon la même réflexion que le CompactPCI, mais il vise plus le domaine de l’instrumentation. Sa norme est plus sévère que celle du CompactPCI, sachant que des capacités logicielles sont aussi spécifiées (stipulant que chaque module PXI doit supporter les OS Window$).

Le SmallPCI (SPCI) pour l'intégration de l'architecture PCI dans les ordinateurs portables. Elle possède les mêmes caractéristiques et performances que le PCI standard.

Le PCI Hot Plug qui est en fait une extension à la norme PCI pour permettre l'ajout et le retrait des cartes à chaud. Initiée par Compaq, elle est maintenant un Industry Open standard.

Le PCIx, sous la conduite d'IBM, HP et Compaq, sera une norme destinée aux serveurs. Elle devrait posséder une fréquence de 133 Mhz et supportait des taux de transfert de 1 GO/s.


6 . Espace mémoire

La norme PCI permet de définir trois espaces différents : mémoire, E/S et configuration.

A l'initialisation, seul l'accès à l'espace de configuration est possible.

La gestion des espaces mémoire et d'E/S ne sera donc possible qu'après la lecture et l'interprétation des informations contenues dans l'espace de configuration.

Les fonctionnalités liées aux espaces mémoire et d'E/S ne seront pas les mêmes suivants les cartes PCI utilisées. En effet, Une carte réseau n'offrira pas les mêmes fonctionalités qu'une carte CAN/CNA industrielle par exemple.


7 . Espace de configuration

La définition du PCI fournit une description complète d’un espace de configuration que doit assurer tout composant interfaçable sur le bus.
Les composants offrent un espace de 256 octets inclus dans des registres. Les 64 premiers octets sont organisés de manière standard.
Cet ensemble de registres est implanté de manière à pouvoir être modifié au niveau local par un processeur intégré par une mémoire externe.
Cependant, c’est surtout au niveau de l’accessibilité par le bus PCI que cet espace est intéressant.

Les deux premiers registres identifient de manière unique le périphérique :

Vendor ID : numéro du constructeur de l'interface. Le groupe PCI Sig fournit des numéros valides.
Device ID : numéro de périphérique chez le constructeur.

Les registres suivants sont :

Le registre Class Code permet d'indentifier le type de périphérique.
Les registres Base Address Register (BAR 0 à BAR 5, soit 6 registres possibles) constituent un espace d'accès aux fonctions du périphérique (les plages mémoires et/ou les ports d'E/S).
Le registre IRQ Pin indiquera si l'interface gère les interruptions et
le registre IRQ line permettra de connaître le niveau de l'interruption alloué par le BIOS.

Remarque : dans le cas du développement d'un driver pour une carte PCI, le programmeur devra connaître exactement le contenu des fonctionnalités de l'interface pour pouvoir les exploiter à partir des BARx. Généralement, cela s'obtient dans la documentation fournie par le constructeur de l'interface.


8 . Les outils sous Linux

Le bus PCI étant Plug and Play, il sera donc configurer automatiquement parle BIOS au démarrage de la machine.

L'utilisateur peut accèder aux informations concernant la configuration et la détection des périphériques PCI en utilisant différents outils :

La commande dmesg qui permet de visualiser les messages émis par le système au démarrage.
La configuration PCI du système est visible par l'interface /proc et la commande lspci.

Remarques :

La commande lspci (et ses options) et la visualisation du fichier /proc/pci donneront sensiblement les mêmes informations.
Pour accèder aux informations complètes de l'espace de configuration des interfaces PCI, il faut utiliser la structure /proc/bus/pci. Un répertoire est créé pour chaque numéro de bus et un fichier pour chaque numéro de device sur le bus. Avec la commande od, on pourra alors obtenir un affichage en hexadécimal du contenu des registres. On peut aussi utiliser l'option -x dela commande lspci.


Précédent
Gestion des périphériques
Sommaire
 
Suivant
Programmation module
© 2002 for www.tvtsii.net by tv