Revert "ARM: move iotable mappings within the vmalloc region"
Varun Wadekar [Thu, 7 Jun 2012 06:05:42 +0000 (11:05 +0530)]
This reverts commit 0536bdf33faff4d940ac094c77998cfac368cfff.

Conflicts:

arch/arm/mm/mmu.c

Change-Id: Ie72458b676be57b5cabdfb57df6760111a063c50
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>

Documentation/arm/memory.txt
arch/arm/include/asm/pgtable.h
arch/arm/mach-tegra/include/mach/io.h
arch/arm/mach-tegra/include/mach/vmalloc.h [new file with mode: 0644]
arch/arm/mm/mmu.c

index 208a2d4..771d48d 100644 (file)
@@ -51,14 +51,15 @@ ffc00000    ffefffff        DMA memory mapping region.  Memory returned
 ff000000       ffbfffff        Reserved for future expansion of DMA
                                mapping region.
 
+VMALLOC_END    feffffff        Free for platform use, recommended.
+                               VMALLOC_END must be aligned to a 2MB
+                               boundary.
+
 VMALLOC_START  VMALLOC_END-1   vmalloc() / ioremap() space.
                                Memory returned by vmalloc/ioremap will
                                be dynamically placed in this region.
-                               Machine specific static mappings are also
-                               located here through iotable_init().
-                               VMALLOC_START is based upon the value
-                               of the high_memory variable, and VMALLOC_END
-                               is equal to 0xff000000.
+                               VMALLOC_START may be based upon the value
+                               of the high_memory variable.
 
 PAGE_OFFSET    high_memory-1   Kernel direct-mapped RAM region.
                                This maps the platforms RAM, and typically
index 752514c..01262dd 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <asm-generic/pgtable-nopud.h>
 #include <asm/memory.h>
+#include <mach/vmalloc.h>
 #include <asm/pgtable-hwdef.h>
 
 #ifdef CONFIG_ARM_LPAE
  * any out-of-bounds memory accesses will hopefully be caught.
  * The vmalloc() routines leaves a hole of 4kB between each vmalloced
  * area for the same reason. ;)
+ *
+ * Note that platforms may override VMALLOC_START, but they must provide
+ * VMALLOC_END.  VMALLOC_END defines the (exclusive) limit of this space,
+ * which may not overlap IO space.
  */
 #define VMALLOC_OFFSET         (8*1024*1024)
 #define VMALLOC_START          (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
-#define VMALLOC_END            0xff000000UL
 
 #define LIBRARY_TEXT_START     0x0c000000
 
index 567ac75..3b31d7e 100644 (file)
@@ -22,6 +22,8 @@
 #ifndef __MACH_TEGRA_IO_H
 #define __MACH_TEGRA_IO_H
 
+#include "vmalloc.h"
+
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
 #define IO_SPACE_LIMIT 0xffff
 #else
@@ -44,7 +46,7 @@
 #define IOMEM(x)       ((void __force __iomem *)(x))
 #endif
 
-#define IO_VIRT_BASE   0xFA000000
+#define IO_VIRT_BASE   VMALLOC_END
 
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
 #define IO_PCIE_PHYS   0x80000000
diff --git a/arch/arm/mach-tegra/include/mach/vmalloc.h b/arch/arm/mach-tegra/include/mach/vmalloc.h
new file mode 100644 (file)
index 0000000..315798e
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * arch/arm/mach-tegra/vmalloc.h
+ *
+ * Copyright (C) 2012 NVIDIA Corporation.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef __MACH_VMALLOC_H
+#define __MACH_VMALLOC_H
+
+#define VMALLOC_END            0x0fb000000
+
+#endif /* __MACH_VMALLOC_H */
index b1f0233..584d218 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/nodemask.h>
 #include <linux/memblock.h>
 #include <linux/fs.h>
-#include <linux/vmalloc.h>
 
 #include <asm/cp15.h>
 #include <asm/cputype.h>
@@ -551,18 +550,13 @@ EXPORT_SYMBOL(phys_mem_access_prot);
 
 #define vectors_base() (vectors_high() ? 0xffff0000 : 0)
 
