Interruptions PCI

Chaque périphérique PCI qui a besoin d'une interruption vient avec une interruption PCI fixe qui ne peut pas être modifié. Elle est désigné par un numéro de slot et une lettre (A, B, C ou D), par exemple 3:B. Mais, cette interruption PCI est redirigée vers un numéro d'interruption ISA, comme par exemple 21 pour un composant sur la carte mère.

Ce routage est réalisé par un routeur programmable d'interruptions (PIR, acronyme de programmable interrupt router). Autrement, une ligne d'interruption pourrait être routée directement (sans aucun PIR). Si un PIR est présent, il peut être programmé par le BIOS ou par Linux. Donc, l'interruption d'un periphérique PCI peut quelque fois être modifiée, non pas en envoyant l'interruption sur un fil différent, mais en modifiant le routage d'un envoi sur ce film en programmant le PIR. Quand le routage est modifié, l'interruption fournie par ce nouveau routage est écrit dans un registre de configuration situé dans le composant du périphérique.

Avant l'arrivée du bus PCI, les PC utilisaient le bus ISA. Ensuite, lors de la transition vers le nouveau bus PCI, les PC utilisaient les bus ISA et PCI. Le bus ISA est fait de telle façon que toutes les lignes d'interruption arrivent sur chaque carte, donc toute carte peut modifier son numéro d'IRQ tout simplement en envoyant son signal d'interruption sur la ligne souhaitée. Tous les signaux d'interruption étaient envoyés au contrôleur d'interruption qui envoyait ensuite un signal au processeur pour lui indiquer de stopper temporairement son travail et de lancer le code du pilote pour répondre à l'interruption.

Quand le PCI est apparu, la solution simple était d'établir une correspondance entre les interruptions PCI et les interruptions ISA qui n'étaient pas utilisées. Ceci nécessite l'utilisation du PIR, routeur programmable d'interruptions. Ce routeur réalise la correspondance. Comme il n'y avait que 15 interruptions, il était commun de placer plusieurs périphériques PCI sur les quelques interruptions disponibles. Résoudre ce problème est simple : proposer un nouveau matériel pour augmenter le nombre d'interruptions. Le résultat est l'APIC. Son adoption a été lente car la capacité du bus PCI à partager les interruptions a diminué le problème. En fait, l'APIC a été principalement utilisé avec les machines bi-processeurs.

Un APIC peut fournir (suivant le modèle) 16, 24, 32 ou 64 interruptions, etc. Il peut aussi gérer le routage d'interruptions d'un processeur vers un autre. Voir le fichier « IO-APIC » dans le répertoire i386 de la documentation du noyau et le guide pratique sur l'ACPI. Ne confondez pas APIC avec ACPI (Configuration avancée et interface pour la gestion d'énergie) qui peut être utilisé par le noyau pour configurer l'APIC.

Le contrôleur APIC actuel qui est connecté sur les lignes d'interruptions est un APIC I/O (ou IO-APIC ou IOAPIC). En utilisant plus d'un IO-APIC, on peut obtenir plus d'interruptions et elles sont numérotées de façon à être uniques. Par exemple, le premier contrôleur peut les numéroter de 0 à 23 et le second les appelera de 24 à 47, ce qui donne 48 interruptions numérotées de 0 à 47. Mais certaines personnes ont des numéros d'interruptions hauts. Se pourrait-il que le deuxième IO-APIC commence la numérotation avec un numéro de base haut, laissant ainsi beaucoup d'IRQ inexistants. ?

En plus des IO-APIC, il existe des APIC locaux (LAPIC) qui font partie de chaque processeur. L'IO-APIC travaille en communiquant avec les LAPIC compris dans les processeurs.

Quand APIC a été introduit, les anciens PIC ISA étaient aussi conservés en laissant le choix d'utiliser ou non l'APIC ou le PIC ISA (qui est quelque fois appelé PIC ou XT-PIC dans /proc/interrupts ; le XT vient du PC XT d'IBM qui était le second modèle de PC d'IBM en 1983). Il est possible de dire au noyau (sur la ligne de commande du noyau) de ne pas utiliser APIC auquel cas il utilisera le vieux XT-PIC s'il est disponible. Comme l'APIC peut avoir plus d'interruptions que les 15 fournies par XT-PIC, il pourrait y avoir des problèmes ??

