Espace de configuration PCI - PCI configuration space

L'espace de configuration PCI est la manière sous-jacente par laquelle le PCI conventionnel , le PCI-X et le PCI Express effectuent la configuration automatique des cartes insérées dans leur bus.

Aperçu

Les périphériques PCI ont un ensemble de registres appelés espace de configuration et PCI Express introduit un espace de configuration étendu pour les périphériques. Les registres de l'espace de configuration sont mappés sur des emplacements mémoire. Les pilotes de périphériques et les logiciels de diagnostic doivent avoir accès à l'espace de configuration, et les systèmes d'exploitation utilisent généralement des API pour autoriser l'accès à l'espace de configuration des périphériques. Lorsque le système d'exploitation n'a pas de méthodes d'accès définies ou d'API pour les demandes d'espace de configuration mappées en mémoire, le pilote ou le logiciel de diagnostic a la charge d'accéder à l'espace de configuration d'une manière compatible avec les règles d'accès sous-jacentes du système d'exploitation. Dans tous les systèmes, les pilotes de périphérique sont encouragés à utiliser les API fournies par le système d'exploitation pour accéder à l'espace de configuration du périphérique.

Informations techniques

L'une des améliorations majeures du bus local PCI par rapport aux autres architectures d'E/S était son mécanisme de configuration. En plus des espaces normaux mappés en mémoire et des ports d'E/S, chaque fonction de périphérique sur le bus dispose d'un espace de configuration de 256 octets, adressable en connaissant le bus PCI huit bits, le périphérique cinq bits et trois numéros de fonction de bit pour l'appareil (communément appelés BDF ou B/D/F , comme abrégé de bus/device/function ). Cela permet jusqu'à 256 bus, chacun avec jusqu'à 32 périphériques, chacun prenant en charge huit fonctions. Une seule carte d'extension PCI peut répondre en tant que périphérique et doit implémenter au moins la fonction numéro zéro. Les 64 premiers octets de l'espace de configuration sont standardisés ; le reste est disponible à des fins définies par le fournisseur.

Afin de permettre à plus de parties de l'espace de configuration d'être standardisées sans entrer en conflit avec les utilisations existantes, il peut y avoir une liste de capacités définies dans les 192 octets restants de l'espace de configuration PCI. Chaque capacité a un octet qui décrit de quelle capacité il s'agit et un octet pour pointer vers la capacité suivante. Le nombre d'octets supplémentaires dépend de l'ID de capacité. Si des capacités sont utilisées, un bit dans le registre d' état est défini et un pointeur vers la première d'une liste liée de capacités est fourni dans le Cap. registre pointeur défini dans les registres standardisés.

PCI-X 2.0 et PCI Express ont introduit un espace de configuration étendu, jusqu'à 4096 octets. La seule partie normalisée de l'espace de configuration étendu est les quatre premiers octets à 0x100 qui sont le début d'une liste de capacités étendue. Les capacités étendues ressemblent beaucoup aux capacités normales, sauf qu'elles peuvent faire référence à n'importe quel octet de l'espace de configuration étendu (en utilisant 12 bits au lieu de huit), avoir un numéro de version de quatre bits et un ID de capacité de 16 bits. Les identifiants de capacité étendue se chevauchent avec les identifiants de capacité normaux, mais il n'y a aucun risque de confusion car ils figurent dans des listes séparées.

Registres standardisés

Image
Registres standard de l'en-tête d'espace de configuration PCI de type 0 (sans pont)

