aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm
diff options
context:
space:
mode:
authorNicolas Pitre <nicolas.pitre@linaro.org>2011-08-25 00:35:59 -0400
committerNicolas Pitre <nico@fluxnic.net>2011-11-26 19:21:26 -0500
commit0536bdf33faff4d940ac094c77998cfac368cfff (patch)
tree802e858f7c2771fa2e0939037a2ec3d3df742ff3 /arch/arm/mm
parentbe9b7335e70696bee731c152429b1737e42fe163 (diff)
ARM: move iotable mappings within the vmalloc region
In order to remove the build time variation between different SOCs with regards to VMALLOC_END, the iotable mappings are now allocated inside the vmalloc region. This allows for VMALLOC_END to be identical across all machines. The value for VMALLOC_END is now set to 0xff000000 which is right where the consistent DMA area starts. To accommodate all static mappings on machines with possible highmem usage, the default vmalloc area size is changed to 240 MB so that VMALLOC_START is no higher than 0xf0000000 by default. Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org> Tested-by: Stephen Warren <swarren@nvidia.com> Tested-by: Kevin Hilman <khilman@ti.com> Tested-by: Jamie Iles <jamie@jamieiles.com>
Diffstat (limited to 'arch/arm/mm')
-rw-r--r--arch/arm/mm/mmu.c49
1 files changed, 35 insertions, 14 deletions
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 0aa8b7d5b21d..c61481577ae1 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -15,6 +15,7 @@
15#include <linux/nodemask.h> 15#include <linux/nodemask.h>
16#include <linux/memblock.h> 16#include <linux/memblock.h>
17#include <linux/fs.h> 17#include <linux/fs.h>
18#include <linux/vmalloc.h>
18 19
19#include <asm/cputype.h> 20#include <asm/cputype.h>
20#include <asm/sections.h> 21#include <asm/sections.h>
@@ -529,13 +530,18 @@ EXPORT_SYMBOL(phys_mem_access_prot);
529 530
530#define vectors_base() (vectors_high() ? 0xffff0000 : 0) 531#define vectors_base() (vectors_high() ? 0xffff0000 : 0)
531 532
532static void __init *early_alloc(unsigned long sz) 533static void __init *early_alloc_aligned(unsigned long sz, unsigned long align)
533{ 534{
534 void *ptr = __va(memblock_alloc(sz, sz)); 535 void *ptr = __va(memblock_alloc(sz, align));
535 memset(ptr, 0, sz); 536 memset(ptr, 0, sz);
536 return ptr; 537 return ptr;
537} 538}
538 539
540static void __init *early_alloc(unsigned long sz)
541{
542 return early_alloc_aligned(sz, sz);
543}
544
539static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, unsigned long prot) 545static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, unsigned long prot)
540{ 546{
541 if (pmd_none(*pmd)) { 547 if (pmd_none(*pmd)) {
@@ -685,9 +691,10 @@ static void __init create_mapping(struct map_desc *md)
685 } 691 }
686 692
687 if ((md->type == MT_DEVICE || md->type == MT_ROM) && 693 if ((md->type == MT_DEVICE || md->type == MT_ROM) &&
688 md->virtual >= PAGE_OFFSET && md->virtual < VMALLOC_END) { 694 md->virtual >= PAGE_OFFSET &&
695 (md->virtual < VMALLOC_START || md->virtual >= VMALLOC_END)) {
689 printk(KERN_WARNING "BUG: mapping for 0x%08llx" 696 printk(KERN_WARNING "BUG: mapping for 0x%08llx"
690 " at 0x%08lx overlaps vmalloc space\n", 697 " at 0x%08lx out of vmalloc space\n",
691 (long long)__pfn_to_phys((u64)md->pfn), md->virtual); 698 (long long)__pfn_to_phys((u64)md->pfn), md->virtual);
692 } 699 }
693 700
@@ -729,18 +736,32 @@ static void __init create_mapping(struct map_desc *md)
729 */ 736 */
730void __init iotable_init(struct map_desc *io_desc, int nr) 737void __init iotable_init(struct map_desc *io_desc, int nr)
731{ 738{
732 int i; 739 struct map_desc *md;
740 struct vm_struct *vm;
741
742 if (!nr)
743 return;
733 744
734 for (i = 0; i < nr; i++) 745 vm = early_alloc_aligned(sizeof(*vm) * nr, __alignof__(*vm));
735 create_mapping(io_desc + i); 746
747 for (md = io_desc; nr; md++, nr--) {
748 create_mapping(md);
749 vm->addr = (void *)(md->virtual & PAGE_MASK);
750 vm->size = PAGE_ALIGN(md->length + (md->virtual & ~PAGE_MASK));
751 vm->phys_addr = __pfn_to_phys(md->pfn);
752 vm->flags = VM_IOREMAP;
753 vm->caller = iotable_init;
754 vm_area_add_early(vm++);
755 }
736} 756}
737 757
738static void * __initdata vmalloc_min = (void *)(VMALLOC_END - SZ_128M); 758static void * __initdata vmalloc_min =
759 (void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET);
739 760
740/* 761/*
741 * vmalloc=size forces the vmalloc area to be exactly 'size' 762 * vmalloc=size forces the vmalloc area to be exactly 'size'
742 * bytes. This can be used to increase (or decrease) the vmalloc 763 * bytes. This can be used to increase (or decrease) the vmalloc
743 * area - the default is 128m. 764 * area - the default is 240m.
744 */ 765 */
745static int __init early_vmalloc(char *arg) 766static int __init early_vmalloc(char *arg)
746{ 767{
@@ -891,10 +912,10 @@ static inline void prepare_page_table(void)
891 912
892 /* 913 /*
893 * Clear out all the kernel space mappings, except for the first 914 * Clear out all the kernel space mappings, except for the first
894 * memory bank, up to the end of the vmalloc region. 915 * memory bank, up to the vmalloc region.
895 */ 916 */
896 for (addr = __phys_to_virt(end); 917 for (addr = __phys_to_virt(end);
897 addr < VMALLOC_END; addr += PMD_SIZE) 918 addr < VMALLOC_START; addr += PMD_SIZE)
898 pmd_clear(pmd_off_k(addr)); 919 pmd_clear(pmd_off_k(addr));
899} 920}
900 921
@@ -921,8 +942,8 @@ void __init arm_mm_memblock_reserve(void)
921} 942}
922 943
923/* 944/*
924 * Set up device the mappings. Since we clear out the page tables for all 945 * Set up the device mappings. Since we clear out the page tables for all
925 * mappings above VMALLOC_END, we will remove any debug device mappings. 946 * mappings above VMALLOC_START, we will remove any debug device mappings.
926 * This means you have to be careful how you debug this function, or any 947 * This means you have to be careful how you debug this function, or any
927 * called function. This means you can't use any function or debugging 948 * called function. This means you can't use any function or debugging
928 * method which may touch any device, otherwise the kernel _will_ crash. 949 * method which may touch any device, otherwise the kernel _will_ crash.
@@ -937,7 +958,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
937 */ 958 */
938 vectors_page = early_alloc(PAGE_SIZE); 959 vectors_page = early_alloc(PAGE_SIZE);
939 960
940 for (addr = VMALLOC_END; addr; addr += PMD_SIZE) 961 for (addr = VMALLOC_START; addr; addr += PMD_SIZE)
941 pmd_clear(pmd_off_k(addr)); 962 pmd_clear(pmd_off_k(addr));
942 963
943 /* 964 /*