From 6c077d5b7a28ce5d62249ce19cd3cffdd68beece Mon Sep 17 00:00:00 2001 From: Arjan van de Ven Date: Fri, 7 Apr 2006 19:49:30 +0200 Subject: [PATCH] --- yaml --- r: 25325 b: refs/heads/master c: 946f2ee5c7312e8acac4f3ab6629e7e2d36a3646 h: refs/heads/master i: 25323: a6ee9db02bf49731e1a7dda75a568d0f6df3167a v: v3 --- [refs] | 2 +- trunk/arch/i386/pci/mmconfig.c | 11 +++++++++++ trunk/arch/x86_64/pci/mmconfig.c | 10 ++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index aee650070634..8429bcdbae8c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 952223683ec989e86328c24808fdb962c4dbeb0a +refs/heads/master: 946f2ee5c7312e8acac4f3ab6629e7e2d36a3646 diff --git a/trunk/arch/i386/pci/mmconfig.c b/trunk/arch/i386/pci/mmconfig.c index 613789071f30..ee815c7d3e4c 100644 --- a/trunk/arch/i386/pci/mmconfig.c +++ b/trunk/arch/i386/pci/mmconfig.c @@ -12,8 +12,11 @@ #include #include #include +#include #include "pci.h" +#define MMCONFIG_APER_SIZE (256*1024*1024) + #define mmcfg_virt_addr ((void __iomem *) fix_to_virt(FIX_PCIE_MCFG)) /* The base address of the last MMCONFIG device accessed */ @@ -183,6 +186,14 @@ void __init pci_mmcfg_init(void) (pci_mmcfg_config[0].base_address == 0)) return; + if (!e820_all_mapped(pci_mmcfg_config[0].base_address, + pci_mmcfg_config[0].base_address + MMCONFIG_APER_SIZE, + E820_RESERVED)) { + printk(KERN_ERR "PCI: BIOS Bug: MCFG area is not E820-reserved\n"); + printk(KERN_ERR "PCI: Not using MMCONFIG.\n"); + return; + } + printk(KERN_INFO "PCI: Using MMCONFIG\n"); raw_pci_ops = &pci_mmcfg; pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; diff --git a/trunk/arch/x86_64/pci/mmconfig.c b/trunk/arch/x86_64/pci/mmconfig.c index e616500207e4..dfe84c322552 100644 --- a/trunk/arch/x86_64/pci/mmconfig.c +++ b/trunk/arch/x86_64/pci/mmconfig.c @@ -9,6 +9,8 @@ #include #include #include +#include + #include "pci.h" #define MMCONFIG_APER_SIZE (256*1024*1024) @@ -161,6 +163,14 @@ void __init pci_mmcfg_init(void) (pci_mmcfg_config[0].base_address == 0)) return; + if (!e820_all_mapped(pci_mmcfg_config[0].base_address, + pci_mmcfg_config[0].base_address + MMCONFIG_APER_SIZE, + E820_RESERVED)) { + printk(KERN_ERR "PCI: BIOS Bug: MCFG area is not E820-reserved\n"); + printk(KERN_ERR "PCI: Not using MMCONFIG.\n"); + return; + } + /* RED-PEN i386 doesn't do _nocache right now */ pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL); if (pci_mmcfg_virt == NULL) {