mips: Make sure kernel memory is in iomem

Kernel memory isn't necessarily added to the memory tables, so it
wouldn't show up in /proc/iomem.  This was breaking kdump, which
requires these memory addresses to work correctly.

Signed-off-by: Corey Minyard <cminyard@mvista.com>
Acked-by: David Daney <ddaney@caviumnetworks.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Patchwork: http://patchwork.linux-mips.org/patch/4937/
This commit is contained in:
Corey Minyard 2013-02-12 19:41:47 +00:00 committed by John Crispin
parent 90a938d1ad
commit d3ff933802

View file

@ -480,34 +480,44 @@ static int __init early_parse_mem(char *p)
} }
early_param("mem", early_parse_mem); early_param("mem", early_parse_mem);
static void __init arch_mem_addpart(phys_t mem, phys_t end, int type)
{
phys_t size;
int i;
size = end - mem;
if (!size)
return;
/* Make sure it is in the boot_mem_map */
for (i = 0; i < boot_mem_map.nr_map; i++) {
if (mem >= boot_mem_map.map[i].addr &&
mem < (boot_mem_map.map[i].addr +
boot_mem_map.map[i].size))
return;
}
add_memory_region(mem, size, type);
}
static void __init arch_mem_init(char **cmdline_p) static void __init arch_mem_init(char **cmdline_p)
{ {
phys_t init_mem, init_end, init_size;
extern void plat_mem_setup(void); extern void plat_mem_setup(void);
/* call board setup routine */ /* call board setup routine */
plat_mem_setup(); plat_mem_setup();
init_mem = PFN_UP(__pa_symbol(&__init_begin)) << PAGE_SHIFT; /*
init_end = PFN_DOWN(__pa_symbol(&__init_end)) << PAGE_SHIFT; * Make sure all kernel memory is in the maps. The "UP" and
init_size = init_end - init_mem; * "DOWN" are opposite for initdata since if it crosses over
if (init_size) { * into another memory section you don't want that to be
/* Make sure it is in the boot_mem_map */ * freed when the initdata is freed.
int i, found; */
found = 0; arch_mem_addpart(PFN_DOWN(__pa_symbol(&_text)) << PAGE_SHIFT,
for (i = 0; i < boot_mem_map.nr_map; i++) { PFN_UP(__pa_symbol(&_edata)) << PAGE_SHIFT,
if (init_mem >= boot_mem_map.map[i].addr && BOOT_MEM_RAM);
init_mem < (boot_mem_map.map[i].addr + arch_mem_addpart(PFN_UP(__pa_symbol(&__init_begin)) << PAGE_SHIFT,
boot_mem_map.map[i].size)) { PFN_DOWN(__pa_symbol(&__init_end)) << PAGE_SHIFT,
found = 1; BOOT_MEM_INIT_RAM);
break;
}
}
if (!found)
add_memory_region(init_mem, init_size,
BOOT_MEM_INIT_RAM);
}
pr_info("Determined physical RAM map:\n"); pr_info("Determined physical RAM map:\n");
print_memory_map(); print_memory_map();