Comment le périphérique est-il déterminé dans l'énumération PCI? (bus / appareil / fonction)

8

Je suis confus au sujet de l'énumération du bus PCI / périphérique / fonction. En regardant la page Wikipedia pour la configuration PCI , je vois que pour un bus donné, le maître demandera l'ID du vendeur et l'ID de l'appareil pour tous les appareils utilisant la fonction 0. Si tous les 0xFF sont retournés, alors aucun appareil n'est là, et l'énumération continue. Si un ID de périphérique valide et un ID de fournisseur sont trouvés, alors il y a une unité PCI là-bas et elle sera énumérée. Je ne sais pas comment le périphérique dans la fonction bus.device.function est déterminé.

Par exemple, supposons que j'ai un processeur avec un bus PCI et un périphérique PCI connectés. Je comprends que le CPU regardera le bus 0 (par défaut) et vérifiera tous les numéros de périphérique en regardant la fonction 0. Comment le numéro de périphérique du périphérique est-il déterminé?

symboles_simples
la source

Réponses:

6

Dans le cadre PCI d'origine («PCI conventionnel») et dans PCI-X également, les périphériques correspondaient à des «emplacements», chacun avec ses propres connecteurs connectés au même bus parallèle. Chaque emplacement avait une broche d'identification unique qui a été affirmée pendant l'énumération. L'énumération demandait essentiellement (pour chaque emplacement): "Hé, y a-t-il quelque chose de présent dans cet emplacement?" L'appareil a répondu en envoyant des données sur le bus en réponse à ce signal. Le manque de réponse signifiait aucun appareil.

Un appareil peut également être un «pont», ce qui signifie qu'il forme un bus subordonné. Ce bus aurait un ID distinct (attribué à partir de l'amont) et aurait son propre ensemble d'emplacements qui ont été énumérés indépendamment.

PCI-Express (PCIe) est totalement différent. PCIe n'est pas vraiment un bus - comme dans une ressource partagée entre des périphériques; à la place, chaque appareil possède sa propre connexion série point à point à son appareil en amont (et à tout appareil en aval - et s'il a des appareils en aval, cela signifie qu'il fonctionne également comme un pont). Considérez PCIe comme un LAN. Chaque pont est analogue à un commutateur, qui a un tas de ports connectés à d'autres appareils. Les autres périphériques peuvent être des terminaux ou des commutateurs (par exemple des ponts PCIe).

PCIe a été conçu de manière à ce que son cadre conceptuel et son adressage (et donc le comportement fourni aux logiciels) soient compatibles avec PCI et PCI-X. L'implémentation est cependant complètement différente. Dans l'énumération de périphériques, par exemple, étant donné qu'il s'agit d'un point à point, la seule question qui doit être déterminée à chaque point de l'énumération est "quelque chose là-bas?" Étant donné que chaque périphérique possède son propre jeu de câbles indépendant, les ID de périphérique sont essentiellement tous codés en dur (par conséquent, chaque pont, y compris le "complexe racine" de niveau supérieur, indique à chaque périphérique quel sera son ID de périphérique).

Dans tous les cas, la partie "fonction" du bus / périphérique / fonction est gérée strictement à l'intérieur du périphérique. Par exemple, un contrôleur NIC à double port aura souvent deux fonctions, une pour chaque port. Ils peuvent être configurés et exploités indépendamment, mais le chemin de données de l'UC vers la fonction est le même pour les deux.

Gil Hamilton
la source
1
La réponse est un peu déroutante: 1) dans PCI "numéro de périphérique" signifie en fait "numéro de slot" (et cela a du sens), 2) vous dites "PCIe est totalement différent" et "puisque chaque périphérique a son propre jeu de fils indépendant , les ID de périphérique sont essentiellement tous codés en dur ", ce qui signifie que le jeu de câbles (= l'emplacement) a le code en dur, c'est donc la même chose qu'en PCI. Maintenant, la question est de savoir quand le "codage en dur" se produit? Les commutateurs / ponts réattribuent les ID lors de la réinitialisation?
xealits
2
Ouais. Cela pourrait être mieux formulé. Le fait est qu'en PCI, la carte est sur un bus partagé mais "sait" dans quel slot elle se trouve et ne répond que lorsque sa broche spécifique au slot est affirmée. En PCIe, le pont a N jeux de "fils" différents. Ainsi, le pont a un numéro d'emplacement discret pour chaque jeu de fils. Du point de vue du pont, cette fente a un nombre défini; il suffit de déterminer s'il y a quelque chose. La carte elle - même ne sait pas dans quel emplacement elle se trouve. Une fois que le pont détermine qu'il y a quelque chose, il indique alors à cet appareil quel est son numéro d'emplacement.
Gil Hamilton