Merge tag 'powerpc-5.9-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[linux-2.6-microblaze.git] / drivers / firmware / efi / efi.c
index 4e30552..3aa07c3 100644 (file)
@@ -54,7 +54,7 @@ struct mm_struct efi_mm = {
        .mm_rb                  = RB_ROOT,
        .mm_users               = ATOMIC_INIT(2),
        .mm_count               = ATOMIC_INIT(1),
-       .mmap_sem               = __RWSEM_INITIALIZER(efi_mm.mmap_sem),
+       MMAP_LOCK_INITIALIZER(efi_mm)
        .page_table_lock        = __SPIN_LOCK_UNLOCKED(efi_mm.page_table_lock),
        .mmlist                 = LIST_HEAD_INIT(efi_mm.mmlist),
        .cpu_bitmap             = { [BITS_TO_LONGS(NR_CPUS)] = 0},
@@ -176,11 +176,13 @@ static struct efivar_operations generic_ops;
 static int generic_ops_register(void)
 {
        generic_ops.get_variable = efi.get_variable;
-       generic_ops.set_variable = efi.set_variable;
-       generic_ops.set_variable_nonblocking = efi.set_variable_nonblocking;
        generic_ops.get_next_variable = efi.get_next_variable;
        generic_ops.query_variable_store = efi_query_variable_store;
 
+       if (efi_rt_services_supported(EFI_RT_SUPPORTED_SET_VARIABLE)) {
+               generic_ops.set_variable = efi.set_variable;
+               generic_ops.set_variable_nonblocking = efi.set_variable_nonblocking;
+       }
        return efivars_register(&generic_efivars, &generic_ops, efi_kobj);
 }
 
@@ -189,7 +191,7 @@ static void generic_ops_unregister(void)
        efivars_unregister(&generic_efivars);
 }
 
-#if IS_ENABLED(CONFIG_ACPI)
+#ifdef CONFIG_EFI_CUSTOM_SSDT_OVERLAYS
 #define EFIVAR_SSDT_NAME_MAX   16
 static char efivar_ssdt[EFIVAR_SSDT_NAME_MAX] __initdata;
 static int __init efivar_ssdt_setup(char *str)
@@ -379,10 +381,12 @@ static int __init efisubsys_init(void)
        efi_kobj = kobject_create_and_add("efi", firmware_kobj);
        if (!efi_kobj) {
                pr_err("efi: Firmware registration failed.\n");
+               destroy_workqueue(efi_rts_wq);
                return -ENOMEM;
        }
 
-       if (efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES)) {
+       if (efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE |
+                                     EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME)) {
                efivar_ssdt_load();
                error = generic_ops_register();
                if (error)
@@ -416,10 +420,12 @@ static int __init efisubsys_init(void)
 err_remove_group:
        sysfs_remove_group(efi_kobj, &efi_subsys_attr_group);
 err_unregister:
-       if (efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
+       if (efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE |
+                                     EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME))
                generic_ops_unregister();
 err_put:
        kobject_put(efi_kobj);
+       destroy_workqueue(efi_rts_wq);
        return error;
 }
 
@@ -499,21 +505,21 @@ void __init efi_mem_reserve(phys_addr_t addr, u64 size)
 }
 
 static const efi_config_table_type_t common_tables[] __initconst = {
-       {ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20},
-       {ACPI_TABLE_GUID, "ACPI", &efi.acpi},
-       {SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios},
-       {SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
-       {EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
-       {EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi_mem_attr_table},
-       {LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &efi_rng_seed},
-       {LINUX_EFI_TPM_EVENT_LOG_GUID, "TPMEventLog", &efi.tpm_log},
-       {LINUX_EFI_TPM_FINAL_LOG_GUID, "TPMFinalLog", &efi.tpm_final_log},
-       {LINUX_EFI_MEMRESERVE_TABLE_GUID, "MEMRESERVE", &mem_reserve},
-       {EFI_RT_PROPERTIES_TABLE_GUID, "RTPROP", &rt_prop},
+       {ACPI_20_TABLE_GUID,                    &efi.acpi20,            "ACPI 2.0"      },
+       {ACPI_TABLE_GUID,                       &efi.acpi,              "ACPI"          },
+       {SMBIOS_TABLE_GUID,                     &efi.smbios,            "SMBIOS"        },
+       {SMBIOS3_TABLE_GUID,                    &efi.smbios3,           "SMBIOS 3.0"    },
+       {EFI_SYSTEM_RESOURCE_TABLE_GUID,        &efi.esrt,              "ESRT"          },
+       {EFI_MEMORY_ATTRIBUTES_TABLE_GUID,      &efi_mem_attr_table,    "MEMATTR"       },
+       {LINUX_EFI_RANDOM_SEED_TABLE_GUID,      &efi_rng_seed,          "RNG"           },
+       {LINUX_EFI_TPM_EVENT_LOG_GUID,          &efi.tpm_log,           "TPMEventLog"   },
+       {LINUX_EFI_TPM_FINAL_LOG_GUID,          &efi.tpm_final_log,     "TPMFinalLog"   },
+       {LINUX_EFI_MEMRESERVE_TABLE_GUID,       &mem_reserve,           "MEMRESERVE"    },
+       {EFI_RT_PROPERTIES_TABLE_GUID,          &rt_prop,               "RTPROP"        },
 #ifdef CONFIG_EFI_RCI2_TABLE
-       {DELLEMC_EFI_RCI2_TABLE_GUID, NULL, &rci2_table_phys},
+       {DELLEMC_EFI_RCI2_TABLE_GUID,           &rci2_table_phys                        },
 #endif
-       {NULL_GUID, NULL, NULL},
+       {},
 };
 
 static __init int match_config_table(const efi_guid_t *guid,
@@ -522,15 +528,13 @@ static __init int match_config_table(const efi_guid_t *guid,
 {
        int i;
 
-       if (table_types) {
-               for (i = 0; efi_guidcmp(table_types[i].guid, NULL_GUID); i++) {
-                       if (!efi_guidcmp(*guid, table_types[i].guid)) {
-                               *(table_types[i].ptr) = table;
-                               if (table_types[i].name)
-                                       pr_cont(" %s=0x%lx ",
-                                               table_types[i].name, table);
-                               return 1;
-                       }
+       for (i = 0; efi_guidcmp(table_types[i].guid, NULL_GUID); i++) {
+               if (!efi_guidcmp(*guid, table_types[i].guid)) {
+                       *(table_types[i].ptr) = table;
+                       if (table_types[i].name[0])
+                               pr_cont("%s=0x%lx ",
+                                       table_types[i].name, table);
+                       return 1;
                }
        }
 
@@ -567,7 +571,7 @@ int __init efi_config_parse_tables(const efi_config_table_t *config_tables,
                        table = tbl32[i].table;
                }
 
-               if (!match_config_table(guid, table, common_tables))
+               if (!match_config_table(guid, table, common_tables) && arch_tables)
                        match_config_table(guid, table, arch_tables);
        }
        pr_cont("\n");
@@ -624,7 +628,8 @@ int __init efi_config_parse_tables(const efi_config_table_t *config_tables,
                        rsv = (void *)(p + prsv % PAGE_SIZE);
 
                        /* reserve the entry itself */
-                       memblock_reserve(prsv, EFI_MEMRESERVE_SIZE(rsv->size));
+                       memblock_reserve(prsv,
+                                        struct_size(rsv, entry, rsv->size));
 
                        for (i = 0; i < atomic_read(&rsv->count); i++) {
                                memblock_reserve(rsv->entry[i].base,