]>
Commit | Line | Data |
---|---|---|
3070033a SH |
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. | |
44327236 | 7 | * Copyright (C) 2013 Imagination Technologies Ltd. |
3070033a SH |
8 | */ |
9 | #include <linux/init.h> | |
44327236 | 10 | #include <linux/libfdt.h> |
9b731009 SH |
11 | #include <linux/of_platform.h> |
12 | #include <linux/of_fdt.h> | |
9b731009 | 13 | |
089a49b6 | 14 | #include <asm/prom.h> |
44327236 | 15 | #include <asm/fw/fw.h> |
089a49b6 | 16 | |
9b731009 | 17 | #include <asm/mips-boards/generic.h> |
3070033a | 18 | |
3070033a SH |
19 | const char *get_system_type(void) |
20 | { | |
21 | return "MIPS SEAD3"; | |
22 | } | |
23 | ||
44327236 QY |
24 | static 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 | ||
39 | static 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 | ||
51 | static 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 | ||
62 | static 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 | ||
0cdde839 | 72 | offset = fdt_path_offset(__dtb_start, "/memory"); |
44327236 QY |
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 | */ | |
0cdde839 | 79 | prop_value = fdt_getprop(__dtb_start, offset, "reg", &prop_len); |
44327236 QY |
80 | new_value = be64_to_cpu(*prop_value); |
81 | new_value = (new_value & ~0xffffffffllu) | memsize; | |
0cdde839 | 82 | fdt_setprop_inplace_u64(__dtb_start, offset, "reg", new_value); |
44327236 QY |
83 | } |
84 | } | |
85 | ||
3070033a SH |
86 | void __init plat_mem_setup(void) |
87 | { | |
44327236 QY |
88 | /* allow command line/bootloader env to override memory size in DT */ |
89 | parse_memsize_param(); | |
90 | ||
9b731009 SH |
91 | /* |
92 | * Load the builtin devicetree. This causes the chosen node to be | |
93 | * parsed resulting in our memory appearing | |
94 | */ | |
0cdde839 | 95 | __dt_setup_arch(__dtb_start); |
9b731009 SH |
96 | } |
97 | ||
98 | void __init device_tree_init(void) | |
99 | { | |
9b731009 SH |
100 | if (!initial_boot_params) |
101 | return; | |
102 | ||
7e8a2762 | 103 | unflatten_and_copy_device_tree(); |
3070033a | 104 | } |
187e7c5f QY |
105 | |
106 | static int __init customize_machine(void) | |
107 | { | |
108 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | |
109 | return 0; | |
110 | } | |
111 | arch_initcall(customize_machine); |