diff options
Diffstat (limited to 'arch/sh/kernel/setup.c')
-rw-r--r-- | arch/sh/kernel/setup.c | 80 |
1 files changed, 59 insertions, 21 deletions
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index dd38338553ef..f9d44f8e0df6 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/clk.h> | 30 | #include <linux/clk.h> |
31 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
32 | #include <linux/platform_device.h> | 32 | #include <linux/platform_device.h> |
33 | #include <linux/lmb.h> | ||
33 | #include <asm/uaccess.h> | 34 | #include <asm/uaccess.h> |
34 | #include <asm/io.h> | 35 | #include <asm/io.h> |
35 | #include <asm/page.h> | 36 | #include <asm/page.h> |
@@ -48,6 +49,7 @@ | |||
48 | struct sh_cpuinfo cpu_data[NR_CPUS] __read_mostly = { | 49 | struct sh_cpuinfo cpu_data[NR_CPUS] __read_mostly = { |
49 | [0] = { | 50 | [0] = { |
50 | .type = CPU_SH_NONE, | 51 | .type = CPU_SH_NONE, |
52 | .family = CPU_FAMILY_UNKNOWN, | ||
51 | .loops_per_jiffy = 10000000, | 53 | .loops_per_jiffy = 10000000, |
52 | }, | 54 | }, |
53 | }; | 55 | }; |
@@ -233,39 +235,45 @@ void __init __add_active_range(unsigned int nid, unsigned long start_pfn, | |||
233 | void __init setup_bootmem_allocator(unsigned long free_pfn) | 235 | void __init setup_bootmem_allocator(unsigned long free_pfn) |
234 | { | 236 | { |
235 | unsigned long bootmap_size; | 237 | unsigned long bootmap_size; |
238 | unsigned long bootmap_pages, bootmem_paddr; | ||
239 | u64 total_pages = (lmb_end_of_DRAM() - __MEMORY_START) >> PAGE_SHIFT; | ||
240 | int i; | ||
241 | |||
242 | bootmap_pages = bootmem_bootmap_pages(total_pages); | ||
243 | |||
244 | bootmem_paddr = lmb_alloc(bootmap_pages << PAGE_SHIFT, PAGE_SIZE); | ||
236 | 245 | ||
237 | /* | 246 | /* |
238 | * Find a proper area for the bootmem bitmap. After this | 247 | * Find a proper area for the bootmem bitmap. After this |
239 | * bootstrap step all allocations (until the page allocator | 248 | * bootstrap step all allocations (until the page allocator |
240 | * is intact) must be done via bootmem_alloc(). | 249 | * is intact) must be done via bootmem_alloc(). |
241 | */ | 250 | */ |
242 | bootmap_size = init_bootmem_node(NODE_DATA(0), free_pfn, | 251 | bootmap_size = init_bootmem_node(NODE_DATA(0), |
252 | bootmem_paddr >> PAGE_SHIFT, | ||
243 | min_low_pfn, max_low_pfn); | 253 | min_low_pfn, max_low_pfn); |
244 | 254 | ||
245 | __add_active_range(0, min_low_pfn, max_low_pfn); | 255 | /* Add active regions with valid PFNs. */ |
246 | register_bootmem_low_pages(); | 256 | for (i = 0; i < lmb.memory.cnt; i++) { |
247 | 257 | unsigned long start_pfn, end_pfn; | |
248 | node_set_online(0); | 258 | start_pfn = lmb.memory.region[i].base >> PAGE_SHIFT; |
259 | end_pfn = start_pfn + lmb_size_pages(&lmb.memory, i); | ||
260 | __add_active_range(0, start_pfn, end_pfn); | ||
261 | } | ||
249 | 262 | ||
250 | /* | 263 | /* |
251 | * Reserve the kernel text and | 264 | * Add all physical memory to the bootmem map and mark each |
252 | * Reserve the bootmem bitmap. We do this in two steps (first step | 265 | * area as present. |
253 | * was init_bootmem()), because this catches the (definitely buggy) | ||
254 | * case of us accidentally initializing the bootmem allocator with | ||
255 | * an invalid RAM area. | ||
256 | */ | 266 | */ |
257 | reserve_bootmem(__MEMORY_START + CONFIG_ZERO_PAGE_OFFSET, | 267 | register_bootmem_low_pages(); |
258 | (PFN_PHYS(free_pfn) + bootmap_size + PAGE_SIZE - 1) - | ||
259 | (__MEMORY_START + CONFIG_ZERO_PAGE_OFFSET), | ||
260 | BOOTMEM_DEFAULT); | ||
261 | 268 | ||
262 | /* | 269 | /* Reserve the sections we're already using. */ |
263 | * Reserve physical pages below CONFIG_ZERO_PAGE_OFFSET. | 270 | for (i = 0; i < lmb.reserved.cnt; i++) |
264 | */ | 271 | reserve_bootmem(lmb.reserved.region[i].base, |
265 | if (CONFIG_ZERO_PAGE_OFFSET != 0) | 272 | lmb_size_bytes(&lmb.reserved, i), |
266 | reserve_bootmem(__MEMORY_START, CONFIG_ZERO_PAGE_OFFSET, | ||
267 | BOOTMEM_DEFAULT); | 273 | BOOTMEM_DEFAULT); |
268 | 274 | ||
275 | node_set_online(0); | ||
276 | |||
269 | sparse_memory_present_with_active_regions(0); | 277 | sparse_memory_present_with_active_regions(0); |
270 | 278 | ||
271 | #ifdef CONFIG_BLK_DEV_INITRD | 279 | #ifdef CONFIG_BLK_DEV_INITRD |
@@ -296,12 +304,37 @@ void __init setup_bootmem_allocator(unsigned long free_pfn) | |||
296 | static void __init setup_memory(void) | 304 | static void __init setup_memory(void) |
297 | { | 305 | { |
298 | unsigned long start_pfn; | 306 | unsigned long start_pfn; |
307 | u64 base = min_low_pfn << PAGE_SHIFT; | ||
308 | u64 size = (max_low_pfn << PAGE_SHIFT) - base; | ||
299 | 309 | ||
300 | /* | 310 | /* |
301 | * Partially used pages are not usable - thus | 311 | * Partially used pages are not usable - thus |
302 | * we are rounding upwards: | 312 | * we are rounding upwards: |
303 | */ | 313 | */ |
304 | start_pfn = PFN_UP(__pa(_end)); | 314 | start_pfn = PFN_UP(__pa(_end)); |
315 | |||
316 | lmb_add(base, size); | ||
317 | |||
318 | /* | ||
319 | * Reserve the kernel text and | ||
320 | * Reserve the bootmem bitmap. We do this in two steps (first step | ||
321 | * was init_bootmem()), because this catches the (definitely buggy) | ||
322 | * case of us accidentally initializing the bootmem allocator with | ||
323 | * an invalid RAM area. | ||
324 | */ | ||
325 | lmb_reserve(__MEMORY_START + CONFIG_ZERO_PAGE_OFFSET, | ||
326 | (PFN_PHYS(start_pfn) + PAGE_SIZE - 1) - | ||
327 | (__MEMORY_START + CONFIG_ZERO_PAGE_OFFSET)); | ||
328 | |||
329 | /* | ||
330 | * Reserve physical pages below CONFIG_ZERO_PAGE_OFFSET. | ||
331 | */ | ||
332 | if (CONFIG_ZERO_PAGE_OFFSET != 0) | ||
333 | lmb_reserve(__MEMORY_START, CONFIG_ZERO_PAGE_OFFSET); | ||
334 | |||
335 | lmb_analyze(); | ||
336 | lmb_dump_all(); | ||
337 | |||
305 | setup_bootmem_allocator(start_pfn); | 338 | setup_bootmem_allocator(start_pfn); |
306 | } | 339 | } |
307 | #else | 340 | #else |
@@ -372,10 +405,14 @@ void __init setup_arch(char **cmdline_p) | |||
372 | if (!memory_end) | 405 | if (!memory_end) |
373 | memory_end = memory_start + __MEMORY_SIZE; | 406 | memory_end = memory_start + __MEMORY_SIZE; |
374 | 407 | ||
375 | #ifdef CONFIG_CMDLINE_BOOL | 408 | #ifdef CONFIG_CMDLINE_OVERWRITE |
376 | strlcpy(command_line, CONFIG_CMDLINE, sizeof(command_line)); | 409 | strlcpy(command_line, CONFIG_CMDLINE, sizeof(command_line)); |
377 | #else | 410 | #else |
378 | strlcpy(command_line, COMMAND_LINE, sizeof(command_line)); | 411 | strlcpy(command_line, COMMAND_LINE, sizeof(command_line)); |
412 | #ifdef CONFIG_CMDLINE_EXTEND | ||
413 | strlcat(command_line, " ", sizeof(command_line)); | ||
414 | strlcat(command_line, CONFIG_CMDLINE, sizeof(command_line)); | ||
415 | #endif | ||
379 | #endif | 416 | #endif |
380 | 417 | ||
381 | /* Save unparsed command line copy for /proc/cmdline */ | 418 | /* Save unparsed command line copy for /proc/cmdline */ |
@@ -402,6 +439,7 @@ void __init setup_arch(char **cmdline_p) | |||
402 | nodes_clear(node_online_map); | 439 | nodes_clear(node_online_map); |
403 | 440 | ||
404 | /* Setup bootmem with available RAM */ | 441 | /* Setup bootmem with available RAM */ |
442 | lmb_init(); | ||
405 | setup_memory(); | 443 | setup_memory(); |
406 | sparse_init(); | 444 | sparse_init(); |
407 | 445 | ||
@@ -448,7 +486,7 @@ static const char *cpu_name[] = { | |||
448 | [CPU_SH7763] = "SH7763", [CPU_SH7770] = "SH7770", | 486 | [CPU_SH7763] = "SH7763", [CPU_SH7770] = "SH7770", |
449 | [CPU_SH7780] = "SH7780", [CPU_SH7781] = "SH7781", | 487 | [CPU_SH7780] = "SH7780", [CPU_SH7781] = "SH7781", |
450 | [CPU_SH7343] = "SH7343", [CPU_SH7785] = "SH7785", | 488 | [CPU_SH7343] = "SH7343", [CPU_SH7785] = "SH7785", |
451 | [CPU_SH7786] = "SH7786", | 489 | [CPU_SH7786] = "SH7786", [CPU_SH7757] = "SH7757", |
452 | [CPU_SH7722] = "SH7722", [CPU_SHX3] = "SH-X3", | 490 | [CPU_SH7722] = "SH7722", [CPU_SHX3] = "SH-X3", |
453 | [CPU_SH5_101] = "SH5-101", [CPU_SH5_103] = "SH5-103", | 491 | [CPU_SH5_101] = "SH5-101", [CPU_SH5_103] = "SH5-103", |
454 | [CPU_MXG] = "MX-G", [CPU_SH7723] = "SH7723", | 492 | [CPU_MXG] = "MX-G", [CPU_SH7723] = "SH7723", |