Commit 2b6509f4 authored by Huacai Chen's avatar Huacai Chen Committed by Paul Burton

MIPS: Loongson64: Fix boot failure after dropping boot_mem_map

From commit a94e4f24 ("MIPS: init: Drop boot_mem_map") onwards,
add_memory_region() is handled by memblock_add()/memblock_reserve()
directly and all bootmem API should be converted to memblock API.
Otherwise it will lead to boot failure, especially in the NUMA case
because add_memory_region lose the node_id information.

Fixes: a94e4f24 ("MIPS: init: Drop boot_mem_map")
Signed-off-by: default avatarHuacai Chen <chenhc@lemote.com>
Signed-off-by: default avatarJiaxun Yang <jiaxun.yang@flygoat.com>
[paul.burton@mips.com:
  - Invert node_id check to de-indent the switch statement & avoid lines
    over 80 characters.
  - Fixup commit reference in commit message.]
Signed-off-by: default avatarPaul Burton <paul.burton@mips.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: James Hogan <jhogan@kernel.org>
Cc: linux-mips@linux-mips.org
Cc: linux-mips@vger.kernel.org
Cc: Fuxin Zhang <zhangfx@lemote.com>
Cc: Zhangjin Wu <wuzhangjin@gmail.com>
Cc: Huacai Chen <chenhuacai@gmail.com>
parent 54ecb8f7
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
*/ */
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/fcntl.h> #include <linux/fcntl.h>
#include <linux/memblock.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
...@@ -64,26 +65,24 @@ void __init prom_init_memory(void) ...@@ -64,26 +65,24 @@ void __init prom_init_memory(void)
node_id = loongson_memmap->map[i].node_id; node_id = loongson_memmap->map[i].node_id;
mem_type = loongson_memmap->map[i].mem_type; mem_type = loongson_memmap->map[i].mem_type;
if (node_id == 0) { if (node_id != 0)
continue;
switch (mem_type) { switch (mem_type) {
case SYSTEM_RAM_LOW: case SYSTEM_RAM_LOW:
add_memory_region(loongson_memmap->map[i].mem_start, memblock_add(loongson_memmap->map[i].mem_start,
(u64)loongson_memmap->map[i].mem_size << 20, (u64)loongson_memmap->map[i].mem_size << 20);
BOOT_MEM_RAM);
break; break;
case SYSTEM_RAM_HIGH: case SYSTEM_RAM_HIGH:
add_memory_region(loongson_memmap->map[i].mem_start, memblock_add(loongson_memmap->map[i].mem_start,
(u64)loongson_memmap->map[i].mem_size << 20, (u64)loongson_memmap->map[i].mem_size << 20);
BOOT_MEM_RAM);
break; break;
case SYSTEM_RAM_RESERVED: case SYSTEM_RAM_RESERVED:
add_memory_region(loongson_memmap->map[i].mem_start, memblock_reserve(loongson_memmap->map[i].mem_start,
(u64)loongson_memmap->map[i].mem_size << 20, (u64)loongson_memmap->map[i].mem_size << 20);
BOOT_MEM_RESERVED);
break; break;
} }
} }
}
} }
#endif /* CONFIG_LEFI_FIRMWARE_INTERFACE */ #endif /* CONFIG_LEFI_FIRMWARE_INTERFACE */
......
...@@ -142,8 +142,6 @@ static void __init szmem(unsigned int node) ...@@ -142,8 +142,6 @@ static void __init szmem(unsigned int node)
(u32)node_id, mem_type, mem_start, mem_size); (u32)node_id, mem_type, mem_start, mem_size);
pr_info(" start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n", pr_info(" start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n",
start_pfn, end_pfn, num_physpages); start_pfn, end_pfn, num_physpages);
add_memory_region((node_id << 44) + mem_start,
(u64)mem_size << 20, BOOT_MEM_RAM);
memblock_add_node(PFN_PHYS(start_pfn), memblock_add_node(PFN_PHYS(start_pfn),
PFN_PHYS(end_pfn - start_pfn), node); PFN_PHYS(end_pfn - start_pfn), node);
break; break;
...@@ -156,16 +154,12 @@ static void __init szmem(unsigned int node) ...@@ -156,16 +154,12 @@ static void __init szmem(unsigned int node)
(u32)node_id, mem_type, mem_start, mem_size); (u32)node_id, mem_type, mem_start, mem_size);
pr_info(" start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n", pr_info(" start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n",
start_pfn, end_pfn, num_physpages); start_pfn, end_pfn, num_physpages);
add_memory_region((node_id << 44) + mem_start,
(u64)mem_size << 20, BOOT_MEM_RAM);
memblock_add_node(PFN_PHYS(start_pfn), memblock_add_node(PFN_PHYS(start_pfn),
PFN_PHYS(end_pfn - start_pfn), node); PFN_PHYS(end_pfn - start_pfn), node);
break; break;
case SYSTEM_RAM_RESERVED: case SYSTEM_RAM_RESERVED:
pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx MB\n", pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx MB\n",
(u32)node_id, mem_type, mem_start, mem_size); (u32)node_id, mem_type, mem_start, mem_size);
add_memory_region((node_id << 44) + mem_start,
(u64)mem_size << 20, BOOT_MEM_RESERVED);
memblock_reserve(((node_id << 44) + mem_start), memblock_reserve(((node_id << 44) + mem_start),
mem_size << 20); mem_size << 20);
break; break;
...@@ -191,8 +185,6 @@ static void __init node_mem_init(unsigned int node) ...@@ -191,8 +185,6 @@ static void __init node_mem_init(unsigned int node)
NODE_DATA(node)->node_start_pfn = start_pfn; NODE_DATA(node)->node_start_pfn = start_pfn;
NODE_DATA(node)->node_spanned_pages = end_pfn - start_pfn; NODE_DATA(node)->node_spanned_pages = end_pfn - start_pfn;
free_bootmem_with_active_regions(node, end_pfn);
if (node == 0) { if (node == 0) {
/* kernel end address */ /* kernel end address */
unsigned long kernel_end_pfn = PFN_UP(__pa_symbol(&_end)); unsigned long kernel_end_pfn = PFN_UP(__pa_symbol(&_end));
...@@ -209,8 +201,6 @@ static void __init node_mem_init(unsigned int node) ...@@ -209,8 +201,6 @@ static void __init node_mem_init(unsigned int node)
memblock_reserve((node_addrspace_offset | 0xfe000000), memblock_reserve((node_addrspace_offset | 0xfe000000),
32 << 20); 32 << 20);
} }
sparse_memory_present_with_active_regions(node);
} }
static __init void prom_meminit(void) static __init void prom_meminit(void)
...@@ -227,6 +217,7 @@ static __init void prom_meminit(void) ...@@ -227,6 +217,7 @@ static __init void prom_meminit(void)
cpumask_clear(&__node_data[(node)]->cpumask); cpumask_clear(&__node_data[(node)]->cpumask);
} }
} }
memblocks_present();
max_low_pfn = PHYS_PFN(memblock_end_of_DRAM()); max_low_pfn = PHYS_PFN(memblock_end_of_DRAM());
for (cpu = 0; cpu < loongson_sysconf.nr_cpus; cpu++) { for (cpu = 0; cpu < loongson_sysconf.nr_cpus; cpu++) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment