Merge master.kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-drm-fsl-dcu.git] / arch / x86_64 / kernel / aperture.c
index 58af8e73738bd5cf51dc9b0a7884bb0fbb66d154..a52af58205921b37b45e33b137f706dfa6bb3bc5 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/pci_ids.h>
 #include <linux/pci.h>
 #include <linux/bitops.h>
+#include <linux/ioport.h>
 #include <asm/e820.h>
 #include <asm/io.h>
 #include <asm/proto.h>
@@ -33,12 +34,23 @@ int fallback_aper_force __initdata = 0;
 
 int fix_aperture __initdata = 1;
 
+static struct resource gart_resource = {
+       .name   = "GART",
+       .flags  = IORESOURCE_MEM,
+};
+
+static void __init insert_aperture_resource(u32 aper_base, u32 aper_size)
+{
+       gart_resource.start = aper_base;
+       gart_resource.end = aper_base + aper_size - 1;
+       insert_resource(&iomem_resource, &gart_resource);
+}
+
 /* This code runs before the PCI subsystem is initialized, so just
    access the northbridge directly. */
 
 static u32 __init allocate_aperture(void) 
 {
-       pg_data_t *nd0 = NODE_DATA(0);
        u32 aper_size;
        void *p; 
 
@@ -48,20 +60,21 @@ static u32 __init allocate_aperture(void)
 
        /* 
         * Aperture has to be naturally aligned. This means an 2GB aperture won't
-        * have much chances to find a place in the lower 4GB of memory.
+        * have much chance of finding a place in the lower 4GB of memory.
         * Unfortunately we cannot move it up because that would make the
         * IOMMU useless.
         */
-       p = __alloc_bootmem_node(nd0, aper_size, aper_size, 0); 
+       p = __alloc_bootmem_nopanic(aper_size, aper_size, 0);
        if (!p || __pa(p)+aper_size > 0xffffffff) {
                printk("Cannot allocate aperture memory hole (%p,%uK)\n",
                       p, aper_size>>10);
                if (p)
-                       free_bootmem_node(nd0, __pa(p), aper_size); 
+                       free_bootmem(__pa(p), aper_size);
                return 0;
        }
        printk("Mapping aperture over %d KB of RAM @ %lx\n",
               aper_size >> 10, __pa(p)); 
+       insert_aperture_resource((u32)__pa(p), aper_size);
        return (u32)__pa(p); 
 }
 
@@ -198,7 +211,7 @@ void __init iommu_hole_init(void)
        u64 aper_base, last_aper_base = 0;
        int valid_agp = 0;
 
-       if (iommu_aperture_disabled || !fix_aperture)
+       if (iommu_aperture_disabled || !fix_aperture || !early_pci_allowed())
                return;
 
        printk("Checking aperture...\n"); 
@@ -233,8 +246,13 @@ void __init iommu_hole_init(void)
                last_aper_base = aper_base;
        } 
 
-       if (!fix && !fallback_aper_force) 
+       if (!fix && !fallback_aper_force) {
+               if (last_aper_base) {
+                       unsigned long n = (32 * 1024 * 1024) << last_aper_order;
+                       insert_aperture_resource((u32)last_aper_base, n);
+               }
                return; 
+       }
 
        if (!fallback_aper_force)
                aper_alloc = search_agp_bridge(&aper_order, &valid_agp);