diff options
Diffstat (limited to 'arch/powerpc/kernel/prom.c')
| -rw-r--r-- | arch/powerpc/kernel/prom.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index fed9bf6187d1..c3c6a8857544 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | int __initdata iommu_is_off; | 66 | int __initdata iommu_is_off; |
| 67 | int __initdata iommu_force_on; | 67 | int __initdata iommu_force_on; |
| 68 | unsigned long tce_alloc_start, tce_alloc_end; | 68 | unsigned long tce_alloc_start, tce_alloc_end; |
| 69 | u64 ppc64_rma_size; | ||
| 69 | #endif | 70 | #endif |
| 70 | 71 | ||
| 71 | static int __init early_parse_mem(char *p) | 72 | static int __init early_parse_mem(char *p) |
| @@ -98,7 +99,7 @@ static void __init move_device_tree(void) | |||
| 98 | 99 | ||
| 99 | if ((memory_limit && (start + size) > memory_limit) || | 100 | if ((memory_limit && (start + size) > memory_limit) || |
| 100 | overlaps_crashkernel(start, size)) { | 101 | overlaps_crashkernel(start, size)) { |
| 101 | p = __va(memblock_alloc_base(size, PAGE_SIZE, memblock.rmo_size)); | 102 | p = __va(memblock_alloc(size, PAGE_SIZE)); |
| 102 | memcpy(p, initial_boot_params, size); | 103 | memcpy(p, initial_boot_params, size); |
| 103 | initial_boot_params = (struct boot_param_header *)p; | 104 | initial_boot_params = (struct boot_param_header *)p; |
| 104 | DBG("Moved device tree to 0x%p\n", p); | 105 | DBG("Moved device tree to 0x%p\n", p); |
| @@ -492,7 +493,7 @@ static int __init early_init_dt_scan_memory_ppc(unsigned long node, | |||
| 492 | 493 | ||
| 493 | void __init early_init_dt_add_memory_arch(u64 base, u64 size) | 494 | void __init early_init_dt_add_memory_arch(u64 base, u64 size) |
| 494 | { | 495 | { |
| 495 | #if defined(CONFIG_PPC64) | 496 | #ifdef CONFIG_PPC64 |
| 496 | if (iommu_is_off) { | 497 | if (iommu_is_off) { |
| 497 | if (base >= 0x80000000ul) | 498 | if (base >= 0x80000000ul) |
| 498 | return; | 499 | return; |
| @@ -501,9 +502,13 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size) | |||
| 501 | } | 502 | } |
| 502 | #endif | 503 | #endif |
| 503 | 504 | ||
| 504 | memblock_add(base, size); | 505 | /* First MEMBLOCK added, do some special initializations */ |
| 505 | 506 | if (memstart_addr == ~(phys_addr_t)0) | |
| 507 | setup_initial_memory_limit(base, size); | ||
| 506 | memstart_addr = min((u64)memstart_addr, base); | 508 | memstart_addr = min((u64)memstart_addr, base); |
| 509 | |||
| 510 | /* Add the chunk to the MEMBLOCK list */ | ||
| 511 | memblock_add(base, size); | ||
| 507 | } | 512 | } |
| 508 | 513 | ||
| 509 | u64 __init early_init_dt_alloc_memory_arch(u64 size, u64 align) | 514 | u64 __init early_init_dt_alloc_memory_arch(u64 size, u64 align) |
| @@ -655,7 +660,6 @@ static void __init phyp_dump_reserve_mem(void) | |||
| 655 | static inline void __init phyp_dump_reserve_mem(void) {} | 660 | static inline void __init phyp_dump_reserve_mem(void) {} |
| 656 | #endif /* CONFIG_PHYP_DUMP && CONFIG_PPC_RTAS */ | 661 | #endif /* CONFIG_PHYP_DUMP && CONFIG_PPC_RTAS */ |
| 657 | 662 | ||
| 658 | |||
| 659 | void __init early_init_devtree(void *params) | 663 | void __init early_init_devtree(void *params) |
| 660 | { | 664 | { |
| 661 | phys_addr_t limit; | 665 | phys_addr_t limit; |
| @@ -683,6 +687,7 @@ void __init early_init_devtree(void *params) | |||
| 683 | 687 | ||
| 684 | /* Scan memory nodes and rebuild MEMBLOCKs */ | 688 | /* Scan memory nodes and rebuild MEMBLOCKs */ |
| 685 | memblock_init(); | 689 | memblock_init(); |
| 690 | |||
| 686 | of_scan_flat_dt(early_init_dt_scan_root, NULL); | 691 | of_scan_flat_dt(early_init_dt_scan_root, NULL); |
| 687 | of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL); | 692 | of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL); |
| 688 | 693 | ||
