diff options
Diffstat (limited to 'arch/mips/mti-malta/malta-memory.c')
-rw-r--r-- | arch/mips/mti-malta/malta-memory.c | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/arch/mips/mti-malta/malta-memory.c b/arch/mips/mti-malta/malta-memory.c index 1f73d63e92a7..6d0f4ab3632d 100644 --- a/arch/mips/mti-malta/malta-memory.c +++ b/arch/mips/mti-malta/malta-memory.c | |||
@@ -24,22 +24,30 @@ static fw_memblock_t mdesc[FW_MAX_MEMBLOCKS]; | |||
24 | /* determined physical memory size, not overridden by command line args */ | 24 | /* determined physical memory size, not overridden by command line args */ |
25 | unsigned long physical_memsize = 0L; | 25 | unsigned long physical_memsize = 0L; |
26 | 26 | ||
27 | fw_memblock_t * __init fw_getmdesc(void) | 27 | fw_memblock_t * __init fw_getmdesc(int eva) |
28 | { | 28 | { |
29 | char *memsize_str, *ptr; | 29 | char *memsize_str, *ememsize_str __maybe_unused = NULL, *ptr; |
30 | unsigned int memsize; | 30 | unsigned long memsize, ememsize __maybe_unused = 0; |
31 | static char cmdline[COMMAND_LINE_SIZE] __initdata; | 31 | static char cmdline[COMMAND_LINE_SIZE] __initdata; |
32 | long val; | ||
33 | int tmp; | 32 | int tmp; |
34 | 33 | ||
35 | /* otherwise look in the environment */ | 34 | /* otherwise look in the environment */ |
35 | |||
36 | memsize_str = fw_getenv("memsize"); | 36 | memsize_str = fw_getenv("memsize"); |
37 | if (!memsize_str) { | 37 | if (memsize_str) |
38 | tmp = kstrtol(memsize_str, 0, &memsize); | ||
39 | if (eva) { | ||
40 | /* Look for ememsize for EVA */ | ||
41 | ememsize_str = fw_getenv("ememsize"); | ||
42 | if (ememsize_str) | ||
43 | tmp = kstrtol(ememsize_str, 0, &ememsize); | ||
44 | } | ||
45 | if (!memsize && !ememsize) { | ||
38 | pr_warn("memsize not set in YAMON, set to default (32Mb)\n"); | 46 | pr_warn("memsize not set in YAMON, set to default (32Mb)\n"); |
39 | physical_memsize = 0x02000000; | 47 | physical_memsize = 0x02000000; |
40 | } else { | 48 | } else { |
41 | tmp = kstrtol(memsize_str, 0, &val); | 49 | /* If ememsize is set, then set physical_memsize to that */ |
42 | physical_memsize = (unsigned long)val; | 50 | physical_memsize = ememsize ? : memsize; |
43 | } | 51 | } |
44 | 52 | ||
45 | #ifdef CONFIG_CPU_BIG_ENDIAN | 53 | #ifdef CONFIG_CPU_BIG_ENDIAN |
@@ -54,20 +62,30 @@ fw_memblock_t * __init fw_getmdesc(void) | |||
54 | ptr = strstr(cmdline, "memsize="); | 62 | ptr = strstr(cmdline, "memsize="); |
55 | if (ptr && (ptr != cmdline) && (*(ptr - 1) != ' ')) | 63 | if (ptr && (ptr != cmdline) && (*(ptr - 1) != ' ')) |
56 | ptr = strstr(ptr, " memsize="); | 64 | ptr = strstr(ptr, " memsize="); |
65 | /* And now look for ememsize */ | ||
66 | if (eva) { | ||
67 | ptr = strstr(cmdline, "ememsize="); | ||
68 | if (ptr && (ptr != cmdline) && (*(ptr - 1) != ' ')) | ||
69 | ptr = strstr(ptr, " ememsize="); | ||
70 | } | ||
57 | 71 | ||
58 | if (ptr) | 72 | if (ptr) |
59 | memsize = memparse(ptr + 8, &ptr); | 73 | memsize = memparse(ptr + 8 + (eva ? 1 : 0), &ptr); |
60 | else | 74 | else |
61 | memsize = physical_memsize; | 75 | memsize = physical_memsize; |
62 | 76 | ||
77 | /* Last 64K for HIGHMEM arithmetics */ | ||
78 | if (memsize > 0x7fff0000) | ||
79 | memsize = 0x7fff0000; | ||
80 | |||
63 | memset(mdesc, 0, sizeof(mdesc)); | 81 | memset(mdesc, 0, sizeof(mdesc)); |
64 | 82 | ||
65 | mdesc[0].type = fw_dontuse; | 83 | mdesc[0].type = fw_dontuse; |
66 | mdesc[0].base = 0x00000000; | 84 | mdesc[0].base = PHYS_OFFSET; |
67 | mdesc[0].size = 0x00001000; | 85 | mdesc[0].size = 0x00001000; |
68 | 86 | ||
69 | mdesc[1].type = fw_code; | 87 | mdesc[1].type = fw_code; |
70 | mdesc[1].base = 0x00001000; | 88 | mdesc[1].base = mdesc[0].base + 0x00001000UL; |
71 | mdesc[1].size = 0x000ef000; | 89 | mdesc[1].size = 0x000ef000; |
72 | 90 | ||
73 | /* | 91 | /* |
@@ -78,21 +96,27 @@ fw_memblock_t * __init fw_getmdesc(void) | |||
78 | * devices. | 96 | * devices. |
79 | */ | 97 | */ |
80 | mdesc[2].type = fw_dontuse; | 98 | mdesc[2].type = fw_dontuse; |
81 | mdesc[2].base = 0x000f0000; | 99 | mdesc[2].base = mdesc[0].base + 0x000f0000UL; |
82 | mdesc[2].size = 0x00010000; | 100 | mdesc[2].size = 0x00010000; |
83 | 101 | ||
84 | mdesc[3].type = fw_dontuse; | 102 | mdesc[3].type = fw_dontuse; |
85 | mdesc[3].base = 0x00100000; | 103 | mdesc[3].base = mdesc[0].base + 0x00100000UL; |
86 | mdesc[3].size = CPHYSADDR(PFN_ALIGN((unsigned long)&_end)) - | 104 | mdesc[3].size = CPHYSADDR(PFN_ALIGN((unsigned long)&_end)) - |
87 | mdesc[3].base; | 105 | 0x00100000UL; |
88 | 106 | ||
89 | mdesc[4].type = fw_free; | 107 | mdesc[4].type = fw_free; |
90 | mdesc[4].base = CPHYSADDR(PFN_ALIGN(&_end)); | 108 | mdesc[4].base = mdesc[0].base + CPHYSADDR(PFN_ALIGN(&_end)); |
91 | mdesc[4].size = memsize - mdesc[4].base; | 109 | mdesc[4].size = memsize - CPHYSADDR(mdesc[4].base); |
92 | 110 | ||
93 | return &mdesc[0]; | 111 | return &mdesc[0]; |
94 | } | 112 | } |
95 | 113 | ||
114 | static void free_init_pages_eva_malta(void *begin, void *end) | ||
115 | { | ||
116 | free_init_pages("unused kernel", __pa_symbol((unsigned long *)begin), | ||
117 | __pa_symbol((unsigned long *)end)); | ||
118 | } | ||
119 | |||
96 | static int __init fw_memtype_classify(unsigned int type) | 120 | static int __init fw_memtype_classify(unsigned int type) |
97 | { | 121 | { |
98 | switch (type) { | 122 | switch (type) { |
@@ -109,7 +133,9 @@ void __init fw_meminit(void) | |||
109 | { | 133 | { |
110 | fw_memblock_t *p; | 134 | fw_memblock_t *p; |
111 | 135 | ||
112 | p = fw_getmdesc(); | 136 | p = fw_getmdesc(config_enabled(CONFIG_EVA)); |
137 | free_init_pages_eva = (config_enabled(CONFIG_EVA) ? | ||
138 | free_init_pages_eva_malta : NULL); | ||
113 | 139 | ||
114 | while (p->size) { | 140 | while (p->size) { |
115 | long type; | 141 | long type; |