Question

Lorsque vous avez besoin d'accéder à des registres dans l'espace de configuration PCI, vous devez simplement il utilisé les fonctions intégrées du BIOS en lecture / écriture DWORDs dans l'espace de configuration?

Par exemple, si je suis en train d'utiliser un contrôleur IDE qui est sur b0: D31: F1 dois-je procéder pour lire / écrire le registre de configuration à l'aide que BDF les paramètres aux fonctions du BIOS? Donc, si je voulais obtenir l'identifiant du fournisseur que je lirais le premier DWORD dans un BDF donné?

Ou suis-je juste la base loin?

EDIT:

Dans la spécification du BIOS PCI, je cherche sur les définitions des fonctions du BIOS pour lire et écrire des mots dans l'espace de configuration. Ce que je crois signifie que je peux écrire dans les registres à différents décalages dans l'espace de configuration. Je suppose que ma question est, est-ce la bonne façon d'accéder à ces registres à ce niveau?

Était-ce utile?

La solution

Après avoir lu la spécification PCI, je dois simplement appeler les fonctions du BIOS PCI par un vecteur d'interruption donné (1Ah). Cependant, ceci est compliqué par la configuration PCI qui doit se produire avant la main.

L'espace de configuration PCI semble ne pas utiliser une adresse explicite pour l'accès, mais les appels de fonction du BIOS.

EDIT: En fait, le BIOS se transforme fait beaucoup plus que ce que je savais. Tout ce que je devais faire était d'énumérer le bus PCI jusqu'à ce que je trouve l'appareil du contrôleur IDE et fournisseur ID. Le seul assemblage nécessaire était dans les / des emballages de port.


pci_dev_t dev = { 0xffffffff, 0xffffffff, 0xffffffff };

for ( bus = 0; bus < 0xffff; ++bus ) {
  for ( slot = 0; slot < 0xffff; ++slot ) {
    for ( func = 0; func < 0xff; ++func ) {
      uint16_t dev_id  = _pci_read_config_data( bus, slot, func, 0x00, PCI_READ_CONFIG_WORD );
      uint16_t vend_id = _pci_read_config_data( bus, slot, func, 0x02, PCI_READ_CONFIG_WORD );

      if ((vendor == vend_id) && (device == dev_id)) {
        dev.bus      = bus;
        dev.device   = slot;
        dev.function = func;

        return dev;
      }
    }
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top