-static void __init *early_alloc_aligned(unsigned long sz, unsigned long align)
+static void __init *early_alloc(unsigned long sz)
 {
-       void *ptr = __va(memblock_alloc(sz, align));
+       void *ptr = __va(memblock_alloc(sz, sz));
        memset(ptr, 0, sz);
        return ptr;
 }
 
-static void __init *early_alloc(unsigned long sz)
-{
-       return early_alloc_aligned(sz, sz);
-}
-
 static pte_t * __init early_pte_alloc(pmd_t *pmd)
 {
        if (pmd_none(*pmd) || pmd_bad(*pmd))
@@ -748,10 +742,9 @@ static void __init create_mapping(struct map_desc *md, bool force_pages)
        }
 
        if ((md->type == MT_DEVICE || md->type == MT_ROM) &&
-           md->virtual >= PAGE_OFFSET &&
-           (md->virtual < VMALLOC_START || md->virtual >= VMALLOC_END)) {
+           md->virtual >= PAGE_OFFSET && md->virtual < VMALLOC_END) {
                printk(KERN_WARNING "BUG: mapping for 0x%08llx"
-                      " at 0x%08lx out of vmalloc space\n",
+                      " at 0x%08lx overlaps vmalloc space\n",
                       (long long)__pfn_to_phys((u64)md->pfn), md->virtual);
        }
 
@@ -795,33 +788,18 @@ static void __init create_mapping(struct map_desc *md, bool force_pages)
  */
 void __init iotable_init(struct map_desc *io_desc, int nr)
 {
-       struct map_desc *md;
-       struct vm_struct *vm;
-
-       if (!nr)
-               return;
+       int i;
 
-       vm = early_alloc_aligned(sizeof(*vm) * nr, __alignof__(*vm));
-
-       for (md = io_desc; nr; md++, nr--) {
-               create_mapping(md, false);
-               vm->addr = (void *)(md->virtual & PAGE_MASK);
-               vm->size = PAGE_ALIGN(md->length + (md->virtual & ~PAGE_MASK));
-               vm->phys_addr = __pfn_to_phys(md->pfn); 
-               vm->flags = VM_IOREMAP | VM_ARM_STATIC_MAPPING; 
-               vm->flags |= VM_ARM_MTYPE(md->type);
-               vm->caller = iotable_init;
-               vm_area_add_early(vm++);
-       }
+       for (i = 0; i < nr; i++)
+               create_mapping(io_desc + i, false);
 }
 
-static void * __initdata vmalloc_min =
-       (void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET);
+static void * __initdata vmalloc_min = (void *)(VMALLOC_END - SZ_128M);
 
 /*
  * vmalloc=size forces the vmalloc area to be exactly 'size'
  * bytes. This can be used to increase (or decrease) the vmalloc
- * area - the default is 240m.
+ * area - the default is 128m.
  */
 static int __init early_vmalloc(char *arg)
 {
@@ -986,10 +964,10 @@ static inline void prepare_page_table(void)
 
        /*
         * Clear out all the kernel space mappings, except for the first
-        * memory bank, up to the vmalloc region.
+        * memory bank, up to the end of the vmalloc region.
         */
        for (addr = __phys_to_virt(end);
-            addr < VMALLOC_START; addr += PMD_SIZE)
+            addr < VMALLOC_END; addr += PMD_SIZE)
                pmd_clear(pmd_off_k(addr));
 }
 
@@ -1022,8 +1000,8 @@ void __init arm_mm_memblock_reserve(void)
 }
 
 /*
- * Set up the device mappings.  Since we clear out the page tables for all
- * mappings above VMALLOC_START, we will remove any debug device mappings.
+ * Set up device the mappings.  Since we clear out the page tables for all
+ * mappings above VMALLOC_END, we will remove any debug device mappings.
  * This means you have to be careful how you debug this function, or any
  * called function.  This means you can't use any function or debugging
  * method which may touch any device, otherwise the kernel _will_ crash.
@@ -1041,7 +1019,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
 
        early_trap_init(vectors);
 
-       for (addr = VMALLOC_START; addr; addr += PMD_SIZE)
+       for (addr = VMALLOC_END; addr; addr += PMD_SIZE)
                pmd_clear(pmd_off_k(addr));
 
        /*