|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Cet article a été initialement publié sur amigaportal.cz en novembre 2022. L'article est une suite libre des deux parties précédentes sur l'AmigaOne XE : Nous allons aborder les interruptions matérielles de cet AmigaOne. Il y aura plus de théorie et de technique ici. Comme je ne comprenais pas vraiment le système d'interruptions PCI de l'AmigaOne XE, j'ai dû le chercher, et vous pouvez le trouver ici également. Et je dois dire que c'est beaucoup plus compliqué que le système PCIe actuel. Cet article se présente donc comme un petit manuel destiné aux utilisateurs débutants et intermédiaires sur le thème des interruptions PCI. Or, les manuels ont tendance à être ennuyeux, alors préparez-vous à cela. 1. Pourquoi faisons-nous tout cela ? Je souhaite absolument en savoir un peu plus sur mon AmigaOne XE (et pas seulement sur celui-ci, les interruptions seront très similaires pour tous les Amiga NG de première génération, AmigaOne SE, Micro A1-C, Pegasos 1 et Pegasos 2). Et aussi parce que certaines choses ne fonctionnent pas dans notre AmigaOne XE et que le dernier micrologiciel officiel U-Boot 1.1.1 ne peut pas initialiser correctement les cartes PCI derrière le pont. J'aimerais essayer d'activer les interruptions pour les cartes PCIe derrière le pont PCI-PCIe. Ce n'est pas grand-chose, hein ? 2. Documentation Comme je n'ai pas très bien compris ce problème, j'ai dû lire de la documentation cette fois-ci, ce que je n'aime vraiment pas faire. Pour quiconque souhaitant vérifier mes procédures et considérations, je recommande cette littérature :
3. Bus PCI dans AmigaOne XE plus en détail Cette fois, nous allons nous intéresser uniquement au PCI du northbridge Articia S, mais de manière plus détaillée. ![]() Schéma 3.1 - Bus PCI de l'AmigaOne XE
Autrement dit, derrière deux ponts. Et la carte derrière deux ponts ne peut plus être initialisée par U-Boot.
Essayez de voir si vous ne trouvez pas quelque chose d'étrange dans ce schéma. Vous découvrirez la solution à la fin de l'article. 4. À quoi ressemble le système d'interruptions PCI dans l'AmigaOne XE Dans l'AmigaOne XE, la fonction de contrôleur d'interruptions PCI est assurée par le southbridge VT82C686B. Si vous souhaitez rechercher quelque chose, il s'agit du premier système d'interruptions PCI, désormais appelé "PCI ancien", et non de la version plus récente PCI MSI (Message Signalled Interrupts). L'affectation des lignes d'interruption est gérée par le micrologiciel. Dans notre cas, il s'agit d'U-Boot. Nous disposons de la dernière version officielle d'Hyperion : U-Boot 1.1.1. 4.1 Affectation de base des broches INTx# pour les périphériques PCI Chaque périphérique PCI peut utiliser jusqu'à quatre interruptions matérielles différentes pour signaler une interruption. Quatre broches physiques, INTA#, INTB#, INTC# et INTD#, leur sont réservées sur le connecteur PCI (pour information, sur le connecteur PCI, ce sont les broches A6, A7, B7, B8). Le périphérique AGP ne possède que deux broches matérielles INTA#, INTB# (A6, B6). Il est important de noter que ces signaux sont physiquement connectés au contrôleur d'interruption (définition : IRQ Pin = une indication de la broche physique de la carte PCI utilisée par la fonction). Les câbles de données du bus PCI sont connectés au pont nord, comme illustré sur le schéma 3.1. Cependant, les broches d'interruption sont reliées au contrôleur d'interruptions, le pont sud, où elles sont connectées aux broches du contrôleur d'interruption physique, comme suit :
Dans l'ancienne architecture ISA, chaque périphérique devait avoir un numéro d'interruption unique. Je ne sais pas si vous vous en souvenez, mais avec le très ancien PC XT/AT, lors de l'utilisation de plusieurs cartes, il était souvent nécessaire de définir manuellement les numéros d'interruption afin d'éviter tout conflit. Cependant, dans l'architecture PCI, les interruptions matérielles physiques peuvent déjà être partagées et les conflits sont résolus par leur priorité différente. Le contrôleur d'interruption de l'AmigaOne XE est de type APIC (Advanced Programmable Interrupt Controller), il contient un routeur d'interruption et avec lui U-Boot affecte les interruptions matérielles individuelles aux IRQ, c'est-à-dire attribue des lignes. (Définition : ligne d'interruption = configuration, détermine quel numéro d'IRQ est attribué à chaque fonction PCI) Dans le diagramme 4.1, vous pouvez voir comment les lignes sont attribuées dans l'AmigaOne XE (si vous laissez les paramètres par défaut dans le menu U-Boot "PCI/AGP") :
Je suppose que cela est basé sur le modèle ISA précédent où les seize premières interruptions étaient réservées aux interruptions ISA. (Définition : numéro d'interruption = numéro d'interruption de la fonction PCI dans le système d'exploitation) 4.2 Petit exercice dans Ranger La figure 4.2 montre les résultats du programme Ranger. Voici ce que nous voyons :
Mais que se passe-t-il si la carte PCI possède davantage de fonctions et encore plus d'interruptions ? C'est le cas du southbridge du schéma 3.1. Mais ce n'est pas tout : certaines cartes courantes ont plusieurs fonctions. Elles peuvent nécessiter davantage d'interruptions physiques. C'est là que les choses se compliquent. Le schéma 4.4 montre trois cartes PCI :
4.4 En-tête PCI Chaque fonction PCI possède son propre espace de configuration en mémoire. Celui de base est appelé "PCI header" (en-tête PCI). Il existe plusieurs types d'en-têtes. Le type 00h est l'en-tête des fonctions PCI standard et le type 01h est l'en-tête de pont. Les périphériques PCIe ont généralement un en-tête légèrement différent, mais le bus PCI voit uniquement l'en-tête 00h de la carte PCIe et uniquement l'en-tête 01h du pont PCI-PCIe. Dans ce cas précis, PCI et PCIe sont donc identiques. ![]() Figure 4.5 - en-tête PCI Notez que Ranger affiche simplement les données d'en-tête PCI. 5. Exploration de la carte graphique PCIe derrière le pont PCI-PCIe Nous connaissons donc maintenant un peu la théorie. Examinons à présent de plus près ce qui se passe dans notre AmigaOne XE lors de l'initialisation d'un périphérique PCI. Nous savons déjà que notre carte graphique derrière le pont PCI-PCIe n'est pas correctement initialisée. Mais à quoi ressemble une initialisation aussi correcte ? Pour cela, il vous faudrait lire les spécifications plus en détail que moi et probablement avoir une connaissance plus approfondie d'AmigaOS. Utilisons donc une petite méthode comparative. J'ai pris le pont PCI-PCIe et la carte graphique HD7750 et je les ai d'abord connectés sur l'AmigaOne XE puis sur la Sam440ep-flex. Cela devrait être plus ou moins équivalent à l'utilisation de ponts et de cartes. Et nous savons que dans la Sam440ep-flex, cela fonctionne comme prévu. Les valeurs varieront certainement dans les adresses des périphériques PCI, les affectations de lignes et les numéros d'interruption - tout dépend de la conception spécifique de l'ordinateur, mais d'autres caractéristiques "devraient être les mêmes". Pour le Sam440ep-flex, l'arbitre du bus PCI est le processeur AMCC440 lui-même. Le PCI est ici conforme à la norme v2.2. Cependant, je pense que les fonctions MSI avancées ne sont pas utilisées sous AmigaOS ; il suffit de regarder les numéros d'interruption affectés : là encore, ils sont tous décalés de 16, et il n'y a rien de plus sophistiqué. 5.1 Comparaison des ponts AmigaOne XE et Sam440ep-flex Commençons par examiner comment les ponts sont initialisés. En comparant le même pont PCI-PCIe sur AmigaOne XE et Sam440ep-flex, nous constatons les valeurs "0x00" pour la ligne d'interruption de l'AmigaOne XE et "0x19" pour la Sam440ep-flex. ![]() Figure 5.1 - comparaison du pont pour l'AmigaOne XE et la Sam440ep-flex L'AmigaOne XE possède la ligne d'interruption 0x00. Bien qu'il s'agisse généralement d'une valeur d'interruption valide, la table de routage des interruptions du southbridge de l'AmigaOne XE est définie par défaut sur "0x00 Disabled". Cette table est programmable, mais comme je n'ai pas d'outil sous AmigaOS pour la consulter, je suppose qu'un pont configuré de cette manière ne génère pas d'interruption. Au moins, aucune valeur n'apparaît dans le gestionnaire d'interruptions d'AmigaOS. En règle générale, l'absence d'interruptions générées par le pont n'est pas une erreur. Les cartes PCIe modernes ne possèdent pas de broches INTx# matérielles et ne génèrent pas d'interruptions de PCI ancien. Elles génèrent plutôt des messages PCIe Assert_INTx/Deassert_INTx. Le pont transparent traduit ces messages reçus de la carte PCIe en interruptions matérielles INTx# pour PCI ancien sur le bus PCI. La valeur de la ligne d'interruption définie pour le pont indique uniquement le numéro d'interruption que le pont générera pour lui-même (et non pour la carte). J'avoue ne pas savoir si le pont lui-même génère quoi que ce soit. Probablement pas, car le gestionnaire d'interruptions de la Sam440ep-flex est également inexistant. Ensuite, cela diffère dans la taille du cache : 32 octets pour l'AmigaOne XE 128 octets pour la Sam440ep-flex. C'est la taille du cache qui est utilisée lorsque les transactions d'écriture, d'invalidation et de lecture de mémoire sont terminées. Si le pont lui-même génère ces transactions ou les transmet entre les bus, il doit contenir ce cache. Si le cache est de 0 octet, tout est bien sûr plus lent. La différence de taille de cache est probablement due aux propriétés différentes de l'arbitre PCI. Tous les périphériques PCI de l'AmigaOne XE, s'ils disposent d'une ligne de cache, n'ont que 32 octets. Nous constatons également que la plupart des autres données sont identiques. Et c'est normal. C'est le même pont. Nous souhaitons donc configurer une ligne d'interruption sur le pont dans l'AmigaOne XE. J'ai un pont PCI-PCIe dans le port PCI 33 MHz numéro 3 ; d'après la figure 4.1, nous souhaitons donc une valeur de 11 (0x0b). Sachant que cela peut être inutile, mais cela ne devrait pas faire de mal si cela fonctionne sur la Sam440ep-flex. Nous ne toucherons pas à la ligne de cache, 32 octets suffisent pour l'AmigaOne XE. 5.2 Comparaison des cartes graphiques derrière le pont dans l'AmigaOne XE et la Sam440ep-flex Comparons maintenant les données de la carte graphique HD7750 derrière le pont PCIe dans l'AmigaOne XE et le Sam440ep-flex. Encore une fois, ils diffèrent dans la ligne d'interruption : "0xFF" pour l'AmigaOne XE et "0x19" pour la Sam440ep-flex. ![]() Figure 5.2 - comparaison des cartes graphiques AmigaOne XE/Sam440ep-flex Encore une fois, il existe une différence au niveau de la taille de cache : 0 octet pour l'AmigaOne XE et 128 octets sur la Sam440ep-flex. Et cela est également dérangeant. Cela signifie que l'AmigaOne XE n'utilise pas de cache pour les lectures et écritures en mémoire. Plus loin dans la case "Status", la Sam440ep-flex dispose de l'option "RecMasterAbort" en plus, mais ignorons-la, c'est un état opérationnel sur le bus. Nous souhaitons donc redéfinir la ligne d'interruption de la carte dans l'AmigaOne XE sur 11 (0x0b). Selon la spécification du bus PCI, le premier périphérique après le pont correspond à la broche A de la carte pont, donc ici encore 11 (0x0b). La spécification des ponts PCI contient un grand tableau de routage des interruptions. N'hésitez pas à le consulter. Ensuite, nous allons essayer de définir la valeur de la ligne de cache pour l'AmigaOne XE à 32 octets. Dans l'en-tête, cette valeur est donnée en DWORDS (4 octets), donc la valeur souhaitée sera 32/4 = 8 (0x08). 6. État du bus PCI et ce que nous voulons exactement corriger Dans notre cas, la position des cartes sur le bus est la suivante :
Pont :
C'est facile à dire, mais comment le faire ? 7.1 Commandes U-Boot Heureusement, dans U-Boot sur AmigaOne XE, nous disposons de quelques commandes puissantes pour travailler avec le bus PCI, que nous pouvons utiliser pour afficher et modifier les paramètres sur le bus PCI :
Commençons par examiner ce que nous allons faire dans U-Boot. Ici, nous entrons dans la ligne de commande. Nous allons d'abord examiner les périphériques sur le bus PCI 0 et le bus 2 :
Ci-dessus, nous voyons notre pont (00.0a.00) et notre carte graphique (02.00.00). Si votre configuration de carte est différente de la mienne, vérifiez ici les adresses PCI correctes. Examinons maintenant l'en-tête PCI du pont :
Dans cette liste détaillée et compacte, nous pouvons voir les valeurs de "cache line" (ligne de cache) et de "interrupt line" (ligne d'interruption) mises en évidence par du texte en gras. Voici ensuite la liste de la carte graphique avec les valeurs en gras :
7.3 Correction des paramètres d'en-tête PCI Alors, ce qu'U-Boot n'a pas fait, nous allons essayer de le réparer. Si c'est votre première fois, respirez profondément et commençons :
Et nous pouvons voir que l'interruption du pont PCIe a pris la valeur souhaitée. Ouf ! Passons à la carte graphique :
...nous voyons que la ligne d'interruption et la ligne de cache ont changé pour la carte graphique. Ensuite, démarrez simplement le système et voilà : Alors ça a marché ! 8. Utilisation du menu U-Boot PCI/AGP Il serait également possible d'utiliser d'autres options d'U-Boot, d'autres paramètres de ligne d'interruption. Dans le menu "PCI/AGP", nous pouvons définir le "IRQ Level" (niveau IRQ) pour les interruptions PCI en plus du pont AGP. Modifiez donc l'affectation des lignes avec différentes valeurs. Pour chacune des quatre broches physiques du contrôleur (dans le menu "Interruption PCI A = PIRQ A#", etc.), il est possible de sélectionner l'une des valeurs suivantes : 9, 10, 11, 13 ou 7. Jusqu'à présent, nous avons travaillé avec les paramètres par défaut, comme indiqué dans la figure 8.1. Si vous modifiez les paramètres par simple décalage (par exemple, PCI int A = 10, B = 11, C = 7, D = 9), les lignes et les numéros d'interruption changeront, mais du point de vue de l'utilisateur et du système, cela n'a aucune importance. Cela ne nous aide pas. Affecter toutes les interruptions physiques aux mêmes lignes d'interruption n'est ni raisonnable ni très logique. Plusieurs périphériques auraient simplement le même numéro d'interruption. Et si vous utilisez la valeur 13 (0xD) pour l'une des interruptions, rien ne se passe - rien n'est affecté sur 13. Dans la table de routage du contrôleur, l'interruption 13 est marquée comme "Reserved" (Réservée) et je ne sais pas exactement à quoi elle sert. En réalité, aucune interruption 29 (= 13+16) n'apparaît dans le gestionnaire d'interruptions d'AmigaOS. Et ce que nous pouvons également définir dans le menu U-Boot, c'est comment l'interruption sera générée :
9. Automatisation Nous pouvons définir l'interruption correcte sur une carte graphique PCIe. Mais il serait peu pratique de ressaisir les commandes d'écriture PCI à chaque démarrage. On s'en lasserait vite. Heureusement, nous pouvons automatiser cela. Sous AmigaOS, nous créons une nouvelle variable d'environnement, "pcifix", via le Shell. Vous pouvez bien sûr également le faire depuis la ligne de commande U-Boot, mais cette méthode est plus pratique.
Et puis on vérifie :
Nous ne pouvons alors entrer qu'une seule commande à chaque démarrage dans la ligne de commande U-Boot :
Et nous avons réussi à le réparer sans risquer une faute de frappe. Si le résultat de la correction de la configuration PCI nous convient et que les tests sont terminés, nous procéderons à une automatisation complète. Modifions la variable "menuboot_cmd" comme suit :
Cela démarrera le correctif automatiquement à chaque démarrage d'AmigaOS. Mais n'oubliez pas de remettre cette variable à son état d'origine lorsque vous retirez la carte PCIe de votre Amiga. 10. Autres versions d'U-Boot Tous les tests ont été effectués avec la dernière version officielle d'U-Boot d'Hyperion, c'est-à-dire la 1.1.1. Cependant, d'autres versions étaient disponibles pour les bêta-testeurs mais n'ont jamais été officiellement publiées. Outre le fait que les versions supérieures devraient permettre le démarrage à partir d'autres cartes PCI (SiI3114, SiI35121 ), il existe d'autres différences pour nous : ![]() Tableau 10.1 - les différentes versions d'U-Boot 11. Conclusion Après avoir ajusté manuellement les interruptions et la ligne de cache, la vitesse de la carte graphique n'a augmenté que légèrement. MPlayer a été accéléré de deux secondes : de 307,905 à 305,879 secondes. ioquake3 est passé de 21,5 à 21,9 ips. En fonctionnement normal, l'utilisateur ne remarquera rien. J'imagine qu'il faudrait un processeur plus rapide que mon PowerPC G4 à 800 MHz pour accentuer les différences. Mais nous pouvons déjà être satisfaits d'avoir corrigé les bogues d'U-Boot et de mieux comprendre les choses. Ce qui est bien, c'est qu'avant la modification, le débogage série dans RadeonHD ressemblait à ceci :
Et après notre modification, cela ressemble à ceci :
Autre avantage important : nous pouvons utiliser les "cartes combo" dans notre AmigaOne XE. Ces cartes contiennent un pont PCI vers PCI et plusieurs périphériques en aval. Par exemple, SATA et Firewire ou SATA et USB. En réalité, la plupart d'entre elles n'ont des pilotes que pour Linux, mais nous savons maintenant comment les faire fonctionner. Cela fonctionne de la même manière que nos cartes graphiques : aucune fonction derrière le pont n'est initialisée par U-Boot. Il suffit donc de définir l'interruption correcte. Rebus - Explication du diagramme PCI (du début de l'article) Vous ne trouverez donc pas ici de solution, juste une réflexion. Selon la spécification PCI, si des périphériques 33 et 66 MHz sont regroupés sur un même bus, celui-ci fonctionne entièrement à 33 MHz. Ainsi, le pont PCI-vers-PCI 00.01.00, qui sépare le bus PCI 1 (66 MHz), ne fonctionnerait qu'à 33 MHz. La carte graphique peut donc être aussi rapide qu'elle le souhaite, mais le débit de transfert peut alors être limité à 133 Mo/s (bus PCI 0, 33 MHz). ![]() Un merci spécial à Evillord68 pour son aide.
|