Le hotplug PCIe fonctionne-t-il réellement dans la pratique?

20

Je suis entré dans une discussion dans les commentaires de /security/109199/is-physical-security-less-important-now-for-securing-a-server?noredirect=1#comment194327_109199

La question est simple. Quelqu'un at-il l'expérience de la connexion à chaud réussie d'une carte PCIe? Faut-il des cartes mères et des cartes spéciales, ou est-il censé fonctionner sur tout le matériel grand public?

pjc50
la source
1
La réponse devrait être double. Le matériel et les logiciels (ses pilotes) doivent prendre en charge le branchement à chaud.
jippie
Je ne sais pas si cela aide, mais j'ai réussi à supprimer le deuxième GPU transmis d'une machine Windows kvm sans affecter le premier GPU (l'écran scintillait juste une seconde).
feedc0de

Réponses:

43

J'avais l'habitude de concevoir du matériel PCI-Express qui nécessitait une prise en charge complète à chaud du matériel et des logiciels, et c'est certainement possible, mais il est très impliqué et nécessite une prise en charge logicielle étendue - le matériel est en fait assez simple. J'ai dû concevoir le matériel, puis implémenter la prise en charge du BIOS (UEFI) et du noyau (Linux) pour les périphériques PCIe arbitraires enfichables à chaud sur fibre et cuivre.

D'un point de vue logiciel, il faut se rappeler que PCIe continue avec le modèle logiciel PCI, y compris les concepts d'adressage bus, périphérique, fonction. Lorsque le bus PCI est énuméré, cela se fait comme une recherche en largeur: Topologie du bus PCI de tldp.org

L'énumération PCIe est généralement effectuée deux fois. Tout d'abord, votre BIOS (UEFI ou autre) le fera, pour déterminer qui est présent et la quantité de mémoire dont ils ont besoin. Ces données peuvent ensuite être transmises au système d'exploitation hôte qui peut les prendre telles quelles, mais Linux et Windows effectuent également souvent leur propre procédure d'énumération. Sous Linux, cela se fait via le sous-système PCI de base, qui recherche le bus, applique toutes les bizarreries si nécessaire en fonction de l'ID du périphérique, puis charge un pilote qui a un ID correspondant dans sa fonction de sonde. Un périphérique PCI est identifié par une combinaison de son ID de fournisseur (16 bits, par exemple Intel est 0x8086) et de l'ID de périphérique (16 autres bits) - la source Internet la plus courante est ici: http://pcidatabase.com / .

La partie logicielle personnalisée entre pendant ce processus d'énumération et c'est-à-dire que vous devez réserver à l'avance les numéros de bus PCI et les segments de mémoire pour les futurs périphériques potentiels - cela est parfois appelé `` remplissage de bus ''. Cela évite la nécessité de réénumérer le bus à l'avenir, ce qui ne peut souvent pas être fait sans perturber le système. Un périphérique PCI a des BARRES ( registres d'adresses de base) qui demande à l'hôte la quantité et le type de mémoire (mémoire ou espace d'E / S) dont le périphérique a besoin - c'est pourquoi vous n'avez plus besoin de cavaliers comme ISA :) De même, le noyau Linux implémente le hotplug PCIe via pciehp chauffeur. Windows fait des choses différentes en fonction de la version - les versions plus anciennes (je pense que XP) ignorent tout ce que dit le BIOS et fait son propre sondage. Les versions plus récentes, je crois, sont plus respectueuses de l'ACPI DSDT fourni par le firmware hôte (BIOS / EFI) et incorporeront ces informations.

Cela peut sembler assez compliqué et ça l'est! Mais rappelez-vous que tout ordinateur portable / appareil avec un slot ExpressCard (qui implémente PCIe car vous pouvez avoir des ExpressCards USB uniquement) doit le faire, bien que généralement le rembourrage soit assez simple - un seul bus. Mon ancien matériel était un commutateur PCIe avec 8 autres périphériques derrière lui, donc le rembourrage est devenu un peu plus compliqué.

D'un point de vue matériel, c'est beaucoup plus simple. Les broches GND de la carte établissent le contact en premier, et nous plaçons un contrôleur IC remplaçable à chaud ou similaire sur la carte pour séquencer l'alimentation une fois la connexion établie. À ce stade, l'ASIC ou le FPGA intégré commence sa séquence de mise sous tension et commence à essayer de former son lien PCI Express. En supposant que l'hôte prend en charge le branchement à chaud et le PCI Express SLTCAP / SLTCTRLregistre (dans la spécification: PCI Express Slot Capability Register, PCI Express Slot Control Register. Il y a aussi 1 et 2 pour cela - assez de bits pour se diviser en deux regs). pour ce port a été configuré pour indiquer que le port est hot-plug, le logiciel peut commencer à énumérer le nouveau périphérique. Le registre d'état de l'emplacement (SLTSTA, registre d'état de l'emplacement PCI Express) contient des bits que le périphérique cible peut définir pour indiquer des défauts d'alimentation, un verrou de libération mécanique et, bien sûr, une détection de présence + une présence modifiée.

Les registres susmentionnés sont situés dans «PCI (Express) Configuration Space», qui est une petite région de la carte mémoire (4K pour PCIe) allouée à chaque bdf potentiel (bus: périphérique: fonction). Les registres réels résident généralement sur le périphérique.

Côté hôte, nous pouvons utiliser PRSNT1 # / PRSNT2 # comme de simples signaux DC qui alimentent l'activation d'un IC de commutateur d'alimentation, ou exécuter vers GPIO sur le chipset / PCH pour provoquer une IRQ et déclencher un SW 'hey, quelque chose a été inséré , allez le trouver et le configurer! ' routine.

C'est beaucoup d'informations qui ne répondent pas directement à votre question (voir ci-dessous pour le résumé rapide), mais j'espère que cela vous donnera une meilleure expérience pour comprendre le processus. Si vous avez des questions sur des parties spécifiques du processus, faites-le moi savoir dans un commentaire ici ou envoyez-moi un e-mail et je pourrai discuter davantage + mettre à jour cette réponse avec ces informations.

Pour résumer - le périphérique doit avoir été conçu avec le support hot-plug à l'esprit à partir d'un PDV matériel. Un hôte / emplacement correctement conçu est également compatible avec la connexion à chaud, et sur une carte mère haut de gamme, je m'attendrais à ce qu'il soit sûr. Cependant, le support logiciel pour cela est une toute autre question et vous êtes malheureusement redevable au BIOS que votre OEM vous a fourni.

En pratique, vous utilisez cette technologie chaque fois que vous retirez / insérez une carte PCIe ExpressCard d'un ordinateur. De plus, les systèmes de lames hautes performances (télécoms ou autres) utilisent régulièrement cette technologie.

Commentaire final - enregistrez le PDF qui était lié à la spécification de base, PCI-SIG facture généralement des dollars pour cela :)

Krunal Desai
la source
2
Et pour compléter la discussion sur la sécurité, avec un FPGA relativement bon marché (comme un Cyclone IV GX) agissant comme un périphérique PCIe, votre machine hôte est terminée - le FPGA peut effectuer toutes les actions DMA qu'il souhaite.
Krunal Desai
Grande explication. Que se passe-t-il lorsqu'une carte PCIe compatible Hot-Plug est échangée? D'une part, le système d'exploitation doit énumérer à nouveau la topologie PCIe, en voyant qu'un nouveau périphérique a été inséré (il ne peut pas prédire la taille des BAR / nombre de bus qui pourraient être demandés par le périphérique nouvellement inséré), mais d'autre part - la ré-énumération du système pourrait ne pas être possible sans affecter les ressources qui étaient déjà affectées aux périphériques existants dans la topologie ...
so.very.tired
2
Oui, ça devient difficile. Donc, en utilisant ExpressCard (EC) à titre d'exemple, une façon de le faire était de «remplir» le nombre de bus pour prendre en charge l'ajout d'un périphérique qui pourrait se ramifier à encore plus de périphériques; la plupart des BIOS avec un simple emplacement EC le remplissent simplement par un numéro de bus (nous avons utilisé cet emplacement pour étendre à de nombreux périphériques PCIe). De même, vous pouvez «remplir» la plage de mémoire possible pour y être affectée afin de prendre en charge une variété de périphériques avec une plage d'adresses contiguës, de même avec les IRQ. L'OS (avec / sans ACPI) peut alors faire ce qu'il veut. C'est en fait "simple", mais la complexité des couches SW dans une machine moderne le rend plus difficile.
Krunal Desai
L'énumération PCIe n'est-elle pas réellement une recherche en profondeur? Les registres de base et de limite sont configurés de telle sorte que tous les périphériques situés sous un port donné doivent être énumérés avant de passer au port suivant.
alex.forencich
8

À condition que les connexions de surveillance de l'état de l'alimentation aient été exposées au connecteur par le commutateur en amont et que l'unité enfichable ait exposé ces broches et soit configurée pour les utiliser correctement et (comme le note Jippie), le logiciel peut détecter l'événement hotplug et répondre correctement, le la réponse est oui.

Généralement, cette capacité est principalement utilisée dans les batteries de serveurs et les centres de données pour le branchement à chaud de disques PCIe, entre autres; Je ne suis pas sûr que l'équipement grand public soit entièrement compatible avec les branchements à chaud (c'est, je comprends, facultatif dans les spécifications).

Gardez à l'esprit que la fourniture du matériel nécessaire pour prendre en charge le branchement à chaud coûte de l'argent (bien que la majorité se trouve dans le point de terminaison PCIe, il doit encore être configuré, généralement via un eeprom), il ne sera généralement pas proposé sur un marché sensible aux prix.

Notez que la mise à jour dynamique du mappage d'adresses PCI ajoute une complexité importante au pilote PCI (e); si un nouveau périphérique est inséré, il doit être mappé dans le bus sur lequel il vit, avec les traductions de nouvelles adresses associées, mais si un périphérique est supprimé puis remplacé par quelque chose de différent , cela rend la surveillance des adresses d'espace PCI assez complexe .

Sans cette complexité, le sous-système PCI est analysé une fois (à la réinitialisation du système) et reste statique; aucun autre effort requis.

Voici les spécifications de base PCIe v3.0 , page 514, section 6.7 sur la prise en charge des connexions à chaud. Un exemple de carte PCIe qui prend en charge la connexion à chaud peut être vu ici, gracieuseté d' iocrest . On peut voir clairement que la trace de connecteur la plus courte est routée: Carte contrôleur PCI-e SATA III (6G) à 2 ports, chipset Marvell 88SE9120

Cependant, sur cette carte Axxon , la trace la plus courte peut être clairement vue acheminée vers la carte adjacente. Sur le plan physique uniquement, cette carte ne peut pas prendre en charge le remplacement à chaud: MAP / 950 1 carte d'E / S port série RS232 pour PCI Express (PCIe)

Peter Smith
la source
2

Il est censé fonctionner sur tout le matériel conforme PCIe, si tout le matériel grand public est vraiment conforme est une bonne question, car je ne suis pas profondément dans les spécifications PCIe pour connaître les exigences de test et même dans ce cas, tous les détaillants vérifient-ils la validité de la réclamation? Je pense que pratiquement personne ne le fait.

Tout comme les normes de sécurité. La moitié (<-hyperbole?) Des étiquettes EE que nous avons, vous pouvez prétendre à la compatibilité, sans avoir à tester tout ce que vous faites. Puisque les trucs hotplug ne mettent pas la vie en danger, je ne peux pas imaginer que les gens soient plus stricts à ce sujet.

Pour ma part, je ne l'ai jamais essayé et vu que mon ordinateur portable Clevo a complètement chassé le bureau de ma maison, je ne suis pas sur le point de l'essayer, car le module GPU de mon ordinateur portable ne revendique aucune capacité de connexion à chaud et est trop cher sans être Dave Jones et obtenir $$$ pour la vidéo d'un GPU qui explose.

Asmyldof
la source
1

Oui cela fonctionne. J'ai pu le faire fonctionner pour connecter à chaud une carte de ligne de châssis de routeur (contenant plus de 10 périphériques PCIe). Le châssis possède 16 cartes enfichables à chaud. N'importe quelle carte peut être branchée ou déconnectée de façon aléatoire au moment de l'exécution sans affecter les opérations de trafic sur les autres cartes.

La complexité pour le faire fonctionner dépend de l'environnement CPU. Sur un processeur intégré, le travail consiste simplement à configurer une carte de ressources statique et à gérer les événements de changement de connexion en connectant et en détachant des périphériques PCI. Sur x86, il est beaucoup plus impliqué en raison de la complexité de la gestion des erreurs et des interactions BIOS / OS.

xzhu70
la source