Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d3ff9338 authored by Corey Minyard's avatar Corey Minyard Committed by John Crispin
Browse files

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: default avatarCorey Minyard <cminyard@mvista.com>
Acked-by: default avatarDavid Daney <ddaney@caviumnetworks.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Patchwork: http://patchwork.linux-mips.org/patch/4937/
parent 90a938d1
Loading
Loading
Loading
Loading
+31 −21
Original line number Diff line number Diff line
@@ -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;

	extern void plat_mem_setup(void);
	phys_t size;
	int i;

	/* call board setup routine */
	plat_mem_setup();
	size = end - mem;
	if (!size)
		return;

	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 (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);
}
		if (!found)
			add_memory_region(init_mem, init_size,

static void __init arch_mem_init(char **cmdline_p)
{
	extern void plat_mem_setup(void);

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

	/*
	 * 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();