|
@@ -12,8 +12,11 @@
|
|
#include <linux/pci.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/init.h>
|
|
#include <linux/init.h>
|
|
#include <linux/acpi.h>
|
|
#include <linux/acpi.h>
|
|
|
|
+#include <asm/e820.h>
|
|
#include "pci.h"
|
|
#include "pci.h"
|
|
|
|
|
|
|
|
+#define MMCONFIG_APER_SIZE (256*1024*1024)
|
|
|
|
+
|
|
#define mmcfg_virt_addr ((void __iomem *) fix_to_virt(FIX_PCIE_MCFG))
|
|
#define mmcfg_virt_addr ((void __iomem *) fix_to_virt(FIX_PCIE_MCFG))
|
|
|
|
|
|
/* The base address of the last MMCONFIG device accessed */
|
|
/* 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))
|
|
(pci_mmcfg_config[0].base_address == 0))
|
|
return;
|
|
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");
|
|
printk(KERN_INFO "PCI: Using MMCONFIG\n");
|
|
raw_pci_ops = &pci_mmcfg;
|
|
raw_pci_ops = &pci_mmcfg;
|
|
pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF;
|
|
pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF;
|