Skip to content

Commit

Permalink
mips: Make sure kernel memory is in iomem
Browse files Browse the repository at this point in the history
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/
  • Loading branch information
Corey Minyard authored and John Crispin committed Feb 19, 2013
1 parent 90a938d commit d3ff933
Showing 1 changed file with 31 additions and 21 deletions.
52 changes: 31 additions & 21 deletions arch/mips/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -480,34 +480,44 @@ static int __init early_parse_mem(char *p)
}
early_param("mem", early_parse_mem);

static void __init arch_mem_init(char **cmdline_p)
static void __init arch_mem_addpart(phys_t mem, phys_t end, int type)
{
phys_t init_mem, init_end, init_size;
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)
{
extern void plat_mem_setup(void);

/* call board setup routine */
plat_mem_setup();

init_mem = PFN_UP(__pa_symbol(&__init_begin)) << PAGE_SHIFT;
init_end = PFN_DOWN(__pa_symbol(&__init_end)) << PAGE_SHIFT;
init_size = init_end - init_mem;
if (init_size) {
/* Make sure it is in the boot_mem_map */
int i, found;
found = 0;
for (i = 0; i < boot_mem_map.nr_map; i++) {
if (init_mem >= boot_mem_map.map[i].addr &&
init_mem < (boot_mem_map.map[i].addr +
boot_mem_map.map[i].size)) {
found = 1;
break;
}
}
if (!found)
add_memory_region(init_mem, init_size,
BOOT_MEM_INIT_RAM);
}
/*
* Make sure all kernel memory is in the maps. The "UP" and
* "DOWN" are opposite for initdata since if it crosses over
* into another memory section you don't want that to be
* freed when the initdata is freed.
*/
arch_mem_addpart(PFN_DOWN(__pa_symbol(&_text)) << PAGE_SHIFT,
PFN_UP(__pa_symbol(&_edata)) << PAGE_SHIFT,
BOOT_MEM_RAM);
arch_mem_addpart(PFN_UP(__pa_symbol(&__init_begin)) << PAGE_SHIFT,
PFN_DOWN(__pa_symbol(&__init_end)) << PAGE_SHIFT,
BOOT_MEM_INIT_RAM);

pr_info("Determined physical RAM map:\n");
print_memory_map();
Expand Down

0 comments on commit d3ff933

Please sign in to comment.