Gérer les cartes PnP

De nos jours, pratiquement toutes les nouvelles cartes internes sont Plug-and-Play. Du coup, la configuration des ressources bus devraient être dans la plupart des cas entièrement automatique. Si un périphérique ne fonctionne pas, vérifiez s'il a été détecté, par exemple en redémarrant. Si le pilote de périphérique ne peut pas configurer les ressources, alors probablement une ou plus des méthodes du 2.6 le feront :

N'importe lequel configurera les ressources bus au niveau matériel mais seul le premier (voire le second) indiquera au pilote ce qui a été fait. La façon dont le pilote est informé dépend du pilote. Vous pouvez avoir besoin de faire quelque chose pour l'informer. Voir la section intitulée « Indiquer au pilote la configuration ?? ».

Les pilotes de périphériques (avec l'aide de fonctions du noyau) peuvent être écrits pour utiliser des méthodes PnP pour configurer les ressources bus du matériel mais seulement pour le périphérique qu'ils contrôlent. Mais beaucoup de pilotes de périphériques acceptent directement ce que le BIOS ou Linux a configuré et utilise le code fourni par le noyau pour découvrir comme ce périphérique a été configuré. Comme le pilote a vérifié la configuration et la certainement reconfiguré, il connaît de façon évidente la configuration et il n'y a aucun besoin de lui donner cette information. C'est dont la façon la plus simple de le faire car vous n'avez rien à faire si le pilote fait tout.

Si vous avez un matériel datant d'avant l'ISA PnP, le logiciel PnP Linux pourrait ne pas le savoir et pourrait ne pas connaître les ressources bus qu'il réclame. Donc, il pourrait allouer de façon erronée des ressources dont cet ancien matériel a besoin à un autre périphérique. Le résultat est un conflit de ressources mais il existe un moyen de l'éviter. Vous pouvez réserver les ressources dont cette ancienne carte ISA a besoin en configurant le BIOS au démarrage (habituellement), au module isa-pnp ou au noyau (si le support de PnP est intégré dans le noyau). Par exemple, pour réserver l'IRQ 5, donnez cet argument au module isa-pnp (ou au noyau) : isapnp_reserve_irq=5. Voir le Guide pratique sur l'invite de démarrage (BootPrompt-HOWTO). Au lieu de ..._irq, il existe aussi _io, _dma et _mem.

Pour les périphériques PCI, la plupart des pilotes configureront PnP. Malheureusement, un pilote peut récupérer des ressources bus nécessaires à d'autres périphériques (mais non alloués à eux par le noyau). Donc, un noyau Linux PnP plus perfectionné serait meilleur là où le noyau fait l'allocation pour toutes les demandes envoyées. Voir la section intitulée « Comment Linux gère-t-il le PnP ».

Depuis le noyau 2.6, il existe une nouvelle façon pour que l'utilisateur configure les ressources grâce au répertoire /sys. Mais, jusqu'à août 2004, il ne peut pas être utilisé pour une configuration dans la plupart des cas. Voir la section intitulée « Le répertoire /sys ».

Si vous avez un BIOS PnP, il peut configurer le matériel. Si le pilote ne peut pas le faire, le BIOS le peut probablement. Ceci veut dire que votre BIOS lit les besoins en ressources de tous les périphériques et les configure (en leur allouant les ressources bus). C'est un substitut pour l'OS PnP sauf que le BIOS ne peut faire correspondre les pilotes avec leur périphériques et ne peut pas non plus indiquer aux pilotes la façon dont il a configuré les périphériques. Il devrait normalement utiliser la configuration enregistrée dans sa mémoire non volatile (ESCD). S'il trouve un nouveau périphérique ou s'il existe un conflit, le BIOS devra effectuer les changements nécessaires et pourrait ne pas utiliser la même configuration que celle de l'ESCD. Dans ce cas, il devra mettre à jour l'ESCD pour refléter la situation.

Votre BIOS doit gérer une telle configuration, mais il existe des cas où il ne le fait pas correctement ou pas complètement. Le BIOS a aussi besoin de savoir via le menu CMOS si le système d'exploitation est PnP. Alors que la plupart des pilotes de périphériques seront capables de détecter automatiquement ce que le BIOS a fait, dans certains cas, vous aurez besoin de le déterminer (ce qui n'est pas toujours facile). Voir la section intitulée « Comment puis-je trouver les périphériques et comment sont-ils configurés ? ». Un avantage possible à laisser le BIOS faire cette configuration est qu'il fait son boulot avant de lancer Linux, donc c'est fait très tôt dans le processus de démarrage.

