| /* | |
| * 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. | |
| * Copyright (C) 2013 Imagination Technologies Ltd. | |
| */ | |
| #include <linux/init.h> | |
| #include <linux/libfdt.h> | |
| #include <linux/of_platform.h> | |
| #include <linux/of_fdt.h> | |
| #include <asm/prom.h> | |
| #include <asm/fw/fw.h> | |
| #include <asm/mips-boards/generic.h> | |
| const char *get_system_type(void) | |
| { | |
| return "MIPS SEAD3"; | |
| } | |
| 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; | |
| offset = fdt_path_offset(__dtb_start, "/memory"); | |
| 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 | |
| */ | |
| prop_value = fdt_getprop(__dtb_start, offset, "reg", &prop_len); | |
| new_value = be64_to_cpu(*prop_value); | |
| new_value = (new_value & ~0xffffffffllu) | memsize; | |
| fdt_setprop_inplace_u64(__dtb_start, offset, "reg", new_value); | |
| } | |
| } | |
| void __init plat_mem_setup(void) | |
| { | |
| /* allow command line/bootloader env to override memory size in DT */ | |
| parse_memsize_param(); | |
| /* | |
| * Load the builtin devicetree. This causes the chosen node to be | |
| * parsed resulting in our memory appearing | |
| */ | |
| __dt_setup_arch(__dtb_start); | |
| } | |
| void __init device_tree_init(void) | |
| { | |
| if (!initial_boot_params) | |
| return; | |
| unflatten_and_copy_device_tree(); | |
| } | |
| static int __init customize_machine(void) | |
| { | |
| of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | |
| return 0; | |
| } | |
| arch_initcall(customize_machine); |