Pull button into test branch
[linux-drm-fsl-dcu.git] / arch / x86_64 / pci / mmconfig.c
index 2d48a7941d489beff692a8abd50e1c444726e159..f8b6b2800a62c86641d94badfc5b1201951b2578 100644 (file)
@@ -9,7 +9,6 @@
 #include <linux/init.h>
 #include <linux/acpi.h>
 #include <linux/bitmap.h>
-#include <linux/dmi.h>
 #include <asm/e820.h>
 
 #include "pci.h"
@@ -157,41 +156,18 @@ static __init void unreachable_devices(void)
                        addr = pci_dev_base(0, k, PCI_DEVFN(i, 0));
                        if (addr == NULL|| readl(addr) != val1) {
                                set_bit(i + 32*k, fallback_slots);
-                               printk(KERN_NOTICE
-                               "PCI: No mmconfig possible on device %x:%x\n",
-                                       k, i);
+                               printk(KERN_NOTICE "PCI: No mmconfig possible"
+                                      " on device %02x:%02x\n", k, i);
                        }
                }
        }
 }
 
-static int disable_mcfg(struct dmi_system_id *d)
-{
-       printk("PCI: %s detected. Disabling MCFG.\n", d->ident);
-       pci_probe &= ~PCI_PROBE_MMCONF;
-       return 0;
-}
-
-static struct dmi_system_id __initdata dmi_bad_mcfg[] = {
-       /* Has broken MCFG table that makes the system hang when used */
-        {
-         .callback = disable_mcfg,
-         .ident = "Intel D3C5105 SDV",
-         .matches = {
-                     DMI_MATCH(DMI_BIOS_VENDOR, "Intel"),
-                     DMI_MATCH(DMI_BOARD_NAME, "D26928"),
-                     },
-         },
-         {}
-};
-
-void __init pci_mmcfg_init(void)
+void __init pci_mmcfg_init(int type)
 {
        int i;
 
-       dmi_check_system(dmi_bad_mcfg);
-
-       if ((pci_probe & (PCI_PROBE_MMCONF|PCI_PROBE_MMCONF_FORCE)) == 0)
+       if ((pci_probe & PCI_PROBE_MMCONF) == 0)
                return;
 
        acpi_table_parse(ACPI_MCFG, acpi_parse_mcfg);
@@ -200,10 +176,20 @@ void __init pci_mmcfg_init(void)
            (pci_mmcfg_config[0].base_address == 0))
                return;
 
-       /* RED-PEN i386 doesn't do _nocache right now */
+       /* Only do this check when type 1 works. If it doesn't work
+           assume we run on a Mac and always use MCFG */
+       if (type == 1 && !e820_all_mapped(pci_mmcfg_config[0].base_address,
+                       pci_mmcfg_config[0].base_address + MMCONFIG_APER_MIN,
+                       E820_RESERVED)) {
+               printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %x is not E820-reserved\n",
+                               pci_mmcfg_config[0].base_address);
+               printk(KERN_ERR "PCI: Not using MMCONFIG.\n");
+               return;
+       }
+
        pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL);
        if (pci_mmcfg_virt == NULL) {
-               printk("PCI: Can not allocate memory for mmconfig structures\n");
+               printk(KERN_ERR "PCI: Can not allocate memory for mmconfig structures\n");
                return;
        }
        for (i = 0; i < pci_mmcfg_config_num; ++i) {
@@ -211,7 +197,8 @@ void __init pci_mmcfg_init(void)
                pci_mmcfg_virt[i].virt = ioremap_nocache(pci_mmcfg_config[i].base_address,
                                                         MMCONFIG_APER_MAX);
                if (!pci_mmcfg_virt[i].virt) {
-                       printk("PCI: Cannot map mmconfig aperture for segment %d\n",
+                       printk(KERN_ERR "PCI: Cannot map mmconfig aperture for "
+                                       "segment %d\n",
                               pci_mmcfg_config[i].pci_segment_group_number);
                        return;
                }