2009-12-01 25 views
12

Je recherche un appel en mode noyau que je peux faire depuis un pilote, un utilitaire utilisateur ou un appel système qui demandera au noyau de regarder le bus PCI et soit de relancer complètement son initialisation, soit d'initialiser un appareil spécifique. Plus précisément, j'ai besoin du noyau pour reconnaître un périphérique ajouté au bus après le démarrage, puis configurer son espace d'adressage, son interruption et d'autres paramètres de configuration, puis activer le périphérique pour pouvoir charger le pilote (à moins que tout cela se produit dans le cadre de la charge du conducteur).Existe-t-il un moyen de demander au noyau Linux de réexécuter son code d'initialisation PCI?

Je suis coincé sur le noyau de la série 2.4.x pour cela, et je travaille actuellement avec 2.4.20, mais je passerai à 2.4.37 si c'est important. La distribution est une Red Hat 7.3 dépouillée fonctionnant dans un disque RAM, mais je peux ajouter les outils nécessaires pour que cela fonctionne (à condition qu'ils jouent bien avec la série 2.4).

Si un peu d'arrière-plan permettait de clarifier ce que j'essaie de faire: D'un démarrage à froid, une fois sous Linux, j'utilise GPIO pour programmer un FPGA. Une partie du FPGA, une fois programmée, implémente un simple périphérique PCI. Actuellement, après avoir programmé le FPGA, je redémarre le système et Linux reconnaît l'appareil après son lancement et charge le pilote pour cela.

Au lieu d'avoir besoin que le redémarrage, je voudrais simplement demander au noyau de faire ce qu'il fait pendant le démarrage pour trouver les périphériques PCI (je le noyau configuré pour trouver les périphériques PCI lui-même, au lieu de demander le BIOS pour cette information, donc le BIOS n'aura pas besoin de connaître cet appareil (j'espère)).

Je crois que Linux est capable de voir l'appareil après qu'il est programmé mais avant un redémarrage, parce que scanpci montrera l'appareil après que je l'ai programmé, comme le fera lspci -H 1. J'ai juste besoin d'un moyen de l'obtenir en /proc/pci, configuré et activé.

+2

Vous devriez vous diriger vers le site "sister": http://serverfault.com/ et demander là. Ceci est pour les problèmes liés au codage, votre problème exact semble être plus de sysadmin liés afin qu'ils puissent vous aider plus vite/mieux. – Stan

Répondre

2

http://www.linuxjournal.com/article/5633 suggère que vous devriez être capable de le faire avec les noyaux 2.4 en utilisant pcihpfs.

Si cela ne fonctionne pas, peut-être que le pilote ne prend pas en charge hotplug?

3

Vous pouvez accélérer le redémarrage avec kexec, si vous ne savez pas comment faire pour refaire le scan PCI. Vous pouvez poser cette question sur le LKML, si ce n'est déjà fait.

décharger/recharger le module n'aide pas, n'est-ce pas?

1

Le système tomberait probablement en panne si vous reconfiguriez les adresses d'autres périphériques PCI pendant leur utilisation.

Une meilleure solution serait de simplement configurer la nouvelle carte. Si votre noyau prend en charge les périphériques Cardus, il sait déjà comment configurer un périphérique PCI nouvellement inséré (ce que Cardbus est). Vous avez juste besoin de comprendre comment obtenir le noyau pour le faire ...

Cela devrait être possible pour un module noyau. Même si vous ne pouvez pas obtenir le code hotplug intégré, vous devriez être en mesure de définir les ressources pci en utilisant les appels à pci_bus_write_config_dword() et amis. Il y a probablement une configuration de routage IRQ à faire aussi.

2

Cette commande ci-dessous aidera l'utilisateur à effectuer une nouvelle analyse du concentrateur racine complet.

echo "1" > /sys/class/pci_bus/0000\:00/rescan