|
@@ -60,19 +60,6 @@
|
|
|
|
|
|
static efi_char16_t efi_dummy_name[6] = { 'D', 'U', 'M', 'M', 'Y', 0 };
|
|
|
|
|
|
-struct efi __read_mostly efi = {
|
|
|
- .mps = EFI_INVALID_TABLE_ADDR,
|
|
|
- .acpi = EFI_INVALID_TABLE_ADDR,
|
|
|
- .acpi20 = EFI_INVALID_TABLE_ADDR,
|
|
|
- .smbios = EFI_INVALID_TABLE_ADDR,
|
|
|
- .sal_systab = EFI_INVALID_TABLE_ADDR,
|
|
|
- .boot_info = EFI_INVALID_TABLE_ADDR,
|
|
|
- .hcdp = EFI_INVALID_TABLE_ADDR,
|
|
|
- .uga = EFI_INVALID_TABLE_ADDR,
|
|
|
- .uv_systab = EFI_INVALID_TABLE_ADDR,
|
|
|
-};
|
|
|
-EXPORT_SYMBOL(efi);
|
|
|
-
|
|
|
struct efi_memory_map memmap;
|
|
|
|
|
|
static struct efi efi_phys __initdata;
|
|
@@ -80,6 +67,13 @@ static efi_system_table_t efi_systab __initdata;
|
|
|
|
|
|
unsigned long x86_efi_facility;
|
|
|
|
|
|
+static __initdata efi_config_table_type_t arch_tables[] = {
|
|
|
+#ifdef CONFIG_X86_UV
|
|
|
+ {UV_SYSTEM_TABLE_GUID, "UVsystab", &efi.uv_systab},
|
|
|
+#endif
|
|
|
+ {NULL_GUID, NULL, 0},
|
|
|
+};
|
|
|
+
|
|
|
/*
|
|
|
* Returns 1 if 'facility' is enabled, 0 otherwise.
|
|
|
*/
|
|
@@ -399,6 +393,8 @@ int __init efi_memblock_x86_reserve_range(void)
|
|
|
|
|
|
memblock_reserve(pmap, memmap.nr_map * memmap.desc_size);
|
|
|
|
|
|
+ efi.memmap = &memmap;
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -578,80 +574,6 @@ static int __init efi_systab_init(void *phys)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int __init efi_config_init(u64 tables, int nr_tables)
|
|
|
-{
|
|
|
- void *config_tables, *tablep;
|
|
|
- int i, sz;
|
|
|
-
|
|
|
- if (efi_enabled(EFI_64BIT))
|
|
|
- sz = sizeof(efi_config_table_64_t);
|
|
|
- else
|
|
|
- sz = sizeof(efi_config_table_32_t);
|
|
|
-
|
|
|
- /*
|
|
|
- * Let's see what config tables the firmware passed to us.
|
|
|
- */
|
|
|
- config_tables = early_ioremap(tables, nr_tables * sz);
|
|
|
- if (config_tables == NULL) {
|
|
|
- pr_err("Could not map Configuration table!\n");
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
-
|
|
|
- tablep = config_tables;
|
|
|
- pr_info("");
|
|
|
- for (i = 0; i < efi.systab->nr_tables; i++) {
|
|
|
- efi_guid_t guid;
|
|
|
- unsigned long table;
|
|
|
-
|
|
|
- if (efi_enabled(EFI_64BIT)) {
|
|
|
- u64 table64;
|
|
|
- guid = ((efi_config_table_64_t *)tablep)->guid;
|
|
|
- table64 = ((efi_config_table_64_t *)tablep)->table;
|
|
|
- table = table64;
|
|
|
-#ifdef CONFIG_X86_32
|
|
|
- if (table64 >> 32) {
|
|
|
- pr_cont("\n");
|
|
|
- pr_err("Table located above 4GB, disabling EFI.\n");
|
|
|
- early_iounmap(config_tables,
|
|
|
- efi.systab->nr_tables * sz);
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-#endif
|
|
|
- } else {
|
|
|
- guid = ((efi_config_table_32_t *)tablep)->guid;
|
|
|
- table = ((efi_config_table_32_t *)tablep)->table;
|
|
|
- }
|
|
|
- if (!efi_guidcmp(guid, MPS_TABLE_GUID)) {
|
|
|
- efi.mps = table;
|
|
|
- pr_cont(" MPS=0x%lx ", table);
|
|
|
- } else if (!efi_guidcmp(guid, ACPI_20_TABLE_GUID)) {
|
|
|
- efi.acpi20 = table;
|
|
|
- pr_cont(" ACPI 2.0=0x%lx ", table);
|
|
|
- } else if (!efi_guidcmp(guid, ACPI_TABLE_GUID)) {
|
|
|
- efi.acpi = table;
|
|
|
- pr_cont(" ACPI=0x%lx ", table);
|
|
|
- } else if (!efi_guidcmp(guid, SMBIOS_TABLE_GUID)) {
|
|
|
- efi.smbios = table;
|
|
|
- pr_cont(" SMBIOS=0x%lx ", table);
|
|
|
-#ifdef CONFIG_X86_UV
|
|
|
- } else if (!efi_guidcmp(guid, UV_SYSTEM_TABLE_GUID)) {
|
|
|
- efi.uv_systab = table;
|
|
|
- pr_cont(" UVsystab=0x%lx ", table);
|
|
|
-#endif
|
|
|
- } else if (!efi_guidcmp(guid, HCDP_TABLE_GUID)) {
|
|
|
- efi.hcdp = table;
|
|
|
- pr_cont(" HCDP=0x%lx ", table);
|
|
|
- } else if (!efi_guidcmp(guid, UGA_IO_PROTOCOL_GUID)) {
|
|
|
- efi.uga = table;
|
|
|
- pr_cont(" UGA=0x%lx ", table);
|
|
|
- }
|
|
|
- tablep += sz;
|
|
|
- }
|
|
|
- pr_cont("\n");
|
|
|
- early_iounmap(config_tables, efi.systab->nr_tables * sz);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static int __init efi_runtime_init(void)
|
|
|
{
|
|
|
efi_runtime_services_t *runtime;
|
|
@@ -745,7 +667,7 @@ void __init efi_init(void)
|
|
|
efi.systab->hdr.revision >> 16,
|
|
|
efi.systab->hdr.revision & 0xffff, vendor);
|
|
|
|
|
|
- if (efi_config_init(efi.systab->tables, efi.systab->nr_tables))
|
|
|
+ if (efi_config_init(arch_tables))
|
|
|
return;
|
|
|
|
|
|
set_bit(EFI_CONFIG_TABLES, &x86_efi_facility);
|
|
@@ -816,34 +738,6 @@ static void __init runtime_code_page_mkexec(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * We can't ioremap data in EFI boot services RAM, because we've already mapped
|
|
|
- * it as RAM. So, look it up in the existing EFI memory map instead. Only
|
|
|
- * callable after efi_enter_virtual_mode and before efi_free_boot_services.
|
|
|
- */
|
|
|
-void __iomem *efi_lookup_mapped_addr(u64 phys_addr)
|
|
|
-{
|
|
|
- void *p;
|
|
|
- if (WARN_ON(!memmap.map))
|
|
|
- return NULL;
|
|
|
- for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
|
|
|
- efi_memory_desc_t *md = p;
|
|
|
- u64 size = md->num_pages << EFI_PAGE_SHIFT;
|
|
|
- u64 end = md->phys_addr + size;
|
|
|
- if (!(md->attribute & EFI_MEMORY_RUNTIME) &&
|
|
|
- md->type != EFI_BOOT_SERVICES_CODE &&
|
|
|
- md->type != EFI_BOOT_SERVICES_DATA)
|
|
|
- continue;
|
|
|
- if (!md->virt_addr)
|
|
|
- continue;
|
|
|
- if (phys_addr >= md->phys_addr && phys_addr < end) {
|
|
|
- phys_addr += md->virt_addr - md->phys_addr;
|
|
|
- return (__force void __iomem *)(unsigned long)phys_addr;
|
|
|
- }
|
|
|
- }
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
void efi_memory_uc(u64 addr, unsigned long size)
|
|
|
{
|
|
|
unsigned long page_shift = 1UL << EFI_PAGE_SHIFT;
|