Les secrets du PAT
By Samuel D.. - 16/05/2003
Sommaire:

PAT Gelsinger

 

Chipsets et Registres

 

Avant de rentrer dans les détails, il est intéressant d'expliquer le fonctionnement des registres internes d'un chipset. Dans le cas des i865 et i875, l'architecture interne a été modifiée et est maintenant plus complexe. Commençons donc par un chipset comme l'i845PE ou l'E7205. Sur ces chipsets, les registres de configurations du Northbdriges sont accessibles via le bus PCI standard. Appelé généralement "
CPU to PCI Bridge", le Northbridge se trouve à l'emplacement "bus 0, device 0, function 0". A cette adresse, on trouve une plage de 2048 bits (ou 256 octets) qui défini la quasi totalité de la configuration du Northbridge. Pour connaître la signification des bits, il faut consulter le datasheet disponible sur le site d'Intel (pour les autres chipsets, les datasheets ne sont pas public). Bien sûr, ce serait trop facile et beaucoup de bits sont indiqués en tant que "Intel Reserved". C'est à dire, en gros, qu'ils servent à quelque chose, mais qu'Intel n'a pas envie de dire à quoi. Concernant les bits en questions, ils peuvent avoir plusieurs états. Les plus courant sont :

  • RO - Pour "Read Only", c'est à dire qu'on peut lire son état mais pas le modifier.
  • R/W - Pour "Read/Write", on peut lire et écrire ce bit librement.
  • R/WO - Pour "Read/Write Once", c'est à dire qu'on peut y ecrire une fois et qu'il devient RO ensuite.

Les bits du Device 0 contiennent donc les registres de configuration du Northbridge (pont CPU -> PCI). A noter également que le device 1 contient les registres de configuration du pont AGP -> PCI (en gros les registres de configuration du bus AGP). Voici donc pour un chipset comme l'i845PE ou le nForce2. Voyons un exemple typique de dump d'un Northbridge :

 

 

Le Vendor ID est à 0x8086 (Intel), le Device ID est à 0x255D (c'est un E7205) et on est sur le bus 0, device 0, function 0. Nous sommes donc ici en présence du dump d'un chipset Granite Bay (E7205). Bref, rien de bien compliqué jusque la...

Mais pour les i865 et i875, Intel a bien corsé les choses. En effet, ces chipset inaugurent un nouveau mécanisme : le fameux Device 6. Comme nous l'avons dit plus haut, le Device 0 contient les parametres de base du chipset et le Device 1 contient les registres AGP. Dans l'i875/i865, le Device 3 et surtout, le Device 6 font leurs apparitions. Le Device 3 n'est pas trés interessant, il s'agit en fait des registres de configurations du port de communication CSA. Quant au Device 6, il est présenté comme un "Overflow Device" :

 

 

Le Device 6 est donc destiné à offrir un espace supplémentaire au Device 0. En gros, un autre Device créé uniquement pour pouvoir stocker plus de 2048 bits. Or, dans beaucoup de cas, un scan du bus PCI ne détecte absolument aucun "Device 6". Car bien sur, premier mécanisme de protection, Intel a décidé de cacher ce Device6 pour ne pas qu'on puisse aller y trifouiller. La première chose à faire est donc de débloquer ce Device pour pouvoir y acceder. Bien sur, inutile de chercher dans la documentation, rien n'est indiqué à ce sujet.

Franck, aprés de nombreux tests, a finalement trouvé la solution : Il suffit d'ecrire un 1 dans Bus0/Fun0/Dev0: RegF4 [1]. Cette notation se lit : "Il suffit d'ecrire un 1 dans le bit 1 du registre F4 localisé dans le Device 0 / Function 0 / Bus 0". Une fois ce bit a 1, un scan du bus PCI donne bien un Device 6 qui apparait. Mais le jeu de piste n'est pas terminé. Dans ce nouveau device, la quasi-seule chose qu'on peut lire, selon Intel, est l'adresse d'une plage dans la mémoire haute ou se trouve les registres en mémoire haute ! C'est ce qu'on appelle un MMR pour Memory Mapped Register. Bref, aprés avoir activé le Device 6, il faut ACTIVER ce MMR (en écrivant un 1 dans Bus0/Fun0/Dev6: Reg04~05 [1]), puis aller lire la plage mémoire dont l'adresse se trouve sur Bus0/Fun0/Dev6: Reg10~13 [31:13].

Bref, récapitulons. J'ai une carte à base d'un chipset i875P et je veux savoir en quel CAS je suis. Informations sensibles puisque cette information est localisé dans le MMR. Je dois donc faire, dans l'ordre :

  1. Activer le Device 6 mettant 1 dans Bus0/Fun0/Dev0: RegF4 [1]
  2. Activer la zone MME en mettant 1 dans Bus0/Fun0/Dev6: Reg04~05 [1]
  3. Lire l'adresse de la mémoire haute dans Bus0/Fun0/Dev6: Reg10~13 [31:13]
  4. Une fois qu'on a récupéré l'adresse, on lit à Bus0/Fun0/Dev6(MMR): Regxxxxxxxxxxxxxx60~63 [6:5]

Si les deux bits [6:5] sont 00, vous êtes en cas 2.5, si c'est 01, vous êtes en CAS 2 et si c'est 10, vous etes en CAS 3. Une fois lu, il convient de remettre un 0 dans Bus0/Fun0/Dev6: Reg04~05 [1] (ferme l'accés au MMR) et dans Bus0/Fun0/Dev0: RegF4 [1] (Ferme l'accés au Device6).

Voici par exemple un exemple de Device 6 :

 

 

Ici, nous sommes dans Bus0/Fun0/Dev6. Le Registre Reg10~13 contient 00 00 CF FE donc FECF0000h. On lit donc toute cette plage mémoire et on obtient le Device6/MMR :

 

Il ne reste plus qu'a prendre (Bus0/Fun0/Dev6(MMR): Regxxxxxxxxxxxxxx60~63 [6:5]) les registres 60~63 qui contiennent AA 12 20 17 soit 172012AAh ou, en binaire, 000010111001000000001001010101010b. les bits 6:5 sont "01". Nous sommes en CAS 2 !

 

Suite ( PAT & i865PE : Asus Howto )

Fermer