Ich lerne gerade den Linux-Kernel-Code, über den Teil von pci, und ich habe die Datei /arch/x86/pci/Direct.c
einige Codes verwirren mich:
/*
* Functions for accessing PCI base (first 256 bytes) and extended
* (4096 bytes per PCI function) configuration space with type 1
* accesses.
*/
#define PCI_CONF1_ADDRESS(bus, devfn, reg) \
(0x80000000 | ((reg & 0xF00) << 16) | (bus << 16) \
| (devfn << 8) | (reg & 0xFC))
static int pci_conf1_read(unsigned int seg, unsigned int bus,
unsigned int devfn, int reg, int len, u32 *value)
{
unsigned long flags;
if ((bus > 255) || (devfn > 255) || (reg > 4095)) {
*value = -1;
return -EINVAL;
}
spin_lock_irqsave(&pci_config_lock, flags);
outl(PCI_CONF1_ADDRESS(bus, devfn, reg), 0xCF8);
switch (len) {
case 1:
*value = inb(0xCFC + (reg & 3));
break;
case 2:
*value = inw(0xCFC + (reg & 2));
break;
case 4:
*value = inl(0xCFC);
break;
}
spin_unlock_irqrestore(&pci_config_lock, flags);
return 0;
}
Die Kernelversion ist 2.6.18, daher verwirrt mich das Makro PCI_CONF1_ADDRESS. Wie Sie wissen, kann es nur auf die ersten 256 Byte des PCI-Konfigurationsbereichs zugreifen, wenn Sie den IO-Port CF8/CFC verwenden. Wenn Sie auf den Bereich zwischen 256 und 4095 Byte zugreifen möchten, müssen Sie ECAM (Enhanced Configuration Access Mechanism) verwenden, aber die Anmerkung oben sagt:
erweiterter (4096 Bytes pro PCI-Funktion) Konfigurationsraum mit Typ-1-Zugriffen.
Bedeutet dies, dass er auf alle 4096 Byte des pci-Konfigurationsraums zugreifen kann, wenn er den IO-Port CF8/CFC verwendet? Aber warum wird dies in der PCI LOCAL BUS SPECIFICATION nicht erwähnt?
Inzwischen fühle ich mich auch verwirrt über den Ausdruck:
((reg & 0xF00) << 16)
Auf diese Weise wird eine PCI-Konfigurationsadresse generiert. Ich habe diesen Ausdruck noch nie in einem Buch oder einer Spezifikation gesehen.