Comment le noyau linux d'être forcé à énumérer les PCI-e bus?
Noyau Linux 2.6
J'ai un fpga qui est chargé à plus de GPIO connecté à un conseil de développement linux en cours d'exécution.
Le fpga sera de transmettre et recevoir des données via le pci-express bus. Cependant, ce qui est énuméré
au démarrage et en tant que tel, aucun lien n'est découvert (parce que le fpga n'est pas chargé au démarrage).
Comment puis-je la force d'un nouveau dénombrement du pci-e, bus à linux?
Est-il une commande simple ou vais-je devoir faire des changements dans le noyau?
J'ai besoin de la capacité de branchement à chaud périphériques pcie.
- Ne pas le pilote de périphérique de prendre soin de cela?
- Non, il semble que le pci-e driver n'énumère automatiquement au démarrage, et si après le démarrage d'un appareil est branché, rien ne se passe. lspci ne montre pas de dispositifs et aucun appareil n'fichier existe
- Je pense que la réponse est "non", même si je suis tout à fait prêt à être incorrect. Altera semble avoir une solution de contournement méthode, google pour "FPGA Altera Configuration via le Protocole". Si je comprends correctement le papier, Altera a un flash disponibles dans les (certains?) Stratix V appareils qui est toujours disponible pour les bus PCIe énumération alors que la majeure partie des FPGA peut être (re)programmer à loisir.
- Minimes de QEMU exemple pour jouer avec cela: stackoverflow.com/questions/5059501/probe-method-device-drivers/...
Vous devez vous connecter pour publier un commentaire.
Je me demande quelle plate-forme vous êtes sur: Un travail autour (aka hack) pour ce qui fonctionne sur des systèmes x86 est d'avoir le BIOS fondamentalement statique configurer un périphérique PCI, quel que soit le bus, l'appareil, la fonction, le FPGA normalement sur les terres, alors le système d'exploitation va énumérer l'appareil et se réserve le PCI de l'espace (même si l'appareil n'est pas vraiment là). Puis dans votre pilote de périphérique, vous aurez à faire quelques choses en plus de la configuration de la BARs et int lignes manuellement après le fpga a été programmé. Bien sûr, cela nécessite de modifier le BIOS, qui, si vous travaillez avec un BIOS fournisseur, vous pouvez les confier à faire ce changement pour vous, si vous ne travaillez pas avec un BIOS vendeur alors il sera beaucoup plus difficile... Aussi garder à l'esprit que je travaillais sur VxWorks sur x86, et nous avons eu un AMI faire un personnalisé du BIOS pour notre conseil d'administration...
Si vous n'avez pas de BIOS, puis envisager de programmation dans le chargeur de démarrage, là, vous avez déjà la possibilité de lire à partir du disque, et l'ajout de GPIO capacités n'est probablement pas trop difficile (en supposant que vous utilisez jtag et GPIOs?), en fait, selon ce bootloader vous l'utilisez peut-être déjà capable de faire GPIO?
Les problèmes avec la modification du noyau pour ce faire est que vous devez trouver le sweet spot, où vous pouvez lire le fichier bitfile, avant l'énumération PCI... par exemple, Si le disque des pilotes de périphérique sont initialisés après le PCI, alors évidemment, vous devez faire quelques changements radicaux dans le noyau de simplement lire le fichier bitfile avant l'énumération PCI, ce qui pourrait causer d'autres problèmes gênants...
Une autre option qui vous peut-être déjà découvert, et qui est vraiment ok pour le temps de développement: mettez le système sous tension, le programme de la carte fpga, puis faire un reset (sans cycle d'alimentation, par exemple: sudo reboot), le FPGA doit garder sa configuration, et linux devraient énumérer il...
En tant que root, essayez la commande suivante:
Voir ce lien pour plus d'informations: http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci
sudo
, vous obtiendrez "permission refusée". Dans ce cas, utilisezsudo sh -c "echo 1 > /sys/bus/pci/rescan"
.Après la mise en marche de votre ordinateur, le BIOS énumère les bus PCI et tente de répondre à toutes les e /s de l'espace et de la mémoire mappée IO (MMIO) des demandes. Il met en place ces de la BARRE d'origine, et, lorsque le système d'exploitation charges de ces de la BARRE peut être modifié par l'OS comme il l'entend, tandis que le pilote de bus PCI énumère les bus encore une fois. Il est même possible pour le super-utilisateur du système pour exécuter la commande
setpci
de modifier ces de la BARRE après que le BIOS a déjà essayé de le configurer et le système d'exploitation est chargé (peut provoquer des pilotes à l'échec et à plusieurs autres mauvaises choses si fait mal).J'ai dû le faire dans le cas où la carte en question n'a pas été attribué tout ressources par le BIOS depuis la région requis demandés une adresse 64 bits et que le BIOS ne fonctionne avec les versions 32 bits de l'adresse de missions. J'ai pu aller dans l'après-coup et de modifier ces adresses (à l'origine affecté par le BIOS) à ce que les adresses que j'ai vu ajustement, insérez le module dans le noyau, et mon pilote de carte et d'utiliser ces nouvelles adresses affectées pour la carte sans en connaître la différence.
Le problème qui existe avec le branchement à chaud PCI-Express, c'est que le pouvoir de la fente, lui-même, ne peut pas être activée/désactivée sans hotplug contrôleurs qui doivent exister sur la carte mère/carte de fond de panier. N'ayant pas de ces hotplug contrôleurs de tourner la fente d'alimentation peut conduire à des courts-circuits entre les broches minuscules lorsque la carte est physiquement insérée et retirée si l'alimentation est toujours présent. Le branchement à chaud des événements, cependant, peut être initié par part et d'autre (l'hôte ou le point de terminaison de l'appareil). Cela ne semble pas être le cas, cependant si votre FPGA a déjà un lien établi avec la racine complexe, une solution à votre problème serait de générer hotplug des interruptions à cause d'un bus rescan dans l'OS.
Il y a un problème majeur, bien que -- si votre carte n'a pas réellement d'obtenir un lien vers la racine complexe, il ne sera pas en mesure de générer des événements hotplug; ce qui semble être le cas. Après le démarrage, le FPGA doit basculer le PRÉSENT ligne sur le bus PCIe à dire l'OS il y a une carte prête à être énumérés. Une fois détecté, le système d'exploitation doit essayer d'établir un lien de la carte et affecter des régions de la mémoire de l'appareil. Après l'OS énumère la carte, vous serez en mesure de charger des pilotes contre elle et de la voir dans
lspci
. Vous avez déclaré que vous utilisez le noyau 2.6, qui n'a pas le support pour le branchement à chaud et l'allocation dynamique des ressources, donc cette méthode devrait fonctionner aussi longtemps que votre FPGA prend en charge la capacité de basculer le PRÉSENT PCIe ligne, trop.