Les registres Device ID (DID) et Vendor ID (VID) identifient le périphérique (tel qu'un IC ) et sont communément appelés PCI ID . L'ID du fournisseur 16 bits est attribué par le PCI-SIG . L'ID de périphérique 16 bits est ensuite attribué par le fournisseur. Il existe un projet inactif pour collecter tous les ID de fournisseur et d'appareil connus. (Voir les liens externes ci-dessous.)

Le registre d' état est utilisé pour signaler les fonctionnalités prises en charge et si certains types d'erreurs se sont produits. Le registre de commande contient un masque binaire de fonctionnalités qui peuvent être activées et désactivées individuellement. Les valeurs du registre Header Type déterminent les différentes dispositions des 48 octets restants (64-16) de l'en-tête, en fonction de la fonction de l'appareil. C'est-à-dire les en-têtes de type 1 pour le complexe racine, les commutateurs et les ponts. Tapez ensuite 0 pour les points de terminaison. Le registre de taille de ligne de cache doit être programmé avant que l'appareil ne soit informé qu'il peut utiliser la transaction d'écriture et d'invalidation de la mémoire. Cela devrait normalement correspondre à la taille de la ligne de cache du processeur , mais le réglage correct dépend du système. Ce registre ne s'applique pas au PCI Express.

L' ID de sous-système (SSID) et l' ID de fournisseur de sous - système (SVID) différencient un modèle spécifique (comme une carte d'extension). Alors que l'ID du fournisseur est celui du fabricant du chipset , l'ID du fournisseur du sous-système est celui du fabricant de la carte. L'ID de sous-système est attribué par le fournisseur de sous-système à partir du même espace numérique que l'ID de périphérique. Par exemple, dans le cas des cartes réseau sans fil , le fabricant du chipset peut être Broadcom ou Atheros , et le fabricant de la carte peut être Netgear ou D-Link . En règle générale, la combinaison Vendor ID-Device ID désigne le pilote que l'hôte doit charger pour gérer le périphérique, car toutes les cartes avec la même combinaison VID:DID peuvent être gérées par le même pilote. La combinaison ID du fournisseur du sous-système et ID du sous-système identifie la carte, c'est-à-dire le type d'informations que le conducteur peut utiliser pour appliquer une modification mineure spécifique à la carte dans son fonctionnement.

Recensement des bus

Pour adresser un périphérique PCI, il doit être activé en étant mappé dans l'espace d'adressage du port d'E/S du système ou dans l'espace d'adressage mappé en mémoire. Le micrologiciel du système, les pilotes de périphérique ou le système d'exploitation programment les registres d'adresses de base (communément appelés BAR) pour informer le périphérique de son mappage d'adresses en écrivant des commandes de configuration sur le contrôleur PCI. Étant donné que tous les périphériques PCI sont dans un état inactif lors de la réinitialisation du système, aucune adresse ne leur sera attribuée par laquelle le système d'exploitation ou les pilotes de périphérique pourront communiquer avec eux. Soit le BIOS soit le système d'exploitation adresse géographiquement les slots PCI (par exemple, le premier slot PCI, le deuxième slot PCI, ou le troisième slot PCI, etc., sur la carte mère ) via le contrôleur PCI en utilisant l'IDSEL par slot (Initialization Device Select).

Bits de barre PCI
Morceaux La description Valeurs
Pour toutes les barres PCI
0 Type de région 0 = mémoire
1 = E/S
Pour les barres de mémoire
2-1 Localisable 0 = tout 32 bits
1 = < 1  Mo
2 = tout 64 bits
3 Prérécupérable 0 = non
1 = oui
31-4 Adresse de base naturellement aligné sur 16 octets
Pour les barres d'E/S
1 Réservé
31-2 Adresse de base aligné naturellement sur 4 octets

Puisqu'il n'y a pas de méthode directe pour le BIOS ou le système d'exploitation pour déterminer quels emplacements PCI ont des périphériques installés (ni pour déterminer quelles fonctions le périphérique implémente), le ou les bus PCI doivent être énumérés . L'énumération du bus est effectuée en tentant de lire l'ID du fournisseur et le registre de l'ID de périphérique (VID/DID) pour chaque combinaison de numéro de bus et de numéro de périphérique à la fonction #0 du périphérique. Notez que le numéro de périphérique, différent de DID, est simplement le numéro séquentiel d'un périphérique sur ce bus. De plus, après la détection d'un nouveau pont, un nouveau numéro de bus est défini et l'énumération des périphériques redémarre au numéro de périphérique zéro.

Si aucune réponse n'est reçue de la fonction #0 du périphérique, le maître du bus exécute un abandon et renvoie une valeur sur tous les bits ( FFFFFFFF en hexadécimal), qui est une valeur VID/DID invalide, ainsi un pilote de périphérique peut dire que le La combinaison bus/numéro_périphérique/fonction spécifiée (B/D/F) n'est pas présente. Ainsi, lorsqu'une lecture d'un ID de fonction de zéro pour un bus/dispositif donné provoque l'abandon du maître (initiateur), il faut alors supposer qu'aucun périphérique fonctionnel n'existe sur ce bus car les périphériques doivent implémenter la fonction numéro zéro. Dans ce cas, les lectures des numéros de fonctions restants (1–7) ne sont pas nécessaires car elles n'existeront pas non plus.

Lorsqu'une lecture vers une combinaison B/D/F spécifiée pour le registre d'ID de fournisseur réussit, un pilote de périphérique sait qu'elle existe ; il écrit tous sur ses BAR et relit la taille de mémoire demandée par l'appareil sous une forme codée. La conception implique que toutes les tailles d'espace d'adressage sont une puissance de deux et sont naturellement alignées.

À ce stade, le BIOS ou le système d'exploitation programmera les adresses de mémoire mappée et de port d'E/S dans le registre de configuration BAR de l'appareil. Ces adresses restent valides tant que le système reste allumé. Lors de la mise hors tension, tous ces paramètres sont perdus et la procédure est répétée la prochaine fois que le système est remis sous tension. Étant donné que tout ce processus est entièrement automatisé, l'utilisateur n'a pas à configurer manuellement tout matériel nouvellement ajouté en changeant les commutateurs DIP sur les cartes elles-mêmes. Cette découverte automatique de périphérique et cette affectation d'espace d'adressage sont la façon dont le plug-and-play est mis en œuvre.

Si un pont PCI-à-PCI est trouvé, le système doit affecter au bus PCI secondaire au-delà du pont un numéro de bus différent de zéro, puis énumérer les périphériques sur ce bus secondaire. Si plusieurs ponts PCI sont trouvés, la découverte se poursuit de manière récursive jusqu'à ce que toutes les combinaisons possibles domaine/bus/périphérique soient analysées.

Chaque fonction de périphérique PCI sans pont peut implémenter jusqu'à 6 barres, chacune pouvant répondre à différentes adresses dans le port d'E/S et l'espace d'adressage mappé en mémoire. Chaque BAR décrit une région dont la taille est comprise entre 16 octets et 2 gigaoctets, située en dessous de la limite d'espace d'adressage de 4 gigaoctets. Si une plate-forme prend en charge l'option "Above 4G" dans le micrologiciel du système, des barres de 64 bits peuvent être utilisées.

Un périphérique PCI peut également avoir une ROM en option qui peut contenir un code de pilote ou des informations de configuration.

Implémentation matérielle

Lors de l'exécution d'un accès à l' espace de configuration , un périphérique PCI ne décode pas l'adresse pour déterminer s'il doit répondre, mais examine à la place le signal de sélection de périphérique d'initialisation (IDSEL). Il existe une méthode d'activation unique à l'échelle du système pour chaque signal IDSEL. Le périphérique PCI doit décoder uniquement les 11 bits de poids faible de l'espace d'adressage (AD[10] à AD[0]) des signaux d'adresse/de données, et peut ignorer le décodage des 21 signaux A/N de poids fort (AD[31] à AD[11]) car une implémentation d'accès à l' espace de configuration a la broche IDSEL de chaque emplacement connectée à une ligne d'adresse/données de poids fort différente AD[11] à AD[31]. Le signal IDSEL est une broche différente pour chaque emplacement de périphérique/adaptateur PCI.

Pour configurer la carte dans l'emplacement n , le pont de bus PCI effectue un cycle d'accès à l'espace de configuration avec le registre du périphérique PCI à adresser sur les lignes AD[7:2] (AD[1:0] sont toujours à zéro car les registres sont des doubles mots (32 bits)) et le numéro de fonction PCI spécifié sur les bits AD[10:8], tous les bits d'ordre supérieur étant des zéros à l'exception de AD[ n +11] étant utilisés comme signal IDSEL sur un emplacement donné.

Pour réduire la charge électrique du bus AD[] critique en termes de synchronisation (et donc sensible à la charge électrique), le signal IDSEL sur le connecteur d'emplacement PCI est généralement connecté à sa broche AD[ n +11] assignée via une résistance. Cela amène le signal IDSEL du PCI à atteindre sa condition active plus lentement que les autres signaux de bus PCI (en raison de la constante de temps RC de la résistance et de la capacité d'entrée de la broche IDSEL). Ainsi, les accès à l' espace de configuration sont effectués plus lentement pour laisser le temps au signal IDSEL d'atteindre un niveau valide.

L'analyse sur le bus est effectuée sur la plate-forme Intel en accédant à deux ports standardisés définis . Ces ports sont le port d'E/S d' adresse d'espace de configuration ( 0xCF8 ) et le port d'E/S de données d'espace de configuration ( 0xCFC ). La valeur écrite sur le port d'E/S d' adresse de l'espace de configuration est créée en combinant les valeurs B/D/F et la valeur d'adresse des registres dans un mot de 32 bits.

Implémentation du logiciel

Les lectures et écritures de configuration peuvent être initiées à partir de la CPU de deux manières : une méthode héritée via les adresses d'E/S 0xCF8 et 0xCFC et une autre appelée configuration mappée en mémoire.

La méthode héritée était présente dans le PCI d'origine et s'appelle Mécanisme d'accès à la configuration (CAM). Il permet d'atteindre indirectement 256 octets de l'espace d'adressage d'un périphérique via deux registres 32 bits appelés PCI CONFIG_ADDRESS et PCI CONFIG_DATA. Ces registres se trouvent aux adresses 0xCF8 et 0xCFC dans l'espace d'adressage des E/S x86. Par exemple, un pilote logiciel (firmware, noyau du système d'exploitation ou pilote de noyau) peut utiliser ces registres pour configurer un périphérique PCI en écrivant l'adresse du registre du périphérique dans CONFIG_ADDRESS, et en mettant les données censées être écrites sur le périphérique dans CONFIG_DATA. Étant donné que ce processus nécessite une écriture dans un registre afin d'écrire le registre de l'appareil, il est appelé "indirection".

