aboutsummaryrefslogtreecommitdiff
path: root/drivers/firmware/efi/efi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firmware/efi/efi.c')
-rw-r--r--drivers/firmware/efi/efi.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
index 4b7ee3fa9224..25f7e3d22d1c 100644
--- a/drivers/firmware/efi/efi.c
+++ b/drivers/firmware/efi/efi.c
@@ -52,6 +52,9 @@ EXPORT_SYMBOL(efi);
unsigned long __ro_after_init efi_rng_seed = EFI_INVALID_TABLE_ADDR;
static unsigned long __initdata mem_reserve = EFI_INVALID_TABLE_ADDR;
static unsigned long __initdata rt_prop = EFI_INVALID_TABLE_ADDR;
+#ifdef CONFIG_OPTEE_EFI_VARS
+static unsigned long __initdata tee_var = EFI_INVALID_TABLE_ADDR;
+#endif
struct mm_struct efi_mm = {
.mm_rb = RB_ROOT,
@@ -179,6 +182,17 @@ static struct efivar_operations generic_ops;
static int generic_ops_register(void)
{
+#ifdef CONFIG_OPTEE_EFI_VARS
+ if (tee_var != EFI_INVALID_TABLE_ADDR ) {
+ efi_status_t ret;
+
+ pr_err("EFI variable ops swapped\n");
+ ret = optee_efi_ops_init(&generic_ops);
+ if (ret == EFI_SUCCESS)
+ return efivars_register(&generic_efivars, &generic_ops, efi_kobj);
+ }
+#endif
+
generic_ops.get_variable = efi.get_variable;
generic_ops.get_next_variable = efi.get_next_variable;
generic_ops.query_variable_store = efi_query_variable_store;
@@ -519,7 +533,10 @@ static const efi_config_table_type_t common_tables[] __initconst = {
{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" },
+ {EFI_RT_PROPERTIES_TABLE_GUID, &rt_prop, "RTPROPS" },
+#ifdef CONFIG_OPTEE_EFI_VARS
+ {EFI_INT_VARIABLES_TABLE_GUID, &tee_var, "INTVAR" },
+#endif
#ifdef CONFIG_EFI_RCI2_TABLE
{DELLEMC_EFI_RCI2_TABLE_GUID, &rci2_table_phys },
#endif