1 /* 2 * linux/arch/arm/mm/nommu.c 3 * 4 * ARM uCLinux supporting functions. 5 */ 6 #include <linux/module.h> 7 #include <linux/mm.h> 8 #include <linux/pagemap.h> 9 #include <linux/io.h> 10 #include <linux/memblock.h> 11 12 #include <asm/cacheflush.h> 13 #include <asm/sections.h> 14 #include <asm/page.h> 15 #include <asm/setup.h> 16 #include <asm/traps.h> 17 #include <asm/mach/arch.h> 18 19 #include "mm.h" 20 21 void __init arm_mm_memblock_reserve(void) 22 { 23 /* 24 * Register the exception vector page. 25 * some architectures which the DRAM is the exception vector to trap, 26 * alloc_page breaks with error, although it is not NULL, but "0." 27 */ 28 memblock_reserve(CONFIG_VECTORS_BASE, PAGE_SIZE); 29 } 30 31 void __init sanity_check_meminfo(void) 32 { 33 phys_addr_t end = bank_phys_end(&meminfo.bank[meminfo.nr_banks - 1]); 34 high_memory = __va(end - 1) + 1; 35 } 36 37 /* 38 * paging_init() sets up the page tables, initialises the zone memory 39 * maps, and sets up the zero page, bad page and bad page tables. 40 */ 41 void __init paging_init(struct machine_desc *mdesc) 42 { 43 early_trap_init((void *)CONFIG_VECTORS_BASE); 44 bootmem_init(); 45 } 46 47 /* 48 * We don't need to do anything here for nommu machines. 49 */ 50 void setup_mm_for_reboot(void) 51 { 52 } 53 54 void flush_dcache_page(struct page *page) 55 { 56 __cpuc_flush_dcache_area(page_address(page), PAGE_SIZE); 57 } 58 EXPORT_SYMBOL(flush_dcache_page); 59 60 void copy_to_user_page(struct vm_area_struct *vma, struct page *page, 61 unsigned long uaddr, void *dst, const void *src, 62 unsigned long len) 63 { 64 memcpy(dst, src, len); 65 if (vma->vm_flags & VM_EXEC) 66 __cpuc_coherent_user_range(uaddr, uaddr + len); 67 } 68 69 void __iomem *__arm_ioremap_pfn(unsigned long pfn, unsigned long offset, 70 size_t size, unsigned int mtype) 71 { 72 if (pfn >= (0x100000000ULL >> PAGE_SHIFT)) 73 return NULL; 74 return (void __iomem *) (offset + (pfn << PAGE_SHIFT)); 75 } 76 EXPORT_SYMBOL(__arm_ioremap_pfn); 77 78 void __iomem *__arm_ioremap_pfn_caller(unsigned long pfn, unsigned long offset, 79 size_t size, unsigned int mtype, void *caller) 80 { 81 return __arm_ioremap_pfn(pfn, offset, size, mtype); 82 } 83 84 void __iomem *__arm_ioremap(unsigned long phys_addr, size_t size, 85 unsigned int mtype) 86 { 87 return (void __iomem *)phys_addr; 88 } 89 EXPORT_SYMBOL(__arm_ioremap); 90 91 void __iomem * (*arch_ioremap_caller)(unsigned long, size_t, unsigned int, void *); 92 93 void __iomem *__arm_ioremap_caller(unsigned long phys_addr, size_t size, 94 unsigned int mtype, void *caller) 95 { 96 return __arm_ioremap(phys_addr, size, mtype); 97 } 98 99 void (*arch_iounmap)(volatile void __iomem *); 100 101 void __arm_iounmap(volatile void __iomem *addr) 102 { 103 } 104 EXPORT_SYMBOL(__arm_iounmap); 105