Pour savoir si vous utilisez PIC ou APIC, regardez dans /proc/interrupts. Si vous voyez XT-PIC pour l'IRQ 2 seule et IO-APIC pour les autres, cela pourrait signifier que vous avez l'ancien XT-PIC mais qu'il n'est pas actuellement utilisé. En fait, l'IRQ 2 est utilisé pour la communication entre les deux anciens XT-PIC juste au cas où vous en auriez besoin après avoir désactiver l'APIC. Deux XT-PIC sont nécessaires car chacun supportent seulement huit interruptions.

Un autre nouveau développement concerne les interruptions signalées par message (MSI, acronyme de Message Signalled Interrupts (MSI) où l'interruption est juste un message envoyé à une adresse spéciale sur le bus principal de l'ordinateur (pas de ligne d'interruption nécessaire). Mais le périphérique qui envoie un tel message doit tout d'abord obtenir le contrôle du bus principal de façon à ce qu'il puisse envoyer le message d'interruption. Un tel message contient plus d'informations que « J'envoie une interruption ». Il contient un index pour l'adresse du programme qui a besoin d'être exécuté pour remplir la mission de l'IRQ. Ce nombre, par exemple 3, signifie que le processeur trouve l'adresse à laquelle il doit se rendre dans le troisième élément d'une table spéciale connue du processeur.

Comme le matériel du périphérique doit connaître MSI pour que le périphérique utilise MSI, il est fréquent que certains périphériques utilisent MSI alors que d'autres utilisent les interruptions traditionnelles. Since for a device to use MSI the device hardware must support MSI, Les méthodes conventionnelles du support matériel des interruptions (appelées INTx) seront donc certainement présentes pendant longtemps encore. Les MSI ont des numéros d'interruption comme les interruptions INTx mais ces nombres sont souvent trop grands pour éviter toute réutilisation des nombres des interruptions INTx.

Les interruptions PCI peuvent être partagées, signifiant que deux périphériques voire plus utilisent la même IRQ. C'est faisable, il est généralement préférable de ne pas les partager. Le partage ne fonctionne pas bien pour les très anciens matériels PCI (avant 1995 ?) et pour les matériels PCI défectueux dès l'usine (ils ont été créés ainsi). Par exemple, si un périphérique PCI sur l'IRQ 9 réclamait par erreur que toute IRQ 9 était pour lui, alors les autres périphériques utilisant l'IRQ 9 verraient toutes leurs demandes d'interruption ignorées. Sans partage, ce problème est évité.

Pour un exemple de partage d'une même IRQ entre deux périphériques PCI, voir Partage d'interruption PCI. Cette capacité de partage est intégrée au matériel et tous les pilotes de périphériques sont supposés la supporter. Notez que vous ne pouvez pas habituellement partager la même interruption entre le bus PCI et le bus ISA.

Certaines informations sont fournies par les messages au démarrage. Elles sont visibles grâce à l'outil « dmesg ». Les façons de rechercher les tables impliquent du logiciel que vous pourriez ne pas avoir (ou qui n'existe pas encore). Pour vérifier le routage qu'effectue PCI vers les 16 interruptions ISA, utiliser « pirtool » qui affiche la table de routage $PIR. Si vous avez un APIC avec un routage en dur (pas de PIR), utiliser « mptable » pour rechercher dans la table MP. Pour un APIC routable, des méthodes ACPI _PRT sont utilisables pour accéder à une table (mais je ne sais pas si un outil en ligne de commande existe pour cela ?)

Des informations techniques détaillées sur les interruptions sont disponibles, par exemple « Les interruptions PCI pour les machines x86 sous FreeBSD. Microsoft a un document intitulé « L'importance de l'implémentation des sous-systèmes d'interruptions basées sur APIC sur les PC mono-processeur" ».