diff options
Diffstat (limited to 'arch/x86/platform/efi/quirks.c')
| -rw-r--r-- | arch/x86/platform/efi/quirks.c | 47 | 
1 files changed, 25 insertions, 22 deletions
diff --git a/arch/x86/platform/efi/quirks.c b/arch/x86/platform/efi/quirks.c index f8f0220b6a66..88d32c06cffa 100644 --- a/arch/x86/platform/efi/quirks.c +++ b/arch/x86/platform/efi/quirks.c @@ -16,6 +16,7 @@  #include <asm/efi.h>  #include <asm/uv/uv.h>  #include <asm/cpu_device_id.h> +#include <asm/realmode.h>  #include <asm/reboot.h>  #define EFI_MIN_RESERVE 5120 @@ -243,7 +244,7 @@ EXPORT_SYMBOL_GPL(efi_query_variable_store);   */  void __init efi_arch_mem_reserve(phys_addr_t addr, u64 size)  { -	phys_addr_t new_phys, new_size; +	struct efi_memory_map_data data = { 0 };  	struct efi_mem_range mr;  	efi_memory_desc_t md;  	int num_entries; @@ -271,24 +272,21 @@ void __init efi_arch_mem_reserve(phys_addr_t addr, u64 size)  	num_entries = efi_memmap_split_count(&md, &mr.range);  	num_entries += efi.memmap.nr_map; -	new_size = efi.memmap.desc_size * num_entries; - -	new_phys = efi_memmap_alloc(num_entries); -	if (!new_phys) { +	if (efi_memmap_alloc(num_entries, &data) != 0) {  		pr_err("Could not allocate boot services memmap\n");  		return;  	} -	new = early_memremap(new_phys, new_size); +	new = early_memremap(data.phys_map, data.size);  	if (!new) {  		pr_err("Failed to map new boot services memmap\n");  		return;  	}  	efi_memmap_insert(&efi.memmap, new, &mr); -	early_memunmap(new, new_size); +	early_memunmap(new, data.size); -	efi_memmap_install(new_phys, num_entries); +	efi_memmap_install(&data);  	e820__range_update(addr, size, E820_TYPE_RAM, E820_TYPE_RESERVED);  	e820__update_table(e820_table);  } @@ -384,10 +382,10 @@ static void __init efi_unmap_pages(efi_memory_desc_t *md)  	/*  	 * To Do: Remove this check after adding functionality to unmap EFI boot -	 * services code/data regions from direct mapping area because -	 * "efi=old_map" maps EFI regions in swapper_pg_dir. +	 * services code/data regions from direct mapping area because the UV1 +	 * memory map maps EFI regions in swapper_pg_dir.  	 */ -	if (efi_enabled(EFI_OLD_MEMMAP)) +	if (efi_have_uv1_memmap())  		return;  	/* @@ -395,7 +393,7 @@ static void __init efi_unmap_pages(efi_memory_desc_t *md)  	 * EFI runtime calls, hence don't unmap EFI boot services code/data  	 * regions.  	 */ -	if (!efi_is_native()) +	if (efi_is_mixed())  		return;  	if (kernel_unmap_pages_in_pgd(pgd, pa, md->num_pages)) @@ -407,7 +405,7 @@ static void __init efi_unmap_pages(efi_memory_desc_t *md)  void __init efi_free_boot_services(void)  { -	phys_addr_t new_phys, new_size; +	struct efi_memory_map_data data = { 0 };  	efi_memory_desc_t *md;  	int num_entries = 0;  	void *new, *new_md; @@ -462,14 +460,12 @@ void __init efi_free_boot_services(void)  	if (!num_entries)  		return; -	new_size = efi.memmap.desc_size * num_entries; -	new_phys = efi_memmap_alloc(num_entries); -	if (!new_phys) { +	if (efi_memmap_alloc(num_entries, &data) != 0) {  		pr_err("Failed to allocate new EFI memmap\n");  		return;  	} -	new = memremap(new_phys, new_size, MEMREMAP_WB); +	new = memremap(data.phys_map, data.size, MEMREMAP_WB);  	if (!new) {  		pr_err("Failed to map new EFI memmap\n");  		return; @@ -493,7 +489,7 @@ void __init efi_free_boot_services(void)  	memunmap(new); -	if (efi_memmap_install(new_phys, num_entries)) { +	if (efi_memmap_install(&data) != 0) {  		pr_err("Could not install new EFI memmap\n");  		return;  	} @@ -558,7 +554,7 @@ out:  	return ret;  } -static const struct dmi_system_id sgi_uv1_dmi[] = { +static const struct dmi_system_id sgi_uv1_dmi[] __initconst = {  	{ NULL, "SGI UV1",  		{	DMI_MATCH(DMI_PRODUCT_NAME,	"Stoutland Platform"),  			DMI_MATCH(DMI_PRODUCT_VERSION,	"1.0"), @@ -581,8 +577,15 @@ void __init efi_apply_memmap_quirks(void)  	}  	/* UV2+ BIOS has a fix for this issue.  UV1 still needs the quirk. */ -	if (dmi_check_system(sgi_uv1_dmi)) -		set_bit(EFI_OLD_MEMMAP, &efi.flags); +	if (dmi_check_system(sgi_uv1_dmi)) { +		if (IS_ENABLED(CONFIG_X86_UV)) { +			set_bit(EFI_UV1_MEMMAP, &efi.flags); +		} else { +			pr_warn("EFI runtime disabled, needs CONFIG_X86_UV=y on UV1\n"); +			clear_bit(EFI_RUNTIME_SERVICES, &efi.flags); +			efi_memmap_unmap(); +		} +	}  }  /* @@ -720,7 +723,7 @@ void efi_recover_from_page_fault(unsigned long phys_addr)  	/*  	 * Make sure that an efi runtime service caused the page fault.  	 * "efi_mm" cannot be used to check if the page fault had occurred -	 * in the firmware context because efi=old_map doesn't use efi_pgd. +	 * in the firmware context because the UV1 memmap doesn't use efi_pgd.  	 */  	if (efi_rts_work.efi_rts_id == EFI_NONE)  		return;  | 

