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

Commit 6fbef13c authored by Tejun Heo's avatar Tejun Heo
Browse files

powerpc: Cleanup memblock usage



* early_init_devtree(): Total memory size is aligned to PAGE_SIZE;
  however, alignment isn't enforced if memory_limit is explicitly
  specified.  Simplify the logic and always apply PAGE_SIZE alignment.

* MMU_init(): memblock regions is truncated by directly modifying
  memblock.memory.cnt.  This is incomplete (reserved array is not
  truncated) and unnecessarily low level hindering further memblock
  improvments.  Use memblock_enforce_memory_limit() instead.

* wii_memory_fixups(): Unnecessarily low level direct manipulation of
  memblock regions.  The same result can be achieved using properly
  abstracted operations.  Reimplement using memblock API.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Yinghai Lu <yinghai@kernel.org>
parent c0ce8fef
Loading
Loading
Loading
Loading
+6 −11
Original line number Diff line number Diff line
@@ -754,17 +754,12 @@ void __init early_init_devtree(void *params)
	early_reserve_mem();
	phyp_dump_reserve_mem();

	limit = memory_limit;
	if (! limit) {
		phys_addr_t memsize;

		/* Ensure that total memory size is page-aligned, because
		 * otherwise mark_bootmem() gets upset. */
	/*
	 * Ensure that total memory size is page-aligned, because otherwise
	 * mark_bootmem() gets upset.
	 */
	memblock_analyze();
		memsize = memblock_phys_mem_size();
		if ((memsize & PAGE_MASK) != memsize)
			limit = memsize & PAGE_MASK;
	}
	limit = ALIGN(memory_limit ?: memblock_phys_mem_size(), PAGE_SIZE);
	memblock_enforce_memory_limit(limit);

	memblock_analyze();
+1 −1
Original line number Diff line number Diff line
@@ -134,7 +134,7 @@ void __init MMU_init(void)

	if (memblock.memory.cnt > 1) {
#ifndef CONFIG_WII
		memblock.memory.cnt = 1;
		memblock_enforce_memory_limit(memblock.memory.regions[0].size);
		memblock_analyze();
		printk(KERN_WARNING "Only using first contiguous memory region");
#else
+9 −13
Original line number Diff line number Diff line
@@ -79,23 +79,19 @@ void __init wii_memory_fixups(void)
	BUG_ON(memblock.memory.cnt != 2);
	BUG_ON(!page_aligned(p[0].base) || !page_aligned(p[1].base));

	p[0].size = _ALIGN_DOWN(p[0].size, PAGE_SIZE);
	p[1].size = _ALIGN_DOWN(p[1].size, PAGE_SIZE);
	/* trim unaligned tail */
	memblock_remove(ALIGN(p[1].base + p[1].size, PAGE_SIZE),
			(phys_addr_t)ULLONG_MAX);

	wii_hole_start = p[0].base + p[0].size;
	/* determine hole, add & reserve them */
	wii_hole_start = ALIGN(p[0].base + p[0].size, PAGE_SIZE);
	wii_hole_size = p[1].base - wii_hole_start;

	pr_info("MEM1: <%08llx %08llx>\n", p[0].base, p[0].size);
	pr_info("HOLE: <%08lx %08lx>\n", wii_hole_start, wii_hole_size);
	pr_info("MEM2: <%08llx %08llx>\n", p[1].base, p[1].size);

	p[0].size += wii_hole_size + p[1].size;

	memblock.memory.cnt = 1;
	memblock_add(wii_hole_start, wii_hole_size);
	memblock_reserve(wii_hole_start, wii_hole_size);
	memblock_analyze();

	/* reserve the hole */
	memblock_reserve(wii_hole_start, wii_hole_size);
	BUG_ON(memblock.memory.cnt != 1);
	__memblock_dump_all();

	/* allow ioremapping the address space in the hole */
	__allow_ioremap_reserved = 1;