2012-05-31 01:02:49 +04:00
/*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* Copyright ( C ) 2012 MIPS Technologies , Inc . All rights reserved .
2013-12-06 15:00:42 +04:00
* Copyright ( C ) 2013 Imagination Technologies Ltd .
2012-05-31 01:02:49 +04:00
*/
# include <linux/init.h>
2013-12-06 15:00:42 +04:00
# include <linux/libfdt.h>
2013-01-17 21:37:03 +04:00
# include <linux/of_platform.h>
# include <linux/of_fdt.h>
2013-09-07 23:58:54 +04:00
# include <asm/prom.h>
2013-12-06 15:00:42 +04:00
# include <asm/fw/fw.h>
2013-09-07 23:58:54 +04:00
2013-01-17 21:37:03 +04:00
# include <asm/mips-boards/generic.h>
2012-05-31 01:02:49 +04:00
const char * get_system_type ( void )
{
return " MIPS SEAD3 " ;
}
2013-12-06 15:00:42 +04:00
static uint32_t get_memsize_from_cmdline ( void )
{
int memsize = 0 ;
char * p = arcs_cmdline ;
char * s = " memsize= " ;
p = strstr ( p , s ) ;
if ( p ) {
p + = strlen ( s ) ;
memsize = memparse ( p , NULL ) ;
}
return memsize ;
}
static uint32_t get_memsize_from_env ( void )
{
int memsize = 0 ;
char * p ;
p = fw_getenv ( " memsize " ) ;
if ( p )
memsize = memparse ( p , NULL ) ;
return memsize ;
}
static uint32_t get_memsize ( void )
{
uint32_t memsize ;
memsize = get_memsize_from_cmdline ( ) ;
if ( memsize )
return memsize ;
return get_memsize_from_env ( ) ;
}
static void __init parse_memsize_param ( void )
{
int offset ;
const uint64_t * prop_value ;
int prop_len ;
uint32_t memsize = get_memsize ( ) ;
if ( ! memsize )
return ;
2014-04-01 00:13:07 +04:00
offset = fdt_path_offset ( __dtb_start , " /memory " ) ;
2013-12-06 15:00:42 +04:00
if ( offset > 0 ) {
uint64_t new_value ;
/*
* reg contains 2 32 - bits BE values , offset and size . We just
* want to replace the size value without affecting the offset
*/
2014-04-01 00:13:07 +04:00
prop_value = fdt_getprop ( __dtb_start , offset , " reg " , & prop_len ) ;
2013-12-06 15:00:42 +04:00
new_value = be64_to_cpu ( * prop_value ) ;
new_value = ( new_value & ~ 0xffffffffllu ) | memsize ;
2014-04-01 00:13:07 +04:00
fdt_setprop_inplace_u64 ( __dtb_start , offset , " reg " , new_value ) ;
2013-12-06 15:00:42 +04:00
}
}
2012-05-31 01:02:49 +04:00
void __init plat_mem_setup ( void )
{
2013-12-06 15:00:42 +04:00
/* allow command line/bootloader env to override memory size in DT */
parse_memsize_param ( ) ;
2013-01-17 21:37:03 +04:00
/*
* Load the builtin devicetree . This causes the chosen node to be
* parsed resulting in our memory appearing
*/
2014-04-01 00:13:07 +04:00
__dt_setup_arch ( __dtb_start ) ;
2013-01-17 21:37:03 +04:00
}
void __init device_tree_init ( void )
{
if ( ! initial_boot_params )
return ;
2013-12-06 15:00:45 +04:00
unflatten_and_copy_device_tree ( ) ;
2012-05-31 01:02:49 +04:00
}
2013-12-06 15:00:44 +04:00
static int __init customize_machine ( void )
{
of_platform_populate ( NULL , of_default_bus_match_table , NULL , NULL ) ;
return 0 ;
}
arch_initcall ( customize_machine ) ;