2

pciの部分について、Linuxカーネルコードを学んでいて、ファイルを読んでいます/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 は私を混乱させます。ご存知のように、IO ポート CF8/CFC を使用する場合、PCI 構成スペースの最初の 256 バイトにしかアクセスできません。256 ~ 4095 バイトの間のスペースにアクセスする場合は、ECAM (Enhanced Configuration Accessメカニズム) ですが、上記の注釈には次のように記載されています。

タイプ 1 アクセスによる拡張 (PCI 機能ごとに 4096 バイト) 構成空間。

これは、IO ポート CF8/CFC を使用すると、pci 構成スペースの 4096 バイトすべてにアクセスできるということですか? しかし、なぜ PCI LOCAL BUS SPECIFICATION はこれについて言及していないのでしょうか?

一方、次の表現にも戸惑いを覚えます。

((reg & 0xF00) << 16)

この方法を使用して pci 構成アドレスを生成しますが、この表現は本や仕様で見たことがありません。

4

1 に答える 1

4

This is non standard feature of AMD CPUs and chipsets. AFAIK it won't work on Intel platform. At least from Linux kernel code I can understand that it is possible to access extended configuration space using CF8/CFC IO addresses.

patch from AMD

Regarding ((reg & 0xF00) << 16) -- looks like reserved bits 30:24 of configuration address port at CF8 used by AMD to store part of the address.

于 2013-04-21T01:48:41.593 に答える