Commit 83e7ee66 authored by Olof Johansson's avatar Olof Johansson Committed by H. Peter Anvin

x86, efi: Refactor efi_init() a bit

Break out some of the init steps into helper functions.

Only change to execution flow is the removal of the warning when the
kernel memdesc structure differ in size from what firmware specifies
since it's a bogus warning (it's a valid difference per spec).

v4:
* Removed memdesc warning as per above
Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
Link: http://lkml.kernel.org/r/1329081869-20779-2-git-send-email-olof@lixom.netAcked-by: default avatarMatt Fleming <matt.fleming@intel.com>
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent b01543df
...@@ -429,23 +429,8 @@ static void __init efi_free_boot_services(void) ...@@ -429,23 +429,8 @@ static void __init efi_free_boot_services(void)
} }
} }
void __init efi_init(void) static void __init efi_systab_init(void *phys)
{ {
efi_config_table_t *config_tables;
efi_runtime_services_t *runtime;
efi_char16_t *c16;
char vendor[100] = "unknown";
int i = 0;
void *tmp;
#ifdef CONFIG_X86_32
efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab;
#else
efi_phys.systab = (efi_system_table_t *)
(boot_params.efi_info.efi_systab |
((__u64)boot_params.efi_info.efi_systab_hi<<32));
#endif
efi.systab = early_ioremap((unsigned long)efi_phys.systab, efi.systab = early_ioremap((unsigned long)efi_phys.systab,
sizeof(efi_system_table_t)); sizeof(efi_system_table_t));
if (efi.systab == NULL) if (efi.systab == NULL)
...@@ -464,22 +449,12 @@ void __init efi_init(void) ...@@ -464,22 +449,12 @@ void __init efi_init(void)
"%d.%02d, expected 1.00 or greater!\n", "%d.%02d, expected 1.00 or greater!\n",
efi.systab->hdr.revision >> 16, efi.systab->hdr.revision >> 16,
efi.systab->hdr.revision & 0xffff); efi.systab->hdr.revision & 0xffff);
}
/* static void __init efi_config_init(u64 tables, int nr_tables)
* Show what we know for posterity {
*/ efi_config_table_t *config_tables;
c16 = tmp = early_ioremap(efi.systab->fw_vendor, 2); int i;
if (c16) {
for (i = 0; i < sizeof(vendor) - 1 && *c16; ++i)
vendor[i] = *c16++;
vendor[i] = '\0';
} else
printk(KERN_ERR PFX "Could not map the firmware vendor!\n");
early_iounmap(tmp, 2);
printk(KERN_INFO "EFI v%u.%.02u by %s\n",
efi.systab->hdr.revision >> 16,
efi.systab->hdr.revision & 0xffff, vendor);
/* /*
* Let's see what config tables the firmware passed to us. * Let's see what config tables the firmware passed to us.
...@@ -526,6 +501,11 @@ void __init efi_init(void) ...@@ -526,6 +501,11 @@ void __init efi_init(void)
printk("\n"); printk("\n");
early_iounmap(config_tables, early_iounmap(config_tables,
efi.systab->nr_tables * sizeof(efi_config_table_t)); efi.systab->nr_tables * sizeof(efi_config_table_t));
}
static void __init efi_runtime_init(void)
{
efi_runtime_services_t *runtime;
/* /*
* Check out the runtime services table. We need to map * Check out the runtime services table. We need to map
...@@ -554,7 +534,10 @@ void __init efi_init(void) ...@@ -554,7 +534,10 @@ void __init efi_init(void)
printk(KERN_ERR "Could not map the EFI runtime service " printk(KERN_ERR "Could not map the EFI runtime service "
"table!\n"); "table!\n");
early_iounmap(runtime, sizeof(efi_runtime_services_t)); early_iounmap(runtime, sizeof(efi_runtime_services_t));
}
static void __init efi_memmap_init(void)
{
/* Map the EFI memory map */ /* Map the EFI memory map */
memmap.map = early_ioremap((unsigned long)memmap.phys_map, memmap.map = early_ioremap((unsigned long)memmap.phys_map,
memmap.nr_map * memmap.desc_size); memmap.nr_map * memmap.desc_size);
...@@ -562,12 +545,48 @@ void __init efi_init(void) ...@@ -562,12 +545,48 @@ void __init efi_init(void)
printk(KERN_ERR "Could not map the EFI memory map!\n"); printk(KERN_ERR "Could not map the EFI memory map!\n");
memmap.map_end = memmap.map + (memmap.nr_map * memmap.desc_size); memmap.map_end = memmap.map + (memmap.nr_map * memmap.desc_size);
if (memmap.desc_size != sizeof(efi_memory_desc_t))
printk(KERN_WARNING
"Kernel-defined memdesc doesn't match the one from EFI!\n");
if (add_efi_memmap) if (add_efi_memmap)
do_add_efi_memmap(); do_add_efi_memmap();
}
void __init efi_init(void)
{
efi_char16_t *c16;
char vendor[100] = "unknown";
int i = 0;
void *tmp;
#ifdef CONFIG_X86_32
efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab;
#else
efi_phys.systab = (efi_system_table_t *)
(boot_params.efi_info.efi_systab |
((__u64)boot_params.efi_info.efi_systab_hi<<32));
#endif
efi_systab_init(efi_phys.systab);
/*
* Show what we know for posterity
*/
c16 = tmp = early_ioremap(efi.systab->fw_vendor, 2);
if (c16) {
for (i = 0; i < sizeof(vendor) - 1 && *c16; ++i)
vendor[i] = *c16++;
vendor[i] = '\0';
} else
printk(KERN_ERR PFX "Could not map the firmware vendor!\n");
early_iounmap(tmp, 2);
printk(KERN_INFO "EFI v%u.%.02u by %s\n",
efi.systab->hdr.revision >> 16,
efi.systab->hdr.revision & 0xffff, vendor);
efi_config_init(efi.systab->tables, efi.systab->nr_tables);
efi_runtime_init();
efi_memmap_init();
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
x86_platform.get_wallclock = efi_get_time; x86_platform.get_wallclock = efi_get_time;
......
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