1/* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved. 7 * Copyright (C) 2013 Imagination Technologies Ltd. 8 */ 9#include <linux/init.h> 10#include <linux/libfdt.h> 11#include <linux/of_platform.h> 12#include <linux/of_fdt.h> 13 14#include <asm/prom.h> 15#include <asm/fw/fw.h> 16 17#include <asm/mips-boards/generic.h> 18 19const char *get_system_type(void) 20{ 21 return "MIPS SEAD3"; 22} 23 24static uint32_t get_memsize_from_cmdline(void) 25{ 26 int memsize = 0; 27 char *p = arcs_cmdline; 28 char *s = "memsize="; 29 30 p = strstr(p, s); 31 if (p) { 32 p += strlen(s); 33 memsize = memparse(p, NULL); 34 } 35 36 return memsize; 37} 38 39static uint32_t get_memsize_from_env(void) 40{ 41 int memsize = 0; 42 char *p; 43 44 p = fw_getenv("memsize"); 45 if (p) 46 memsize = memparse(p, NULL); 47 48 return memsize; 49} 50 51static uint32_t get_memsize(void) 52{ 53 uint32_t memsize; 54 55 memsize = get_memsize_from_cmdline(); 56 if (memsize) 57 return memsize; 58 59 return get_memsize_from_env(); 60} 61 62static void __init parse_memsize_param(void) 63{ 64 int offset; 65 const uint64_t *prop_value; 66 int prop_len; 67 uint32_t memsize = get_memsize(); 68 69 if (!memsize) 70 return; 71 72 offset = fdt_path_offset(__dtb_start, "/memory"); 73 if (offset > 0) { 74 uint64_t new_value; 75 /* 76 * reg contains 2 32-bits BE values, offset and size. We just 77 * want to replace the size value without affecting the offset 78 */ 79 prop_value = fdt_getprop(__dtb_start, offset, "reg", &prop_len); 80 new_value = be64_to_cpu(*prop_value); 81 new_value = (new_value & ~0xffffffffllu) | memsize; 82 fdt_setprop_inplace_u64(__dtb_start, offset, "reg", new_value); 83 } 84} 85 86void __init plat_mem_setup(void) 87{ 88 /* allow command line/bootloader env to override memory size in DT */ 89 parse_memsize_param(); 90 91 /* 92 * Load the builtin devicetree. This causes the chosen node to be 93 * parsed resulting in our memory appearing 94 */ 95 __dt_setup_arch(__dtb_start); 96} 97 98void __init device_tree_init(void) 99{ 100 if (!initial_boot_params) 101 return; 102 103 unflatten_and_copy_device_tree(); 104} 105 106static int __init customize_machine(void) 107{ 108 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 109 return 0; 110} 111arch_initcall(customize_machine); 112