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

Commit 1008a115 authored by Mike Rapoport's avatar Mike Rapoport Committed by Geert Uytterhoeven
Browse files

m68k: switch to MEMBLOCK + NO_BOOTMEM



In m68k the physical memory is described by [memory_start, memory_end] for
!MMU variant and by m68k_memory array of memory ranges for the MMU version.
This information is directly use to register the physical memory with
memblock.

The reserve_bootmem() calls are replaced with memblock_reserve() and the
bootmap bitmap allocation is simply dropped.

Since the MMU variant creates early mappings only for the small part of the
memory we force bottom-up allocations in memblock.

Signed-off-by: default avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Acked-by: default avatarGreg Ungerer <gerg@linux-m68k.org>
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
parent 9e092219
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -26,6 +26,9 @@ config M68K
	select OLD_SIGSUSPEND3
	select OLD_SIGACTION
	select DMA_NONCOHERENT_OPS if HAS_DMA
	select HAVE_MEMBLOCK
	select ARCH_DISCARD_MEMBLOCK
	select NO_BOOTMEM

config CPU_BIG_ENDIAN
	def_bool y
+4 −10
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <linux/string.h>
#include <linux/init.h>
#include <linux/bootmem.h>
#include <linux/memblock.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/module.h>
@@ -164,6 +165,8 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record)
					be32_to_cpu(m->addr);
				m68k_memory[m68k_num_memory].size =
					be32_to_cpu(m->size);
				memblock_add(m68k_memory[m68k_num_memory].addr,
					     m68k_memory[m68k_num_memory].size);
				m68k_num_memory++;
			} else
				pr_warn("%s: too many memory chunks\n",
@@ -223,10 +226,6 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record)

void __init setup_arch(char **cmdline_p)
{
#ifndef CONFIG_SUN3
	int i;
#endif

	/* The bootinfo is located right after the kernel */
	if (!CPU_IS_COLDFIRE)
		m68k_parse_bootinfo((const struct bi_record *)_end);
@@ -355,14 +354,9 @@ void __init setup_arch(char **cmdline_p)
#endif

#ifndef CONFIG_SUN3
	for (i = 1; i < m68k_num_memory; i++)
		free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr,
				  m68k_memory[i].size);
#ifdef CONFIG_BLK_DEV_INITRD
	if (m68k_ramdisk.size) {
		reserve_bootmem_node(__virt_to_node(phys_to_virt(m68k_ramdisk.addr)),
				     m68k_ramdisk.addr, m68k_ramdisk.size,
				     BOOTMEM_DEFAULT);
		memblock_reserve(m68k_ramdisk.addr, m68k_ramdisk.size);
		initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr);
		initrd_end = initrd_start + m68k_ramdisk.size;
		pr_info("initrd: %08lx - %08lx\n", initrd_start, initrd_end);
+4 −16
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/bootmem.h>
#include <linux/memblock.h>
#include <linux/seq_file.h>
#include <linux/init.h>
#include <linux/initrd.h>
@@ -85,8 +86,6 @@ void (*mach_power_off)(void);

void __init setup_arch(char **cmdline_p)
{
	int bootmap_size;

	memory_start = PAGE_ALIGN(_ramstart);
	memory_end = _ramend;

@@ -141,6 +140,8 @@ void __init setup_arch(char **cmdline_p)
	pr_debug("MEMORY -> ROMFS=0x%p-0x%06lx MEM=0x%06lx-0x%06lx\n ",
		 __bss_stop, memory_start, memory_start, memory_end);

	memblock_add(memory_start, memory_end - memory_start);

	/* Keep a copy of command line */
	*cmdline_p = &command_line[0];
	memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
@@ -157,23 +158,10 @@ void __init setup_arch(char **cmdline_p)
	min_low_pfn = PFN_DOWN(memory_start);
	max_pfn = max_low_pfn = PFN_DOWN(memory_end);

	bootmap_size = init_bootmem_node(
			NODE_DATA(0),
			min_low_pfn,		/* map goes here */
			PFN_DOWN(PAGE_OFFSET),
			max_pfn);
	/*
	 * Free the usable memory, we have to make sure we do not free
	 * the bootmem bitmap so we then reserve it after freeing it :-)
	 */
	free_bootmem(memory_start, memory_end - memory_start);
	reserve_bootmem(memory_start, bootmap_size, BOOTMEM_DEFAULT);

#if defined(CONFIG_UBOOT) && defined(CONFIG_BLK_DEV_INITRD)
	if ((initrd_start > 0) && (initrd_start < initrd_end) &&
			(initrd_end < memory_end))
		reserve_bootmem(initrd_start, initrd_end - initrd_start,
				 BOOTMEM_DEFAULT);
		memblock_reserve(initrd_start, initrd_end - initrd_start);
#endif /* if defined(CONFIG_BLK_DEV_INITRD) */

	/*
+0 −1
Original line number Diff line number Diff line
@@ -71,7 +71,6 @@ void __init m68k_setup_node(int node)
		pg_data_table[i] = pg_data_map + node;
	}
#endif
	pg_data_map[node].bdata = bootmem_node_data + node;
	node_set_online(node);
}

+7 −6
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include <linux/init.h>
#include <linux/string.h>
#include <linux/bootmem.h>
#include <linux/memblock.h>

#include <asm/setup.h>
#include <asm/page.h>
@@ -153,31 +154,31 @@ int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word)

void __init cf_bootmem_alloc(void)
{
	unsigned long start_pfn;
	unsigned long memstart;

	/* _rambase and _ramend will be naturally page aligned */
	m68k_memory[0].addr = _rambase;
	m68k_memory[0].size = _ramend - _rambase;

	memblock_add(m68k_memory[0].addr, m68k_memory[0].size);

	/* compute total pages in system */
	num_pages = PFN_DOWN(_ramend - _rambase);

	/* page numbers */
	memstart = PAGE_ALIGN(_ramstart);
	min_low_pfn = PFN_DOWN(_rambase);
	start_pfn = PFN_DOWN(memstart);
	max_pfn = max_low_pfn = PFN_DOWN(_ramend);
	high_memory = (void *)_ramend;

	/* Reserve kernel text/data/bss */
	memblock_reserve(memstart, memstart - _rambase);

	m68k_virt_to_node_shift = fls(_ramend - 1) - 6;
	module_fixup(NULL, __start_fixup, __stop_fixup);

	/* setup bootmem data */
	/* setup node data */
	m68k_setup_node(0);
	memstart += init_bootmem_node(NODE_DATA(0), start_pfn,
		min_low_pfn, max_low_pfn);
	free_bootmem_node(NODE_DATA(0), memstart, _ramend - memstart);
}

/*
Loading