Le format de CONFIG_ADDRESS est le suivant :

0x80000000 | bus << 16 | device << 11 | function <<  8 | offset

Comme expliqué précédemment, l'adressage d'un appareil via le bus, l'appareil et la fonction (BDF) est également appelé « adressage géographique d'un appareil ». Voir arch/x86/pci/early.cdans le code du noyau Linux pour un exemple de code qui utilise l'adressage géographique.

Lorsque l'espace de configuration étendu est utilisé sur certains processeurs AMD, les bits supplémentaires 11:8 de l'offset sont écrits dans les bits 27:24 du registre CONFIG_ADDRESS :

0x80000000 | (offset & 0xf00) << 16 | bus << 16 | device << 11 | function <<  8 | (offset & 0xff)

La deuxième méthode a été créée pour PCI Express. C'est ce qu'on appelle le mécanisme d'accès à la configuration amélioré (ECAM). Il étend l'espace de configuration du périphérique à 4 Ko, les 256 octets inférieurs chevauchant l'espace de configuration d'origine (héritage) dans PCI. La partie de l'espace adressable est "volée" de sorte que les accès depuis le CPU n'aillent pas en mémoire mais atteignent plutôt un périphérique donné dans la fabric PCI Express. Lors de l'initialisation du système, le micrologiciel détermine l'adresse de base de cette région d'adresses « volée » et la communique au complexe racine et au système d'exploitation. Cette méthode de communication est spécifique à l'implémentation et n'est pas définie dans la spécification PCI Express.

Chaque périphérique dispose de son propre espace de 4 Ko et les informations de chaque périphérique sont accessibles via un simple tableau de dev[bus][device][function]sorte que 256 Mo d'espace physique contigu soient "volés" pour cette utilisation (256 bus × 32 périphériques × 8 fonctions × 4 Ko = 256 Mo). L'adresse physique de base de cette baie n'est pas spécifiée. Par exemple, sur les systèmes x86 modernes, les tables ACPI contiennent les informations nécessaires.

Voir également

Les références

Liens externes