2005-04-16 15:20:36 -07:00
/*
* linux / arch / m68knommu / kernel / setup . c
*
2007-07-15 23:38:33 -07:00
* Copyright ( C ) 1999 - 2007 Greg Ungerer ( gerg @ snapgear . com )
* Copyright ( C ) 1998 , 1999 D . Jeff Dionne < jeff @ uClinux . org >
2005-04-16 15:20:36 -07:00
* Copyleft ( ) ) 2000 James D . Schettine { james @ telos - systems . com }
* Copyright ( C ) 1998 Kenneth Albanowski < kjahds @ kjahds . com >
* Copyright ( C ) 1995 Hamish Macdonald
2005-09-02 10:42:52 +10:00
* Copyright ( C ) 2000 Lineo Inc . ( www . lineo . com )
2005-04-16 15:20:36 -07:00
* Copyright ( C ) 2001 Lineo , Inc . < www . lineo . com >
*
* 68 VZ328 Fixes / support Evan Stawnyczy < e @ lineo . ca >
*/
/*
* This file handles the architecture - dependent parts of system setup
*/
# include <linux/kernel.h>
# include <linux/sched.h>
# include <linux/delay.h>
# include <linux/interrupt.h>
# include <linux/fb.h>
2005-09-02 10:42:52 +10:00
# include <linux/module.h>
2008-07-23 21:28:13 -07:00
# include <linux/mm.h>
2005-04-16 15:20:36 -07:00
# include <linux/console.h>
# include <linux/errno.h>
# include <linux/string.h>
# include <linux/bootmem.h>
# include <linux/seq_file.h>
# include <linux/init.h>
2009-09-18 13:49:36 -04:00
# include <linux/initrd.h>
# include <linux/root_dev.h>
2012-01-23 13:25:56 +10:00
# include <linux/rtc.h>
2005-04-16 15:20:36 -07:00
# include <asm/setup.h>
# include <asm/irq.h>
# include <asm/machdep.h>
# include <asm/pgtable.h>
2011-08-22 17:07:40 +10:00
# include <asm/sections.h>
2005-04-16 15:20:36 -07:00
unsigned long memory_start ;
unsigned long memory_end ;
2005-09-02 10:42:52 +10:00
EXPORT_SYMBOL ( memory_start ) ;
EXPORT_SYMBOL ( memory_end ) ;
2007-02-12 00:54:14 -08:00
char __initdata command_line [ COMMAND_LINE_SIZE ] ;
2005-04-16 15:20:36 -07:00
/* machine dependent timer functions */
2012-01-23 15:34:58 +10:00
void ( * mach_sched_init ) ( irq_handler_t handler ) __initdata = NULL ;
2007-07-15 23:38:33 -07:00
int ( * mach_set_clock_mmss ) ( unsigned long ) ;
2012-01-23 13:25:56 +10:00
int ( * mach_hwclk ) ( int , struct rtc_time * ) ;
2007-07-15 23:38:33 -07:00
/* machine dependent reboot functions */
void ( * mach_reset ) ( void ) ;
void ( * mach_halt ) ( void ) ;
void ( * mach_power_off ) ( void ) ;
2005-04-16 15:20:36 -07:00
2013-02-14 21:18:34 +00:00
# ifdef CONFIG_M68000
# define CPU_NAME "MC68000"
# endif
2005-04-16 15:20:36 -07:00
# ifdef CONFIG_M68328
2010-11-02 17:13:27 +10:00
# define CPU_NAME "MC68328"
2005-04-16 15:20:36 -07:00
# endif
# ifdef CONFIG_M68EZ328
2010-11-02 17:13:27 +10:00
# define CPU_NAME "MC68EZ328"
2005-04-16 15:20:36 -07:00
# endif
# ifdef CONFIG_M68VZ328
2010-11-02 17:13:27 +10:00
# define CPU_NAME "MC68VZ328"
2005-04-16 15:20:36 -07:00
# endif
# ifdef CONFIG_M68360
2010-11-02 17:13:27 +10:00
# define CPU_NAME "MC68360"
2005-04-16 15:20:36 -07:00
# endif
2010-11-02 17:13:27 +10:00
# ifndef CPU_NAME
# define CPU_NAME "UNKNOWN"
2005-04-16 15:20:36 -07:00
# endif
2010-11-02 17:40:37 +10:00
/*
* Different cores have different instruction execution timings .
* The old / traditional 68000 cores are basically all the same , at 16.
* The ColdFire cores vary a little , their values are defined in their
* headers . We default to the standard 68000 value here .
*/
# ifndef CPU_INSTR_PER_JIFFY
# define CPU_INSTR_PER_JIFFY 16
# endif
2009-09-18 13:49:36 -04:00
# if defined(CONFIG_UBOOT)
/*
* parse_uboot_commandline
*
* Copies u - boot commandline arguments and store them in the proper linux
* variables .
*
* Assumes :
* _init_sp global contains the address in the stack pointer when the
* kernel starts ( see head . S : : _start )
*
* U - Boot calling convention :
* ( * kernel ) ( kbd , initrd_start , initrd_end , cmd_start , cmd_end ) ;
*
* _init_sp can be parsed as such
*
* _init_sp + 00 = u - boot cmd after jsr into kernel ( skip )
* _init_sp + 04 = & kernel board_info ( residual data )
* _init_sp + 08 = & initrd_start
* _init_sp + 12 = & initrd_end
* _init_sp + 16 = & cmd_start
* _init_sp + 20 = & cmd_end
*
* This also assumes that the memory locations pointed to are still
* unmodified . U - boot places them near the end of external SDRAM .
*
* Argument ( s ) :
* commandp = the linux commandline arg container to fill .
* size = the sizeof commandp .
*
* Returns :
*/
void parse_uboot_commandline ( char * commandp , int size )
{
extern unsigned long _init_sp ;
unsigned long * sp ;
unsigned long uboot_kbd ;
unsigned long uboot_initrd_start , uboot_initrd_end ;
unsigned long uboot_cmd_start , uboot_cmd_end ;
sp = ( unsigned long * ) _init_sp ;
uboot_kbd = sp [ 1 ] ;
uboot_initrd_start = sp [ 2 ] ;
uboot_initrd_end = sp [ 3 ] ;
uboot_cmd_start = sp [ 4 ] ;
uboot_cmd_end = sp [ 5 ] ;
if ( uboot_cmd_start & & uboot_cmd_end )
strncpy ( commandp , ( const char * ) uboot_cmd_start , size ) ;
# if defined(CONFIG_BLK_DEV_INITRD)
if ( uboot_initrd_start & & uboot_initrd_end & &
( uboot_initrd_end > uboot_initrd_start ) ) {
initrd_start = uboot_initrd_start ;
initrd_end = uboot_initrd_end ;
ROOT_DEV = Root_RAM0 ;
printk ( KERN_INFO " initrd at 0x%lx:0x%lx \n " ,
initrd_start , initrd_end ) ;
}
# endif /* if defined(CONFIG_BLK_DEV_INITRD) */
}
# endif /* #if defined(CONFIG_UBOOT) */
2007-10-24 12:03:41 +10:00
void __init setup_arch ( char * * cmdline_p )
2005-04-16 15:20:36 -07:00
{
int bootmap_size ;
memory_start = PAGE_ALIGN ( _ramstart ) ;
2007-07-15 23:38:33 -07:00
memory_end = _ramend ;
2005-04-16 15:20:36 -07:00
init_mm . start_code = ( unsigned long ) & _stext ;
init_mm . end_code = ( unsigned long ) & _etext ;
init_mm . end_data = ( unsigned long ) & _edata ;
2005-09-02 10:42:52 +10:00
init_mm . brk = ( unsigned long ) 0 ;
2005-04-16 15:20:36 -07:00
config_BSP ( & command_line [ 0 ] , sizeof ( command_line ) ) ;
2007-07-25 22:07:20 +10:00
# if defined(CONFIG_BOOTPARAM)
strncpy ( & command_line [ 0 ] , CONFIG_BOOTPARAM_STRING , sizeof ( command_line ) ) ;
command_line [ sizeof ( command_line ) - 1 ] = 0 ;
2009-09-18 13:49:36 -04:00
# endif /* CONFIG_BOOTPARAM */
# if defined(CONFIG_UBOOT)
/* CONFIG_UBOOT and CONFIG_BOOTPARAM defined, concatenate cmdline */
# if defined(CONFIG_BOOTPARAM)
/* Add the whitespace separator */
command_line [ strlen ( CONFIG_BOOTPARAM_STRING ) ] = ' ' ;
/* Parse uboot command line into the rest of the buffer */
parse_uboot_commandline (
& command_line [ ( strlen ( CONFIG_BOOTPARAM_STRING ) + 1 ) ] ,
( sizeof ( command_line ) -
( strlen ( CONFIG_BOOTPARAM_STRING ) + 1 ) ) ) ;
/* Only CONFIG_UBOOT defined, create cmdline */
# else
parse_uboot_commandline ( & command_line [ 0 ] , sizeof ( command_line ) ) ;
# endif /* CONFIG_BOOTPARAM */
command_line [ sizeof ( command_line ) - 1 ] = 0 ;
# endif /* CONFIG_UBOOT */
2007-07-25 22:07:20 +10:00
2010-11-02 17:13:27 +10:00
printk ( KERN_INFO " \x0F \r \n \n uClinux/ " CPU_NAME " \n " ) ;
2005-04-16 15:20:36 -07:00
# ifdef CONFIG_UCDIMM
printk ( KERN_INFO " uCdimm by Lineo, Inc. <www.lineo.com> \n " ) ;
# endif
# ifdef CONFIG_M68VZ328
printk ( KERN_INFO " M68VZ328 support by Evan Stawnyczy <e@lineo.ca> \n " ) ;
# endif
# ifdef CONFIG_COLDFIRE
printk ( KERN_INFO " COLDFIRE port done by Greg Ungerer, gerg@snapgear.com \n " ) ;
# ifdef CONFIG_M5307
printk ( KERN_INFO " Modified for M5307 by Dave Miller, dmiller@intellistor.com \n " ) ;
# endif
# ifdef CONFIG_ELITE
printk ( KERN_INFO " Modified for M5206eLITE by Rob Scott, rscott@mtrob.fdns.net \n " ) ;
2005-09-02 10:42:52 +10:00
# endif
2005-04-16 15:20:36 -07:00
# endif
printk ( KERN_INFO " Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne \n " ) ;
# if defined( CONFIG_PILOT ) && defined( CONFIG_M68328 )
printk ( KERN_INFO " TRG SuperPilot FLASH card support <info@trgnet.com> \n " ) ;
# endif
# if defined( CONFIG_PILOT ) && defined( CONFIG_M68EZ328 )
printk ( KERN_INFO " PalmV support by Lineo Inc. <jeff@uclinux.com> \n " ) ;
# endif
# if defined (CONFIG_M68360)
printk ( KERN_INFO " QUICC port done by SED Systems <hamilton@sedsystems.ca>, \n " ) ;
printk ( KERN_INFO " based on 2.0.38 port by Lineo Inc. <mleslie@lineo.com>. \n " ) ;
# endif
# ifdef CONFIG_DRAGEN2
printk ( KERN_INFO " DragonEngine II board support by Georges Menie \n " ) ;
# endif
2005-09-02 10:42:52 +10:00
# ifdef CONFIG_M5235EVB
2008-05-01 12:16:33 +10:00
printk ( KERN_INFO " Motorola M5235EVB support (C)2005 Syn-tech Systems, Inc. (Jate Sujjavanich) \n " ) ;
2005-09-02 10:42:52 +10:00
# endif
2005-04-16 15:20:36 -07:00
2012-05-31 21:39:13 +02:00
pr_debug ( " KERNEL -> TEXT=0x%p-0x%p DATA=0x%p-0x%p BSS=0x%p-0x%p \n " ,
2012-05-31 21:46:03 +02:00
_stext , _etext , _sdata , _edata , __bss_start , __bss_stop ) ;
2012-05-31 21:39:13 +02:00
pr_debug ( " MEMORY -> ROMFS=0x%p-0x%06lx MEM=0x%06lx-0x%06lx \n " ,
2012-05-31 21:46:03 +02:00
__bss_stop , memory_start , memory_start , memory_end ) ;
2005-04-16 15:20:36 -07:00
/* Keep a copy of command line */
* cmdline_p = & command_line [ 0 ] ;
2007-02-12 00:54:14 -08:00
memcpy ( boot_command_line , command_line , COMMAND_LINE_SIZE ) ;
boot_command_line [ COMMAND_LINE_SIZE - 1 ] = 0 ;
2005-04-16 15:20:36 -07:00
# if defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_DUMMY_CONSOLE)
conswitchp = & dummy_con ;
# endif
/*
* Give all the memory to the bootmap allocator , tell it to put the
* boot mem_map at the start of memory .
*/
bootmap_size = init_bootmem_node (
NODE_DATA ( 0 ) ,
memory_start > > PAGE_SHIFT , /* map goes here */
PAGE_OFFSET > > PAGE_SHIFT , /* 0 on coldfire */
memory_end > > PAGE_SHIFT ) ;
/*
* Free the usable memory , we have to make sure we do not free
* the bootmem bitmap so we then reserve it after freeing it : - )
*/
free_bootmem ( memory_start , memory_end - memory_start ) ;
2008-02-07 00:15:17 -08:00
reserve_bootmem ( memory_start , bootmap_size , BOOTMEM_DEFAULT ) ;
2005-04-16 15:20:36 -07:00
2009-09-18 13:49:36 -04:00
# if defined(CONFIG_UBOOT) && defined(CONFIG_BLK_DEV_INITRD)
if ( ( initrd_start > 0 ) & & ( initrd_start < initrd_end ) & &
( initrd_end < memory_end ) )
reserve_bootmem ( initrd_start , initrd_end - initrd_start ,
BOOTMEM_DEFAULT ) ;
# endif /* if defined(CONFIG_BLK_DEV_INITRD) */
2005-04-16 15:20:36 -07:00
/*
* Get kmalloc into gear .
*/
paging_init ( ) ;
}
/*
* Get CPU information for use by the procfs .
*/
static int show_cpuinfo ( struct seq_file * m , void * v )
{
2007-07-20 00:31:47 -07:00
char * cpu , * mmu , * fpu ;
u_long clockfreq ;
2005-04-16 15:20:36 -07:00
2010-11-02 17:13:27 +10:00
cpu = CPU_NAME ;
2007-07-20 00:31:47 -07:00
mmu = " none " ;
fpu = " none " ;
2010-11-02 17:40:37 +10:00
clockfreq = ( loops_per_jiffy * HZ ) * CPU_INSTR_PER_JIFFY ;
2007-07-20 00:31:47 -07:00
seq_printf ( m , " CPU: \t \t %s \n "
" MMU: \t \t %s \n "
" FPU: \t \t %s \n "
" Clocking: \t %lu.%1luMHz \n "
" BogoMips: \t %lu.%02lu \n "
" Calibration: \t %lu loops \n " ,
cpu , mmu , fpu ,
clockfreq / 1000000 ,
( clockfreq / 100000 ) % 10 ,
( loops_per_jiffy * HZ ) / 500000 ,
( ( loops_per_jiffy * HZ ) / 5000 ) % 100 ,
( loops_per_jiffy * HZ ) ) ;
2005-04-16 15:20:36 -07:00
return 0 ;
}
static void * c_start ( struct seq_file * m , loff_t * pos )
{
return * pos < NR_CPUS ? ( ( void * ) 0x12345678 ) : NULL ;
}
static void * c_next ( struct seq_file * m , void * v , loff_t * pos )
{
+ + * pos ;
return c_start ( m , pos ) ;
}
static void c_stop ( struct seq_file * m , void * v )
{
}
2008-02-08 04:21:19 -08:00
const struct seq_operations cpuinfo_op = {
2005-04-16 15:20:36 -07:00
. start = c_start ,
. next = c_next ,
. stop = c_stop ,
. show = show_cpuinfo ,
} ;