La plupart des BIOS créés après 1996 ?? peuvent configurer les ressources des bus PCI et ISA. Mais, il a été dit que certains anciens BIOS peuvent uniquement s'occuper du PCI. Pour essayer d'en savoir plus sur votre BIOS, cherchez sur le web. Merci de ne pas me demander car je n'ai pas toutes les données là-dessus. Les détails du BIOS que vous souhaitez connaître peuvent être difficiles à trouver. Certains BIOS pourraient avoir des capacités PnP minimales et attendre que le système d'exploitation fasse la configuration PnP. Si cela arrive, vous devrez soit trouver une autre méthode soit essayer d'enregistrer les informations dans la base de données ESCD si le BIOS en a une. Voir la prochaine section.

Le BIOS maintient une base de données non volatile contenant la configuration PnP qu'il essaiera d'utiliser (si vous aviez indiqué qu'il ne s'agit pas d'un système d'exploitation PnP). Elle s'appelle l'ESCD (acronyme pour Extended System Configuration Data, soit Données pour une Configuration Étendue du Système). Encore une fois, l'ESCD est optionnel mais la plupart des BIOS PnP en disposent. L'ESCD enregistre non seulement la configuration des ressources pour les périphériques PnP mais aussi celle des périphériques non PnP (et les indique en tant que tels) pour éviter les conflits. Les données de l'ESCD sont habituellement enregistrées sur un composant et restent intactes lorsque la machine est arrêtée, mais c'est parfois stocké sur un disque dur ??

L'ESCD a pour but de conserver la dernière configuration utilisée. Mais comme Linux peut modifier la configuration des périphériques (en incluant l'utilisateur avec les outils PCI ou isapnp), l'ESCD ne sera pas au courant de cette modification et ne sauvegardera pas cette configuration. Un bon système d'exploitation PnP devrait mettre à jour l'ESCD, pour que les informations qui y sont stockées puissent être utilisées par un système d'exploitation non PnP (comme un Linux standard). MS Windows 9x ne le fait que dans certains précis. Voir la section intitulée « Utiliser Windows pour configurer l'ESCD ». À partir du noyau 2.6, Linux est capable de modifier l'ESCD mais cela n'est pas encore utilisé (août 2004).

