2006-06-22 18:05:36 +04:00
/*
* linux / arch / arm / mm / nommu . c
*
* ARM uCLinux supporting functions .
*/
# include <linux/module.h>
2006-06-24 13:46:23 +04:00
# include <linux/mm.h>
# include <linux/pagemap.h>
2006-11-30 16:53:54 +03:00
# include <linux/bootmem.h>
2008-09-06 15:10:45 +04:00
# include <linux/io.h>
2006-06-22 18:05:36 +04:00
2006-06-24 13:46:23 +04:00
# include <asm/cacheflush.h>
2006-06-22 18:05:36 +04:00
# include <asm/page.h>
2006-11-30 16:53:54 +03:00
# include <asm/mach/arch.h>
2006-06-22 18:05:36 +04:00
2006-09-27 18:27:33 +04:00
# include "mm.h"
/*
* Reserve the various regions of node 0
*/
void __init reserve_node_zero ( pg_data_t * pgdat )
{
/*
* Register the kernel text and data with bootmem .
* Note that this can only be in node 0.
*/
# ifdef CONFIG_XIP_KERNEL
2008-02-07 11:15:17 +03:00
reserve_bootmem_node ( pgdat , __pa ( & __data_start ) , & _end - & __data_start ,
BOOTMEM_DEFAULT ) ;
2006-09-27 18:27:33 +04:00
# else
2008-02-07 11:15:17 +03:00
reserve_bootmem_node ( pgdat , __pa ( & _stext ) , & _end - & _stext ,
BOOTMEM_DEFAULT ) ;
2006-09-27 18:27:33 +04:00
# endif
/*
* Register the exception vector page .
* some architectures which the DRAM is the exception vector to trap ,
* alloc_page breaks with error , although it is not NULL , but " 0. "
*/
2008-02-07 11:15:17 +03:00
reserve_bootmem_node ( pgdat , CONFIG_VECTORS_BASE , PAGE_SIZE ,
BOOTMEM_DEFAULT ) ;
2006-09-27 18:27:33 +04:00
}
2008-09-30 22:29:25 +04:00
static void __init sanity_check_meminfo ( struct meminfo * mi )
{
int i , j ;
for ( i = 0 , j = 0 ; i < mi - > nr_banks ; i + + ) {
struct membank * mb = & mi - > bank [ i ] ;
if ( mb - > size ! = 0 & & mb - > node < MAX_NUMNODES )
mi - > bank [ j + + ] = mi - > bank [ i ] ;
}
mi - > nr_banks = j ;
}
2006-09-27 18:27:33 +04:00
/*
* paging_init ( ) sets up the page tables , initialises the zone memory
* maps , and sets up the zero page , bad page and bad page tables .
*/
void __init paging_init ( struct meminfo * mi , struct machine_desc * mdesc )
{
2008-09-30 22:29:25 +04:00
sanity_check_meminfo ( mi ) ;
2006-09-27 18:27:33 +04:00
bootmem_init ( mi ) ;
}
2006-09-27 18:43:47 +04:00
/*
* We don ' t need to do anything here for nommu machines .
*/
void setup_mm_for_reboot ( char mode )
{
}
2006-06-24 13:46:23 +04:00
void flush_dcache_page ( struct page * page )
{
__cpuc_flush_dcache_page ( page_address ( page ) ) ;
}
2006-06-27 23:55:43 +04:00
EXPORT_SYMBOL ( flush_dcache_page ) ;
2006-06-24 13:46:23 +04:00
2007-05-05 23:59:27 +04:00
void __iomem * __arm_ioremap_pfn ( unsigned long pfn , unsigned long offset ,
size_t size , unsigned int mtype )
2006-06-22 18:05:36 +04:00
{
if ( pfn > = ( 0x100000000ULL > > PAGE_SHIFT ) )
return NULL ;
return ( void __iomem * ) ( offset + ( pfn < < PAGE_SHIFT ) ) ;
}
2007-05-05 23:59:27 +04:00
EXPORT_SYMBOL ( __arm_ioremap_pfn ) ;
2006-06-22 18:05:36 +04:00
2007-05-05 23:59:27 +04:00
void __iomem * __arm_ioremap ( unsigned long phys_addr , size_t size ,
unsigned int mtype )
2006-06-22 18:05:36 +04:00
{
return ( void __iomem * ) phys_addr ;
}
2007-05-05 23:59:27 +04:00
EXPORT_SYMBOL ( __arm_ioremap ) ;
2006-06-22 18:05:36 +04:00
2006-11-30 16:53:54 +03:00
void __iounmap ( volatile void __iomem * addr )
2006-06-22 18:05:36 +04:00
{
}
EXPORT_SYMBOL ( __iounmap ) ;