mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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: Mike Rapoport <rppt@linux.vnet.ibm.com> Acked-by: Greg Ungerer <gerg@linux-m68k.org> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
This commit is contained in:
		
							parent
							
								
									9e09221957
								
							
						
					
					
						commit
						1008a11590
					
				
					 7 changed files with 28 additions and 60 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) */
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@
 | 
			
		|||
#include <linux/types.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/bootmem.h>
 | 
			
		||||
#include <linux/memblock.h>
 | 
			
		||||
#include <linux/gfp.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/setup.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -208,7 +209,7 @@ void __init paging_init(void)
 | 
			
		|||
{
 | 
			
		||||
	unsigned long zones_size[MAX_NR_ZONES] = { 0, };
 | 
			
		||||
	unsigned long min_addr, max_addr;
 | 
			
		||||
	unsigned long addr, size, end;
 | 
			
		||||
	unsigned long addr;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
| 
						 | 
				
			
			@ -253,34 +254,20 @@ void __init paging_init(void)
 | 
			
		|||
	min_low_pfn = availmem >> PAGE_SHIFT;
 | 
			
		||||
	max_pfn = max_low_pfn = max_addr >> PAGE_SHIFT;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < m68k_num_memory; i++) {
 | 
			
		||||
		addr = m68k_memory[i].addr;
 | 
			
		||||
		end = addr + m68k_memory[i].size;
 | 
			
		||||
		m68k_setup_node(i);
 | 
			
		||||
		availmem = PAGE_ALIGN(availmem);
 | 
			
		||||
		availmem += init_bootmem_node(NODE_DATA(i),
 | 
			
		||||
					      availmem >> PAGE_SHIFT,
 | 
			
		||||
					      addr >> PAGE_SHIFT,
 | 
			
		||||
					      end >> PAGE_SHIFT);
 | 
			
		||||
	}
 | 
			
		||||
	/* Reserve kernel text/data/bss and the memory allocated in head.S */
 | 
			
		||||
	memblock_reserve(m68k_memory[0].addr, availmem - m68k_memory[0].addr);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Map the physical memory available into the kernel virtual
 | 
			
		||||
	 * address space. First initialize the bootmem allocator with
 | 
			
		||||
	 * the memory we already mapped, so map_node() has something
 | 
			
		||||
	 * to allocate.
 | 
			
		||||
	 * address space. Make sure memblock will not try to allocate
 | 
			
		||||
	 * pages beyond the memory we already mapped in head.S
 | 
			
		||||
	 */
 | 
			
		||||
	addr = m68k_memory[0].addr;
 | 
			
		||||
	size = m68k_memory[0].size;
 | 
			
		||||
	free_bootmem_node(NODE_DATA(0), availmem,
 | 
			
		||||
			  min(m68k_init_mapped_size, size) - (availmem - addr));
 | 
			
		||||
	map_node(0);
 | 
			
		||||
	if (size > m68k_init_mapped_size)
 | 
			
		||||
		free_bootmem_node(NODE_DATA(0), addr + m68k_init_mapped_size,
 | 
			
		||||
				  size - m68k_init_mapped_size);
 | 
			
		||||
	memblock_set_bottom_up(true);
 | 
			
		||||
 | 
			
		||||
	for (i = 1; i < m68k_num_memory; i++)
 | 
			
		||||
	for (i = 0; i < m68k_num_memory; i++) {
 | 
			
		||||
		m68k_setup_node(i);
 | 
			
		||||
		map_node(i);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	flush_tlb_all();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -123,10 +123,6 @@ static void __init sun3_bootmem_alloc(unsigned long memory_start,
 | 
			
		|||
	availmem = memory_start;
 | 
			
		||||
 | 
			
		||||
	m68k_setup_node(0);
 | 
			
		||||
	availmem += init_bootmem(start_page, num_pages);
 | 
			
		||||
	availmem = (availmem + (PAGE_SIZE-1)) & PAGE_MASK;
 | 
			
		||||
 | 
			
		||||
	free_bootmem(__pa(availmem), memory_end - (availmem));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue