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

Commit 0dbfafa5 authored by Alexander van Heukelum's avatar Alexander van Heukelum Committed by Thomas Gleixner
Browse files

x86: move i386 memory setup code to e820_32.c



The x86_64 code has centralized the memory setup code in
e820_64.c. This patch copies that approach to i386:

- early_param("mem", ...) parsing is moved from
setup_32.c to e820_32.c.

- setup_memory_map() and finish_e820_parsing() are
factored out from setup_arch(), and declarations
are added to e820_32.h.

- print_memory_map() is made static and removed from
e820_32.h.

- user_defined_memmap is marked as __initdata.

Signed-off-by: default avatarAlexander van Heukelum <heukelum@fastmail.fm>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 0da72a4a
Loading
Loading
Loading
Loading
+58 −2
Original line number Original line Diff line number Diff line
@@ -30,7 +30,6 @@ unsigned long pci_mem_start = 0x10000000;
#ifdef CONFIG_PCI
#ifdef CONFIG_PCI
EXPORT_SYMBOL(pci_mem_start);
EXPORT_SYMBOL(pci_mem_start);
#endif
#endif
extern int user_defined_memmap;


static struct resource system_rom_resource = {
static struct resource system_rom_resource = {
	.name	= "System ROM",
	.name	= "System ROM",
@@ -584,7 +583,7 @@ void __init e820_register_memory(void)
		pci_mem_start, gapstart, gapsize);
		pci_mem_start, gapstart, gapsize);
}
}


void __init print_memory_map(char *who)
static void __init print_memory_map(char *who)
{
{
	int i;
	int i;


@@ -692,6 +691,54 @@ e820_all_mapped(unsigned long s, unsigned long e, unsigned type)
	return 0;
	return 0;
}
}


/* Overridden in paravirt.c if CONFIG_PARAVIRT */
char * __init __attribute__((weak)) memory_setup(void)
{
	return machine_specific_memory_setup();
}

void __init setup_memory_map(void)
{
	printk(KERN_INFO "BIOS-provided physical RAM map:\n");
	print_memory_map(memory_setup());
}

static int __initdata user_defined_memmap;

/*
 * "mem=nopentium" disables the 4MB page tables.
 * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM
 * to <mem>, overriding the bios size.
 * "memmap=XXX[KkmM]@XXX[KkmM]" defines a memory region from
 * <start> to <start>+<mem>, overriding the bios size.
 *
 * HPA tells me bootloaders need to parse mem=, so no new
 * option should be mem=  [also see Documentation/i386/boot.txt]
 */
static int __init parse_mem(char *arg)
{
	if (!arg)
		return -EINVAL;

	if (strcmp(arg, "nopentium") == 0) {
		setup_clear_cpu_cap(X86_FEATURE_PSE);
	} else {
		/* If the user specifies memory size, we
		 * limit the BIOS-provided memory map to
		 * that size. exactmap can be used to specify
		 * the exact map. mem=number can be used to
		 * trim the existing memory map.
		 */
		unsigned long long mem_size;

		mem_size = memparse(arg, &arg);
		limit_regions(mem_size);
		user_defined_memmap = 1;
	}
	return 0;
}
early_param("mem", parse_mem);

static int __init parse_memmap(char *arg)
static int __init parse_memmap(char *arg)
{
{
	if (!arg)
	if (!arg)
@@ -762,6 +809,15 @@ void __init update_memory_range(u64 start, u64 size, unsigned old_type,
					 new_type);
					 new_type);
	}
	}
}
}

void __init finish_e820_parsing(void)
{
	if (user_defined_memmap) {
		printk(KERN_INFO "user-defined physical RAM map:\n");
		print_memory_map("user");
	}
}

void __init update_e820(void)
void __init update_e820(void)
{
{
	u8 nr_map;
	u8 nr_map;
+2 −48
Original line number Original line Diff line number Diff line
@@ -237,42 +237,6 @@ static inline void copy_edd(void)
}
}
#endif
#endif


int __initdata user_defined_memmap;

/*
 * "mem=nopentium" disables the 4MB page tables.
 * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM
 * to <mem>, overriding the bios size.
 * "memmap=XXX[KkmM]@XXX[KkmM]" defines a memory region from
 * <start> to <start>+<mem>, overriding the bios size.
 *
 * HPA tells me bootloaders need to parse mem=, so no new
 * option should be mem=  [also see Documentation/i386/boot.txt]
 */
static int __init parse_mem(char *arg)
{
	if (!arg)
		return -EINVAL;

	if (strcmp(arg, "nopentium") == 0) {
		setup_clear_cpu_cap(X86_FEATURE_PSE);
	} else {
		/* If the user specifies memory size, we
		 * limit the BIOS-provided memory map to
		 * that size. exactmap can be used to specify
		 * the exact map. mem=number can be used to
		 * trim the existing memory map.
		 */
		unsigned long long mem_size;

		mem_size = memparse(arg, &arg);
		limit_regions(mem_size);
		user_defined_memmap = 1;
	}
	return 0;
}
early_param("mem", parse_mem);

#ifdef CONFIG_PROC_VMCORE
#ifdef CONFIG_PROC_VMCORE
/* elfcorehdr= specifies the location of elf core header
/* elfcorehdr= specifies the location of elf core header
 * stored by the crashed kernel.
 * stored by the crashed kernel.
@@ -725,12 +689,6 @@ static void set_mca_bus(int x)
static void set_mca_bus(int x) { }
static void set_mca_bus(int x) { }
#endif
#endif


/* Overridden in paravirt.c if CONFIG_PARAVIRT */
char * __init __attribute__((weak)) memory_setup(void)
{
	return machine_specific_memory_setup();
}

#ifdef CONFIG_NUMA
#ifdef CONFIG_NUMA
/*
/*
 * In the golden day, when everything among i386 and x86_64 will be
 * In the golden day, when everything among i386 and x86_64 will be
@@ -786,8 +744,7 @@ void __init setup_arch(char **cmdline_p)
#endif
#endif
	ARCH_SETUP
	ARCH_SETUP


	printk(KERN_INFO "BIOS-provided physical RAM map:\n");
	setup_memory_map();
	print_memory_map(memory_setup());


	copy_edd();
	copy_edd();


@@ -807,10 +764,7 @@ void __init setup_arch(char **cmdline_p)


	parse_early_param();
	parse_early_param();


	if (user_defined_memmap) {
	finish_e820_parsing();
		printk(KERN_INFO "user-defined physical RAM map:\n");
		print_memory_map("user");
	}


	strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
	strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
	*cmdline_p = command_line;
	*cmdline_p = command_line;
+3 −1
Original line number Original line Diff line number Diff line
@@ -18,6 +18,9 @@


#ifndef __ASSEMBLY__
#ifndef __ASSEMBLY__


extern void setup_memory_map(void);
extern void finish_e820_parsing(void);

extern struct e820map e820;
extern struct e820map e820;
extern void update_e820(void);
extern void update_e820(void);


@@ -32,7 +35,6 @@ extern void update_memory_range(u64 start, u64 size, unsigned old_type,
				unsigned new_type);
				unsigned new_type);
extern void e820_register_memory(void);
extern void e820_register_memory(void);
extern void limit_regions(unsigned long long size);
extern void limit_regions(unsigned long long size);
extern void print_memory_map(char *who);
extern void init_iomem_resources(struct resource *code_resource,
extern void init_iomem_resources(struct resource *code_resource,
				 struct resource *data_resource,
				 struct resource *data_resource,
				 struct resource *bss_resource);
				 struct resource *bss_resource);