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:
parent
90a938d1ad
commit
d3ff933802
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user