提交 bf67fad1 编写于 作者: A Ard Biesheuvel

efi: Use more granular check for availability for variable services

The UEFI spec rev 2.8 permits firmware implementations to support only
a subset of EFI runtime services at OS runtime (i.e., after the call to
ExitBootServices()), so let's take this into account in the drivers that
rely specifically on the availability of the EFI variable services.
Signed-off-by: NArd Biesheuvel <ardb@kernel.org>
上级 fe4db90a
...@@ -356,7 +356,7 @@ static struct pstore_info efi_pstore_info = { ...@@ -356,7 +356,7 @@ static struct pstore_info efi_pstore_info = {
static __init int efivars_pstore_init(void) static __init int efivars_pstore_init(void)
{ {
if (!efi_enabled(EFI_RUNTIME_SERVICES)) if (!efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
return 0; return 0;
if (!efivars_kobject()) if (!efivars_kobject())
......
...@@ -328,12 +328,13 @@ static int __init efisubsys_init(void) ...@@ -328,12 +328,13 @@ static int __init efisubsys_init(void)
return -ENOMEM; return -ENOMEM;
} }
if (efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES)) {
efivar_ssdt_load();
error = generic_ops_register(); error = generic_ops_register();
if (error) if (error)
goto err_put; goto err_put;
platform_device_register_simple("efivars", 0, NULL, 0);
if (efi_enabled(EFI_RUNTIME_SERVICES)) }
efivar_ssdt_load();
error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group); error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group);
if (error) { if (error) {
...@@ -358,6 +359,7 @@ static int __init efisubsys_init(void) ...@@ -358,6 +359,7 @@ static int __init efisubsys_init(void)
err_remove_group: err_remove_group:
sysfs_remove_group(efi_kobj, &efi_subsys_attr_group); sysfs_remove_group(efi_kobj, &efi_subsys_attr_group);
err_unregister: err_unregister:
if (efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
generic_ops_unregister(); generic_ops_unregister();
err_put: err_put:
kobject_put(efi_kobj); kobject_put(efi_kobj);
...@@ -650,20 +652,6 @@ void __init efi_systab_report_header(const efi_table_hdr_t *systab_hdr, ...@@ -650,20 +652,6 @@ void __init efi_systab_report_header(const efi_table_hdr_t *systab_hdr,
vendor); vendor);
} }
#ifdef CONFIG_EFI_VARS_MODULE
static int __init efi_load_efivars(void)
{
struct platform_device *pdev;
if (!efi_enabled(EFI_RUNTIME_SERVICES))
return 0;
pdev = platform_device_register_simple("efivars", 0, NULL, 0);
return PTR_ERR_OR_ZERO(pdev);
}
device_initcall(efi_load_efivars);
#endif
static __initdata char memory_type_name[][20] = { static __initdata char memory_type_name[][20] = {
"Reserved", "Reserved",
"Loader Code", "Loader Code",
......
...@@ -664,7 +664,7 @@ int efivars_sysfs_init(void) ...@@ -664,7 +664,7 @@ int efivars_sysfs_init(void)
struct kobject *parent_kobj = efivars_kobject(); struct kobject *parent_kobj = efivars_kobject();
int error = 0; int error = 0;
if (!efi_enabled(EFI_RUNTIME_SERVICES)) if (!efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
return -ENODEV; return -ENODEV;
/* No efivars has been registered yet */ /* No efivars has been registered yet */
......
...@@ -252,7 +252,7 @@ static struct file_system_type efivarfs_type = { ...@@ -252,7 +252,7 @@ static struct file_system_type efivarfs_type = {
static __init int efivarfs_init(void) static __init int efivarfs_init(void)
{ {
if (!efi_enabled(EFI_RUNTIME_SERVICES)) if (!efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
return -ENODEV; return -ENODEV;
if (!efivars_kobject()) if (!efivars_kobject())
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册