Commit f9748fa0 authored by Ingo Molnar's avatar Ingo Molnar

x86/boot/e820: Simplify the e820__update_table() interface

The e820__update_table() parameters are pretty complex:

  arch/x86/include/asm/e820/api.h:extern int  e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map);

But 90% of the usage is trivial:

  arch/x86/kernel/e820.c:	if (e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries))
  arch/x86/kernel/e820.c:	e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
  arch/x86/kernel/e820.c:	e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
  arch/x86/kernel/e820.c:		if (e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries) < 0)
  arch/x86/kernel/e820.c:	e820__update_table(boot_params.e820_table, ARRAY_SIZE(boot_params.e820_table), &new_nr);
  arch/x86/kernel/early-quirks.c:	e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
  arch/x86/kernel/setup.c:	e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
  arch/x86/kernel/setup.c:		e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
  arch/x86/platform/efi/efi.c:	e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
  arch/x86/xen/setup.c:	e820__update_table(xen_e820_table.entries, ARRAY_SIZE(xen_e820_table.entries),
  arch/x86/xen/setup.c:	e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries);
  arch/x86/xen/setup.c:	e820__update_table(xen_e820_table.entries, ARRAY_SIZE(xen_e820_table.entries),

as it only uses an exiting struct e820_table's entries array, its size and
its current number of entries as input and output arguments.

Only one use is non-trivial:

  arch/x86/kernel/e820.c:	e820__update_table(boot_params.e820_table, ARRAY_SIZE(boot_params.e820_table), &new_nr);

... which call updates the E820 table in the zeropage in-situ, and the layout there does not
match that of 'struct e820_table' (in particular nr_entries is at a different offset,
hardcoded by the boot protocol).

Simplify all this by introducing a low level __e820__update_table() API that
the zeropage update call can use, and simplifying the main e820__update_table()
call signature down to:

	int e820__update_table(struct e820_table *table);

This visibly simplifies all the call sites:

  arch/x86/include/asm/e820/api.h:extern int  e820__update_table(struct e820_table *table);
  arch/x86/include/asm/e820/types.h: * call to e820__update_table() to remove duplicates.  The allowance
  arch/x86/kernel/e820.c: * The return value from e820__update_table() is zero if it
  arch/x86/kernel/e820.c:int __init e820__update_table(struct e820_table *table)
  arch/x86/kernel/e820.c:	if (e820__update_table(e820_table))
  arch/x86/kernel/e820.c:	e820__update_table(e820_table_firmware);
  arch/x86/kernel/e820.c:	e820__update_table(e820_table);
  arch/x86/kernel/e820.c:	e820__update_table(e820_table);
  arch/x86/kernel/e820.c:		if (e820__update_table(e820_table) < 0)
  arch/x86/kernel/early-quirks.c:	e820__update_table(e820_table);
  arch/x86/kernel/setup.c:	e820__update_table(e820_table);
  arch/x86/kernel/setup.c:		e820__update_table(e820_table);
  arch/x86/platform/efi/efi.c:	e820__update_table(e820_table);
  arch/x86/xen/setup.c:	e820__update_table(&xen_e820_table);
  arch/x86/xen/setup.c:	e820__update_table(e820_table);
  arch/x86/xen/setup.c:	e820__update_table(&xen_e820_table);

No change in functionality.

Cc: Alex Thorlton <athorlton@sgi.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Huang, Ying <ying.huang@intel.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul Jackson <pj@sgi.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Tejun Heo <tj@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Wei Yang <richard.weiyang@gmail.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent e7dbf7ad
...@@ -16,7 +16,7 @@ extern u64 e820__range_update(u64 start, u64 size, enum e820_type old_type, enu ...@@ -16,7 +16,7 @@ extern u64 e820__range_update(u64 start, u64 size, enum e820_type old_type, enu
extern u64 e820__range_remove(u64 start, u64 size, enum e820_type old_type, int checktype); extern u64 e820__range_remove(u64 start, u64 size, enum e820_type old_type, int checktype);
extern void e820__print_table(char *who); extern void e820__print_table(char *who);
extern int e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map); extern int e820__update_table(struct e820_table *table);
extern void e820__update_table_print(void); extern void e820__update_table_print(void);
extern unsigned long e820_end_of_ram_pfn(void); extern unsigned long e820_end_of_ram_pfn(void);
......
...@@ -259,7 +259,7 @@ static int __init cpcompare(const void *a, const void *b) ...@@ -259,7 +259,7 @@ static int __init cpcompare(const void *a, const void *b)
return (ap->addr != ap->pbios->addr) - (bp->addr != bp->pbios->addr); return (ap->addr != ap->pbios->addr) - (bp->addr != bp->pbios->addr);
} }
int __init e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map) static int __init __e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *pnr_map)
{ {
static struct change_member change_point_list[2*E820_MAX_ENTRIES] __initdata; static struct change_member change_point_list[2*E820_MAX_ENTRIES] __initdata;
static struct change_member *change_point[2*E820_MAX_ENTRIES] __initdata; static struct change_member *change_point[2*E820_MAX_ENTRIES] __initdata;
...@@ -368,6 +368,11 @@ int __init e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *p ...@@ -368,6 +368,11 @@ int __init e820__update_table(struct e820_entry *biosmap, int max_nr_map, u32 *p
return 0; return 0;
} }
int __init e820__update_table(struct e820_table *table)
{
return __e820__update_table(table->entries, ARRAY_SIZE(table->entries), &table->nr_entries);
}
static int __init __append_e820_table(struct e820_entry *biosmap, int nr_map) static int __init __append_e820_table(struct e820_entry *biosmap, int nr_map)
{ {
while (nr_map) { while (nr_map) {
...@@ -548,7 +553,7 @@ u64 __init e820__range_remove(u64 start, u64 size, enum e820_type old_type, int ...@@ -548,7 +553,7 @@ u64 __init e820__range_remove(u64 start, u64 size, enum e820_type old_type, int
void __init e820__update_table_print(void) void __init e820__update_table_print(void)
{ {
if (e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries)) if (e820__update_table(e820_table))
return; return;
pr_info("e820: modified physical RAM map:\n"); pr_info("e820: modified physical RAM map:\n");
...@@ -557,7 +562,7 @@ void __init e820__update_table_print(void) ...@@ -557,7 +562,7 @@ void __init e820__update_table_print(void)
static void __init e820__update_table_firmware(void) static void __init e820__update_table_firmware(void)
{ {
e820__update_table(e820_table_firmware->entries, ARRAY_SIZE(e820_table_firmware->entries), &e820_table_firmware->nr_entries); e820__update_table(e820_table_firmware);
} }
#define MAX_GAP_END 0x100000000ull #define MAX_GAP_END 0x100000000ull
...@@ -676,7 +681,7 @@ void __init e820__memory_setup_extended(u64 phys_addr, u32 data_len) ...@@ -676,7 +681,7 @@ void __init e820__memory_setup_extended(u64 phys_addr, u32 data_len)
extmap = (struct e820_entry *)(sdata->data); extmap = (struct e820_entry *)(sdata->data);
__append_e820_table(extmap, entries); __append_e820_table(extmap, entries);
e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); e820__update_table(e820_table);
early_memunmap(sdata, data_len); early_memunmap(sdata, data_len);
pr_info("e820: extended physical RAM map:\n"); pr_info("e820: extended physical RAM map:\n");
...@@ -931,7 +936,7 @@ void __init e820_reserve_setup_data(void) ...@@ -931,7 +936,7 @@ void __init e820_reserve_setup_data(void)
early_memunmap(data, sizeof(*data)); early_memunmap(data, sizeof(*data));
} }
e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); e820__update_table(e820_table);
memcpy(e820_table_firmware, e820_table, sizeof(*e820_table_firmware)); memcpy(e820_table_firmware, e820_table, sizeof(*e820_table_firmware));
printk(KERN_INFO "extended physical RAM map:\n"); printk(KERN_INFO "extended physical RAM map:\n");
e820__print_table("reserve setup_data"); e820__print_table("reserve setup_data");
...@@ -945,7 +950,7 @@ void __init e820_reserve_setup_data(void) ...@@ -945,7 +950,7 @@ void __init e820_reserve_setup_data(void)
void __init e820__finish_early_params(void) void __init e820__finish_early_params(void)
{ {
if (userdef) { if (userdef) {
if (e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries) < 0) if (e820__update_table(e820_table) < 0)
early_panic("Invalid user supplied memory map"); early_panic("Invalid user supplied memory map");
pr_info("e820: user-defined physical RAM map:\n"); pr_info("e820: user-defined physical RAM map:\n");
...@@ -1132,7 +1137,7 @@ char *__init e820__memory_setup_default(void) ...@@ -1132,7 +1137,7 @@ char *__init e820__memory_setup_default(void)
* the next section from 1mb->appropriate_mem_k * the next section from 1mb->appropriate_mem_k
*/ */
new_nr = boot_params.e820_entries; new_nr = boot_params.e820_entries;
e820__update_table(boot_params.e820_table, ARRAY_SIZE(boot_params.e820_table), &new_nr); __e820__update_table(boot_params.e820_table, ARRAY_SIZE(boot_params.e820_table), &new_nr);
boot_params.e820_entries = new_nr; boot_params.e820_entries = new_nr;
if (append_e820_table(boot_params.e820_table, boot_params.e820_entries) < 0) { if (append_e820_table(boot_params.e820_table, boot_params.e820_entries) < 0) {
......
...@@ -547,7 +547,7 @@ intel_graphics_stolen(int num, int slot, int func, ...@@ -547,7 +547,7 @@ intel_graphics_stolen(int num, int slot, int func,
/* Mark this space as reserved */ /* Mark this space as reserved */
e820__range_add(base, size, E820_TYPE_RESERVED); e820__range_add(base, size, E820_TYPE_RESERVED);
e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); e820__update_table(e820_table);
} }
static void __init intel_graphics_quirks(int num, int slot, int func) static void __init intel_graphics_quirks(int num, int slot, int func)
......
...@@ -740,7 +740,7 @@ static void __init trim_bios_range(void) ...@@ -740,7 +740,7 @@ static void __init trim_bios_range(void)
*/ */
e820__range_remove(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_TYPE_RAM, 1); e820__range_remove(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_TYPE_RAM, 1);
e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); e820__update_table(e820_table);
} }
/* called before trim_bios_range() to spare extra sanitize */ /* called before trim_bios_range() to spare extra sanitize */
...@@ -1033,7 +1033,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -1033,7 +1033,7 @@ void __init setup_arch(char **cmdline_p)
if (ppro_with_ram_bug()) { if (ppro_with_ram_bug()) {
e820__range_update(0x70000000ULL, 0x40000ULL, E820_TYPE_RAM, e820__range_update(0x70000000ULL, 0x40000ULL, E820_TYPE_RAM,
E820_TYPE_RESERVED); E820_TYPE_RESERVED);
e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); e820__update_table(e820_table);
printk(KERN_INFO "fixed physical RAM map:\n"); printk(KERN_INFO "fixed physical RAM map:\n");
e820__print_table("bad_ppro"); e820__print_table("bad_ppro");
} }
......
...@@ -167,7 +167,7 @@ static void __init do_add_efi_memmap(void) ...@@ -167,7 +167,7 @@ static void __init do_add_efi_memmap(void)
} }
e820__range_add(start, size, e820_type); e820__range_add(start, size, e820_type);
} }
e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); e820__update_table(e820_table);
} }
int __init efi_memblock_x86_reserve_range(void) int __init efi_memblock_x86_reserve_range(void)
......
...@@ -782,7 +782,7 @@ char * __init xen_memory_setup(void) ...@@ -782,7 +782,7 @@ char * __init xen_memory_setup(void)
xen_ignore_unusable(); xen_ignore_unusable();
/* Make sure the Xen-supplied memory map is well-ordered. */ /* Make sure the Xen-supplied memory map is well-ordered. */
e820__update_table(xen_e820_table.entries, ARRAY_SIZE(xen_e820_table.entries), &xen_e820_table.nr_entries); e820__update_table(&xen_e820_table);
max_pages = xen_get_max_pages(); max_pages = xen_get_max_pages();
...@@ -856,10 +856,9 @@ char * __init xen_memory_setup(void) ...@@ -856,10 +856,9 @@ char * __init xen_memory_setup(void)
* reserve ISA memory anyway because too many things poke * reserve ISA memory anyway because too many things poke
* about in there. * about in there.
*/ */
e820__range_add(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS, e820__range_add(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS, E820_TYPE_RESERVED);
E820_TYPE_RESERVED);
e820__update_table(e820_table->entries, ARRAY_SIZE(e820_table->entries), &e820_table->nr_entries); e820__update_table(e820_table);
/* /*
* Check whether the kernel itself conflicts with the target E820 map. * Check whether the kernel itself conflicts with the target E820 map.
...@@ -930,7 +929,7 @@ char * __init xen_auto_xlated_memory_setup(void) ...@@ -930,7 +929,7 @@ char * __init xen_auto_xlated_memory_setup(void)
xen_e820_table.nr_entries = memmap.nr_entries; xen_e820_table.nr_entries = memmap.nr_entries;
e820__update_table(xen_e820_table.entries, ARRAY_SIZE(xen_e820_table.entries), &xen_e820_table.nr_entries); e820__update_table(&xen_e820_table);
for (i = 0; i < xen_e820_table.nr_entries; i++) for (i = 0; i < xen_e820_table.nr_entries; i++)
e820__range_add(xen_e820_table.entries[i].addr, xen_e820_table.entries[i].size, xen_e820_table.entries[i].type); e820__range_add(xen_e820_table.entries[i].addr, xen_e820_table.entries[i].size, xen_e820_table.entries[i].type);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment