2005-04-17 02:20:36 +04:00
/*
*
* linux / arch / cris / kernel / setup . c
*
* Copyright ( C ) 1995 Linus Torvalds
* Copyright ( c ) 2001 Axis Communications AB
*/
/*
* This file handles the architecture - dependent parts of initialization
*/
# include <linux/init.h>
# include <linux/mm.h>
# include <linux/bootmem.h>
# include <asm/pgtable.h>
# include <linux/seq_file.h>
2006-07-10 15:44:13 +04:00
# include <linux/screen_info.h>
2005-07-27 22:44:38 +04:00
# include <linux/utsname.h>
2006-03-27 13:16:04 +04:00
# include <linux/pfn.h>
2008-01-28 18:39:00 +03:00
# include <linux/cpu.h>
2005-04-17 02:20:36 +04:00
# include <asm/setup.h>
/*
* Setup options
*/
struct screen_info screen_info ;
extern int root_mountflags ;
extern char _etext , _edata , _end ;
2007-02-12 11:54:09 +03:00
char __initdata cris_command_line [ COMMAND_LINE_SIZE ] = { 0 , } ;
2005-04-17 02:20:36 +04:00
extern const unsigned long text_start , edata ; /* set by the linker script */
extern unsigned long dram_start , dram_end ;
extern unsigned long romfs_start , romfs_length , romfs_in_flash ; /* from head.S */
2008-01-28 18:39:00 +03:00
static struct cpu cpu_devices [ NR_CPUS ] ;
2005-04-17 02:20:36 +04:00
extern void show_etrax_copyright ( void ) ; /* arch-vX/kernel/setup.c */
/* This mainly sets up the memory area, and can be really confusing.
*
* The physical DRAM is virtually mapped into dram_start to dram_end
* ( usually c0000000 to c0000000 + DRAM size ) . The physical address is
* given by the macro __pa ( ) .
*
* In this DRAM , the kernel code and data is loaded , in the beginning .
2008-01-28 18:39:00 +03:00
* It really starts at c0004000 to make room for some special pages -
2005-04-17 02:20:36 +04:00
* the start address is text_start . The kernel data ends at _end . After
* this the ROM filesystem is appended ( if there is any ) .
2008-01-28 18:39:00 +03:00
*
2005-04-17 02:20:36 +04:00
* Between this address and dram_end , we have RAM pages usable to the
* boot code and the system .
*
*/
2008-01-28 18:39:00 +03:00
void __init setup_arch ( char * * cmdline_p )
2005-04-17 02:20:36 +04:00
{
extern void init_etrax_debug ( void ) ;
unsigned long bootmap_size ;
unsigned long start_pfn , max_pfn ;
unsigned long memory_start ;
2008-01-28 18:39:00 +03:00
/* register an initial console printing routine for printk's */
2005-04-17 02:20:36 +04:00
init_etrax_debug ( ) ;
/* we should really poll for DRAM size! */
high_memory = & dram_end ;
if ( romfs_in_flash | | ! romfs_length ) {
/* if we have the romfs in flash, or if there is no rom filesystem,
* our free area starts directly after the BSS
*/
memory_start = ( unsigned long ) & _end ;
} else {
/* otherwise the free area starts after the ROM filesystem */
printk ( " ROM fs in RAM, size %lu bytes \n " , romfs_length ) ;
memory_start = romfs_start + romfs_length ;
}
/* process 1's initial memory region is the kernel code/data */
init_mm . start_code = ( unsigned long ) & text_start ;
init_mm . end_code = ( unsigned long ) & _etext ;
init_mm . end_data = ( unsigned long ) & _edata ;
init_mm . brk = ( unsigned long ) & _end ;
/* min_low_pfn points to the start of DRAM, start_pfn points
* to the first DRAM pages after the kernel , and max_low_pfn
* to the end of DRAM .
*/
/*
* partially used pages are not usable - thus
* we are rounding upwards :
*/
start_pfn = PFN_UP ( memory_start ) ; /* usually c0000000 + kernel + romfs */
max_pfn = PFN_DOWN ( ( unsigned long ) high_memory ) ; /* usually c0000000 + dram size */
/*
* Initialize the boot - time allocator ( start , end )
*
* We give it access to all our DRAM , but we could as well just have
* given it a small slice . No point in doing that though , unless we
* have non - contiguous memory and want the boot - stuff to be in , say ,
* the smallest area .
*
* It will put a bitmap of the allocated pages in the beginning
* of the range we give it , but it won ' t mark the bitmaps pages
* as reserved . We have to do that ourselves below .
*
* We need to use init_bootmem_node instead of init_bootmem
* because our map starts at a quite high address ( min_low_pfn ) .
*/
max_low_pfn = max_pfn ;
min_low_pfn = PAGE_OFFSET > > PAGE_SHIFT ;
bootmap_size = init_bootmem_node ( NODE_DATA ( 0 ) , start_pfn ,
2008-01-28 18:39:00 +03:00
min_low_pfn ,
2005-04-17 02:20:36 +04:00
max_low_pfn ) ;
/* And free all memory not belonging to the kernel (addr, size) */
free_bootmem ( PFN_PHYS ( start_pfn ) , PFN_PHYS ( max_pfn - start_pfn ) ) ;
/*
* Reserve the bootmem bitmap itself as well . We do this in two
* steps ( first step was init_bootmem ( ) ) because this catches
* the ( very unlikely ) case of us accidentally initializing the
* bootmem allocator with an invalid RAM area .
*
* Arguments are start , size
*/
2008-02-07 11:15:17 +03:00
reserve_bootmem ( PFN_PHYS ( start_pfn ) , bootmap_size , BOOTMEM_DEFAULT ) ;
2005-04-17 02:20:36 +04:00
/* paging_init() sets up the MMU and marks all pages as reserved */
paging_init ( ) ;
2005-07-27 22:44:38 +04:00
* cmdline_p = cris_command_line ;
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_ETRAX_CMDLINE
2005-07-27 22:44:38 +04:00
if ( ! strcmp ( cris_command_line , " " ) ) {
strlcpy ( cris_command_line , CONFIG_ETRAX_CMDLINE , COMMAND_LINE_SIZE ) ;
cris_command_line [ COMMAND_LINE_SIZE - 1 ] = ' \0 ' ;
}
# endif
2005-04-17 02:20:36 +04:00
/* Save command line for future references. */
2007-02-12 11:54:09 +03:00
memcpy ( boot_command_line , cris_command_line , COMMAND_LINE_SIZE ) ;
boot_command_line [ COMMAND_LINE_SIZE - 1 ] = ' \0 ' ;
2005-04-17 02:20:36 +04:00
/* give credit for the CRIS port */
show_etrax_copyright ( ) ;
2005-07-27 22:44:38 +04:00
/* Setup utsname */
2006-10-02 13:18:13 +04:00
strcpy ( init_utsname ( ) - > machine , cris_machine_name ) ;
2005-04-17 02:20:36 +04:00
}
static void * c_start ( struct seq_file * m , loff_t * pos )
{
2009-03-16 06:41:46 +03:00
return * pos < nr_cpu_ids ? ( void * ) ( int ) ( * pos + 1 ) : NULL ;
2005-04-17 02:20:36 +04:00
}
static void * c_next ( struct seq_file * m , void * v , loff_t * pos )
{
+ + * pos ;
2005-07-27 22:44:38 +04:00
return c_start ( m , pos ) ;
2005-04-17 02:20:36 +04:00
}
static void c_stop ( struct seq_file * m , void * v )
{
}
extern int show_cpuinfo ( struct seq_file * m , void * v ) ;
2008-01-28 18:39:00 +03:00
const struct seq_operations cpuinfo_op = {
2005-04-17 02:20:36 +04:00
. start = c_start ,
. next = c_next ,
. stop = c_stop ,
. show = show_cpuinfo ,
} ;
2008-01-28 18:39:00 +03:00
static int __init topology_init ( void )
{
int i ;
for_each_possible_cpu ( i ) {
return register_cpu ( & cpu_devices [ i ] , i ) ;
}
return 0 ;
}
subsys_initcall ( topology_init ) ;
2005-04-17 02:20:36 +04:00