diff options
Diffstat (limited to 'arch/ia64/kernel/efi.c')
| -rw-r--r-- | arch/ia64/kernel/efi.c | 59 | 
1 files changed, 17 insertions, 42 deletions
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index 51bce594eb8..741b99c1a0b 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c @@ -44,10 +44,15 @@  #define EFI_DEBUG	0 +static __initdata unsigned long palo_phys; + +static __initdata efi_config_table_type_t arch_tables[] = { +	{PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID, "PALO", &palo_phys}, +	{NULL_GUID, NULL, 0}, +}; +  extern efi_status_t efi_call_phys (void *, ...); -struct efi efi; -EXPORT_SYMBOL(efi);  static efi_runtime_services_t *runtime;  static u64 mem_limit = ~0UL, max_addr = ~0UL, min_addr = 0UL; @@ -423,9 +428,9 @@ static u8 __init palo_checksum(u8 *buffer, u32 length)   * Parse and handle PALO table which is published at:   * http://www.dig64.org/home/DIG64_PALO_R1_0.pdf   */ -static void __init handle_palo(unsigned long palo_phys) +static void __init handle_palo(unsigned long phys_addr)  { -	struct palo_table *palo = __va(palo_phys); +	struct palo_table *palo = __va(phys_addr);  	u8  checksum;  	if (strncmp(palo->signature, PALO_SIG, sizeof(PALO_SIG) - 1)) { @@ -467,12 +472,13 @@ void __init  efi_init (void)  {  	void *efi_map_start, *efi_map_end; -	efi_config_table_t *config_tables;  	efi_char16_t *c16;  	u64 efi_desc_size;  	char *cp, vendor[100] = "unknown";  	int i; -	unsigned long palo_phys; + +	set_bit(EFI_BOOT, &efi.flags); +	set_bit(EFI_64BIT, &efi.flags);  	/*  	 * It's too early to be able to use the standard kernel command line @@ -514,8 +520,6 @@ efi_init (void)  		       efi.systab->hdr.revision >> 16,  		       efi.systab->hdr.revision & 0xffff); -	config_tables = __va(efi.systab->tables); -  	/* Show what we know for posterity */  	c16 = __va(efi.systab->fw_vendor);  	if (c16) { @@ -528,43 +532,12 @@ efi_init (void)  	       efi.systab->hdr.revision >> 16,  	       efi.systab->hdr.revision & 0xffff, vendor); -	efi.mps        = EFI_INVALID_TABLE_ADDR; -	efi.acpi       = EFI_INVALID_TABLE_ADDR; -	efi.acpi20     = EFI_INVALID_TABLE_ADDR; -	efi.smbios     = EFI_INVALID_TABLE_ADDR; -	efi.sal_systab = EFI_INVALID_TABLE_ADDR; -	efi.boot_info  = EFI_INVALID_TABLE_ADDR; -	efi.hcdp       = EFI_INVALID_TABLE_ADDR; -	efi.uga        = EFI_INVALID_TABLE_ADDR; +	set_bit(EFI_SYSTEM_TABLES, &efi.flags);  	palo_phys      = EFI_INVALID_TABLE_ADDR; -	for (i = 0; i < (int) efi.systab->nr_tables; i++) { -		if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) { -			efi.mps = config_tables[i].table; -			printk(" MPS=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) { -			efi.acpi20 = config_tables[i].table; -			printk(" ACPI 2.0=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) { -			efi.acpi = config_tables[i].table; -			printk(" ACPI=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) { -			efi.smbios = config_tables[i].table; -			printk(" SMBIOS=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, SAL_SYSTEM_TABLE_GUID) == 0) { -			efi.sal_systab = config_tables[i].table; -			printk(" SALsystab=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) { -			efi.hcdp = config_tables[i].table; -			printk(" HCDP=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, -			 PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID) == 0) { -			palo_phys = config_tables[i].table; -			printk(" PALO=0x%lx", config_tables[i].table); -		} -	} -	printk("\n"); +	if (efi_config_init(arch_tables) != 0) +		return;  	if (palo_phys != EFI_INVALID_TABLE_ADDR)  		handle_palo(palo_phys); @@ -689,6 +662,8 @@ efi_enter_virtual_mode (void)  		return;  	} +	set_bit(EFI_RUNTIME_SERVICES, &efi.flags); +  	/*  	 * Now that EFI is in virtual mode, we call the EFI functions more  	 * efficiently:  | 
