насчет доступа к конфигурационному пространству pci макрос PCI_CONF1_ADDRESS меня смущает

Я изучаю код ядра linux, о части pci, и я читал файл /arch/x86/pci/Direct.c, какой-то код меня смущает:

/*
* 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;
}

Версия ядра - 2.6.18, поэтому макрос PCI_CONF1_ADDRESS меня смущает. Как вы знаете, он может получить доступ только к первым 256 байтам пространства конфигурации pci при использовании порта ввода-вывода CF8 / CFC, если вы хотите получить доступ к пространству между 256 ~ 4095 байтами, вы должны использовать ECAM (Enhanced Configuration Access Механизм), но в приведенной выше аннотации сказано:

расширенное (4096 байт на функцию PCI) конфигурационное пространство с доступом типа 1.

Означает ли это, что он может получить доступ ко всему 4096-байтовому пространству конфигурации pci при использовании порта ввода-вывода CF8 / CFC? Но почему в СПЕЦИФИКАЦИИ ЛОКАЛЬНОЙ ШИНЫ PCI об этом не упоминается?

Между тем, я также озадачен выражением:

((reg & 0xF00) ‹---------------- 16)

Он использует этот способ для генерации адреса конфигурации pci, я никогда не видел этого выражения ни в одной книге или СПЕЦИФИКАЦИИ.


person Jak.Ding    schedule 27.08.2012    source источник


Ответы (1)


Это нестандартная функция процессоров и чипсетов AMD. AFAIK это не будет работать на платформе Intel. По крайней мере, из кода ядра Linux я могу понять, что можно получить доступ к расширенному пространству конфигурации, используя адреса ввода-вывода CF8 / CFC.

патч от AMD

Что касается ((reg & 0xF00) ‹---------------- 16) - выглядит как зарезервированные биты 30:24 порта адреса конфигурации на CF8, используемые AMD для хранения части адреса.

person user2303463    schedule 21.04.2013