Pour utiliser ce qui a été enregistré dans l'ESCD, assurez-vous d'avoir bien spécifié que l'OS n'est pas PnP dans le CMOS du BIOS. Par la suite, à chaque fois que le BIOS démarre (avant que l'OS Linux ne soit chargé), il devrait tout configurer de cette façon. Si le BIOS détecte une nouvelle carte PnP non indiquée dans l'ESCD, alors il allouera des ressources bus à la carte et mettra à jour l'ESCD. Il pourrait même changer les ressources bus assignées aux cartes PnP existantes et modifier l'ESCD de manière concordante.

Un programme vous permet de visualiser le contenu de l'ESCD. Il affiche les IRQ, les adresses d'entrées/sorties, et cætera mais les noms de périphériques manquent (seulement les numéros d'identifiant des périphériques EISA). Il est disponible sur l'index de /home/gunther.mayer/lsescd.

Si chaque périphérique sauvegardait sa dernière configuration au niveau du matériel, la configuration matérielle ne serait pas nécessaire à chaque démarrage du PC. Mais cela ne fonctionne pas ainsi. Donc, toutes les données de l'ESCD ont besoin d'être actualisées si vous utilisez le BIOS pour PnP. Il existe des BIOS ne disposant pas d'ESCD mais ayant une mémoire non volatile pour stocker des informations concernant l'attribution des ressources bus aux cartes non PnP. Beaucoup de BIOS disposent des deux.

Éventuellement, Linux pourrait initialiser l'ESCD. Depuis Linux 2.6, une fonction du nouveau code pourrait le faire si le noyau a été compilé avec PNPBIOS. Mais elle reste pour l'instant inutilisée.

Si le BIOS ne configure pas l'ESCD de la façon souhaitée (ou de la bonne façon), alors il serait bien de disposer d'un utilitaire Linux pour le faire. Donc, vous pourriez vouloir utiliser Windows (si vous l'avez sur le même PC) pour faire cela.

Il existe trois façons d'utiliser Windows pour tenter de modifier l'ESCD. La première est d'utiliser l'utilitaire ICU pour DOS ou Windows 3.x. Il devrait aussi fonctionner pour Windows 9x/2k ?? Une autre façon est de configurer les périphériques manuellement (« en forçant ») sous Windows 9x/2k de façon à ce que Windows enregistre les informations dans l'ESCD lorsque Windows est arrêté normalement. La troisième façon est possible uniquement pour les périphériques non PnP. Si Windows connaît quelque chose sur eux, notamment quelles ressources bus ils utilisent, alors Windows enregistrera cette information dans l'ESCD.

Si les périphériques PnP sont configurés automatiquement par Windows sans que l'utilisateur ait besoin de forcer cette reconnaissance, alors ces paramétrages ne se trouveront probablement pas dans l'ESCD. Bien sûr, Windows pourrait bien décider de lui-même de configurer ce qui est enregistré dans l'ESCD, ce qui pourrait aboutir au même par coïncidence.

Windows 9x est un système d'exploitation PnP et configure automatiquement via PnP les périphériques. Il maintient leur propre base de données PnP dans la base de registre (fichiers binaires de Windows). Beaucoup d'autres données de configuration résident dans la base de registre en plus des ressources bus PnP. Il y a à la fois une configuration des ressources PnP actuelles et une autre (peut-être la même) enregistrée sur le disque dur. Pour voir ça avec Windows 98, ou pour forcer l'enregistrement des modifications, utilisez le gestionnaire des périphériques.

Dans Windows 98, il existe deux façons d'arriver au gestionnaire des périphériques :

Ensuite, dans ce gestionnaire, vous sélectionnez un périphérique (parfois un processus en plusieurs étapes s'il existe plusieurs périphériques de la même classe). Ensuite, cliquez sur « Propriétés » puis « Ressources ». Pour essayer de modifier la configuration des ressources manuellement, décochez « Utilisez la configuration automatique » puis cliquez sur « Changer la configuration ». Maintenant, essayez de modifier les paramétrages. Il peut ne pas vous laisser les modifier. S'il vous le permet, vous avez « forcé » un changement. Du coup, un message devrait vous avertir que vous avez forcé cette modification. Si vous souhaitez garder le paramétrage existant affiché par Windows, mais que vous voulez forcer, alors vous devrez forcer un autre changement et de nouveau forcer sa modification en sa valeur précédente.

Pour voir ce qui a été forcé sous Windows 98, regardez la liste des matériels « forcés » : Démarrer --> Programme --> Accessoires --> Outils système --> Information système --> Ressources matérielles --> Matériel forcé. Lorsque vous « forcez » un changement des ressources bus dans Windows, il devrait enregistrer votre modification dans l'ESCD (à condition que vous ayez quitté Windows normalement). À partir de la fenêtre « Informations système », vous pouvez aussi voir comment les IRQ et les ports d'entrées/sorties ont été alloués par Windows.

Même si Windows ne montre aucun conflit des ressources bus, il peut exister un conflit sous Linux. Ceci est dû au fait que Windows peut affecter des ressources bus différentes de celles de l'ESCD. Dans le cas rare où les périphériques sous Windows sont soit non PnP soit « forcés », alors la configuration Windows et celle de l'ESCD devraient être les mêmes.

Les périphériques PCI sont PnP à la base donc cela ne peut pas être désactivé. Mais quelques périphériques ISA ont des options pour désactiver PnP par l'intermédiaire de cavaliers ou en lançant un programme Windows fourni avec le périphérique (configuration logicielle). Si le pilote du périphérique ne peut pas le configurer, ceci évitera la tâche probablement compliquée de la configuration PnP. N'oubliez pas de dire au BIOS que ces ressources bus sont réservées. Mais comme le support de Linux pour le PnP a été amélioré, vous ne voulez généralement pas désactiver PnP. Voici quelques arguments pour lesquels vous ne voudrez pas désactiver PnP :

Une fois vos périphériques configurés sans PnP, ils ne peuvent plus être configurés par un logiciel PnP ou par un BIOS PnP (jusqu'à ce que vous changiez les cavaliers ou utilisiez le logiciel de configuration Dos/Windows).

Le programme isapnp est utilisé uniquement pour les périphériques PnP du bus ISA (donc non PCI). Il était vraiment nécessaire avant les noyaux 2.4. Avec le noyau 2.4, qui a apporté des fonctionnalités permettant aux pilotes de gérer le PnP sur le bus ISA, le programme isapnp devient moins important. De plus, le BIOS pourrait configurer ISA PnP de manière satisfaisante. Mais, le module isa-pnp (ou l'équivalent intégré au noyau) est déjà très satisfaisant car de nombreux pilotes de périphériques ISA l'appellent pour configurer les ressources du bus. Avant le noyau 2.6, cela résultait en un « fichier » /proc/isapnp pouvant être utilisé pour configurer manuellement (voir isapnp.txt dans la documentation du noyau).

Dans certains cas, les distributions Linux ont été configurées pour lancer isapnp automatiquement au démarrage. Il est toujours utilisé en 2004 mais il n'est pas réellement nécessaire si les pilotes de périphériques fonctionnent bien. Si vous avez besoin de le configurer vous-même, la grande partie de la documentation d'isapnp est difficile à comprendre sauf si vous possédez des notions de base de PnP. Ce guide pratique devrait vous aider à le comprendre, ainsi que la FAQ qui accompagne isapnp. Lancer le programme isapnp au démarrage vous permettra de configurer ces périphériques suivant les valeurs spécifiées dans /etc/isapnp.conf. Il est possible de créer ce fichier de configuration automatiquement mais vous devrez alors l'éditer manuellement pour choisir entre les différentes options. Puis pour que le pilote connaisse ces ressources, vous avez souvent besoin de les spécifier en tant que paramètres pour les modules appropriés (pilotes). Ceci se fait avec des fichiers de configuration, généralement dans le répertoire /etc. Cherchez-y des fichiers nommés mod*, et cætera. Si le pilote est intégré au noyau, alors ils pourraient parfois être donnés comme paramètre du noyau. Voir le guide pratique des options de démarrage.

Avec isapnp, il existait un risque qu'un pilote de périphérique, intégré au noyau, soit lancé trop tôt, avant qu'isapnp n'ait pu configurer les adresses, et cætera au niveau matériel. En conséquence, le pilote de périphérique ne serait plus capable de trouver le périphérique. Le pilote essaie la bonne adresse mais cette adresse n'est pas configurée au niveau matériel. Cela est-il toujours un problème ??

Si votre distribution Linux a automatiquement installé isapnptools, isapnp est probablement lancé au démarrage. Dans ce cas, il ne vous reste qu'à éditer /etc/isapnp.conf suivant man isapnp.conf. Notez que cela revient à configurer manuellement PnP car vous prendrez les décisions sur la façon de configurer lors de l'édition du fichier de configuration.

Si le fichier de configuration est mauvais ou n'existe pas, vous pouvez utiliser le programme pnpdump pour vous aider à créer le fichier de configuration. Il crée pour vous un fichier de configuration mais vous devrez l'éditer avec intelligence avant de l'utiliser. Il contient quelques commentaires pour vous aider. Alors que le BIOS pourrait aussi avoir configuré les périphériques ISA (si vous lui avez dit que vous ne disposez pas de système d'exploitation PnP), isapnp le refera.

La terminologie utilisée dans le fichier /etc/isapnp.conf peut sembler étrange au début. Par exemple, pour une adresse d'entrée/sortie 0x3e8, vous pourriez voir « (IO 0 (BASE 0x3e8)) » à la place. « IO 0 » veut dire qu'il s'agit de la première plage d'adresses que ce périphérique utilise. Une autre façon d'exprimer ceci serait : « IO[0] = 0x3e8 » mais isapnp ne le fait pas de cette façon. « IO 1 » voudrait dire qu'il s'agit de la deuxième plage d'adresse utilisée par ce périphérique, et cætera. « INT 0 » a une signification similaire mais pour les IRQ (interruptions). Une carte simple peut contenir plusieurs périphériques physiques mais l'explication ci-dessus était seulement pour un des périphériques.

Le paquetage des utilitaires PCI (pciutils, quelque fois appelé « pcitools ») vous permet de configurer manuellement via PnP le bus PCI (avec difficulté). lspci ou scanpci liste les ressources bus alors que setpci enregistre les allocations des ressources (sauf les IRQ) dans les périphériques physiques. Il semble que setpci soit principalement utilisé dans des scripts et en fait, vous aurez besoin de comprendre le détail des registres de configuration du PCI pour pouvoir l'utiliser. Ce thème n'est pas expliqué ici, et pas plus dans la page de manuel de setpci.

Les gens l'ont utilisé pour configurer les périphériques PCI dont le pilote a échoué dans cette action. Un exemple est disponible dans le guide pratique sur les modems et le guide pratique sur les ports séries dans la sous-section « PCI : Activer un port désactivé ». Néanmoins, activer un périphérique n'est d'aucune utilité si vous n'avez pas de pilote fonctionnel pour ce périphérique.

Cette méthode utilise MS Windows pour configurer et devrait être utilisée seulement si tout le reste échoue. Si vous avez Windows 9x (ou 2k) sur le même PC, alors lancez simplement Windows et laissez-le configurer PnP. Puis lancez Linux à partir de Windows (ou DOS) en utilisant, par exemple, loadlin.exe. Il peut y avoir un problème avec les IRQ pour les périphériques PCI. Quand Windows s'arrête (sans messages) pour laisser la place à Linux, il pourrait écraser l'IRQ (en y mettant 0) qui est stocké dans un des registres de configuration du périphérique PCI. Linux se plaindra de trouver une IRQ 0.

Ce qu'on vient d'aborder arrive lorsque vous lancez Linux en utilisant un raccourci (fichier PIF). Mais un moyen de contourner ce problème est connu si vous utilisez toujours le raccourci PIF. Un raccourci est en quelque sorte l'équivalent du lien symbolique sous Linux, mais il est en fait plus que ça car il est paramétrable. Pour lancer Linux, à partir de DOS, vous créez un fichier batch (script) qui lance Linux. (Le programme qui lance Linux est dans le paquet appelé loadlin.) Ensuite, créez un raccourci PIF vers ce fichier batch et allez dans la fenêtre des propriétés du raccourci. Sélectionnez « Avancé », puis vérifiez que le « mode MS-DOS » est bien coché.

Maintenant, voici une astuce empêchant de mettre à zéro les IRQ PCI. Cochez « Spécifier une nouvelle configuration MS-DOS ». Ensuite, soit vous acceptez la configuration par défaut qui vous est proposée soit vous cliquez sur « Configuration » pour la modifier. Maintenant, lorsque vous lancerez Linux en cliquant sur le raccourci, des nouveaux fichiers de configurations (config.sys et autoexec.bat) seront créés pour votre nouvelle configuration.

Les anciens fichiers sont enregistrés comme Config.wos et Autoexec.wos. Une fois que vous avez terminé d'utiliser Linux et que vous avez arrêté votre PC, vous aurez encore besoin de ces fichiers pour pouvoir lancer DIS la prochaine fois que vous démarrerez votre PC. Vous devez vous assurer que les noms redeviennent *.sys et *.bat. Lorsque vous quittez Windows/DOS pour aller sous Linux, Windows s'attend que, une fois que vous avez fini avec Linux, vous retourniez à Windows pour que celui-ci puisse restaurer ces fichiers avec leur noms originaux. Mais ceci n'arrivera pas car lorsque vous quitterez Linux, vous éteindrez votre PC et ne retournerez pas sous Windows. Donc, comment renommer ces fichiers ? C'est facile, placez ces commandes dans votre fichier batch de lancement de Linux pour qu'il renomme les fichiers. Mettez ces commandes de renommage dans votre fichier batch juste avant la ligne qui charge Linux.

De la même façon, il a été rapporté que vous devez cliquer sur l'onglet « Général » (de la fenêtre « Propriétés » de votre raccourci) et cochez « Lecture seule ». Sinon, Windows pourrait remettre à zéro les « Paramétrages avancées » en « Utilisez la configuration MS-DOS courante » et les IRQ PCI se retrouveraient à zéro. Comme Windows efface les IRQ lorsque vous utilisez la configuration MS-DOS courante mais il n'efface pas une nouvelle configuration (qui peut configurer tout de manière identique à l'ancienne configuration). Windows ne semble pas très cohérent.