From: Stephen Rothwell Date: Sun, 27 Nov 2011 23:43:44 +0000 (+1100) Subject: Merge remote-tracking branch 'arm-lpae/for-next' X-Git-Tag: next-20111128~87 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=883fa65a22a41b4d0bf8bde45bbb2408ec9a0db4;p=karo-tx-linux.git Merge remote-tracking branch 'arm-lpae/for-next' Conflicts: arch/arm/include/asm/pgalloc.h arch/arm/include/asm/pgtable.h arch/arm/include/asm/tlb.h arch/arm/mm/ioremap.c --- 883fa65a22a41b4d0bf8bde45bbb2408ec9a0db4 diff --cc arch/arm/include/asm/pgtable.h index a24a2b8feb92,aec18abf4e6b..0542166129f3 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h @@@ -22,9 -22,14 +22,13 @@@ #include #include -#include #include + #ifdef CONFIG_ARM_LPAE + #include + #else #include + #endif /* * Just any arbitrary offset to the start of the vmalloc VM area: the diff --cc arch/arm/mm/ioremap.c index 12c7ad215ce7,d1f78bacb015..80632e8d7538 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c @@@ -194,7 -208,14 +202,8 @@@ void __iomem * __arm_ioremap_pfn_caller */ if (pfn >= 0x100000 && (__pfn_to_phys(pfn) & ~SUPERSECTION_MASK)) return NULL; + #endif - /* - * Don't allow RAM to be mapped - this causes problems with ARMv6+ - */ - if (WARN_ON(pfn_valid(pfn))) - return NULL; - type = get_mem_type(mtype); if (!type) return NULL; @@@ -329,34 -322,28 +338,34 @@@ __arm_ioremap_exec(unsigned long phys_a void __iounmap(volatile void __iomem *io_addr) { void *addr = (void *)(PAGE_MASK & (unsigned long)io_addr); -#if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE) - struct vm_struct **p, *tmp; + struct vm_struct *vm; - /* - * If this is a section based mapping we need to handle it - * specially as the VM subsystem does not know how to handle - * such a beast. We need the lock here b/c we need to clear - * all the mappings before the area can be reclaimed - * by someone else. - */ - write_lock(&vmlist_lock); - for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) { - if ((tmp->flags & VM_IOREMAP) && (tmp->addr == addr)) { - if (tmp->flags & VM_ARM_SECTION_MAPPING) { - unmap_area_sections((unsigned long)tmp->addr, - tmp->size); - } + read_lock(&vmlist_lock); + for (vm = vmlist; vm; vm = vm->next) { + if (vm->addr > addr) + break; + if (!(vm->flags & VM_IOREMAP)) + continue; + /* If this is a static mapping we must leave it alone */ + if ((vm->flags & VM_ARM_STATIC_MAPPING) && + (vm->addr <= addr) && (vm->addr + vm->size > addr)) { + read_unlock(&vmlist_lock); + return; + } - #ifndef CONFIG_SMP ++#if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE) + /* + * If this is a section based mapping we need to handle it + * specially as the VM subsystem does not know how to handle + * such a beast. + */ + if ((vm->addr == addr) && + (vm->flags & VM_ARM_SECTION_MAPPING)) { + unmap_area_sections((unsigned long)vm->addr, vm->size); break; } - } - write_unlock(&vmlist_lock); #endif + } + read_unlock(&vmlist_lock); vunmap(addr); }