Merge tag 'renesas-boards-cleanups2-for-v3.19' of git://git.kernel.org/pub/scm/linux...
[firefly-linux-kernel-4.4.55.git] / drivers / firmware / efi / runtime-wrappers.c
index 9694cba665c46aae34a6a4d155460a3993bcf65a..228bbf91046137de619a4f8f89825e8ccc34b5ab 100644 (file)
@@ -86,9 +86,6 @@ static DEFINE_SPINLOCK(efi_runtime_lock);
  * for QueryVariableInfo() and SetVariable(), as these can be reached in NMI
  * context through efi_pstore_write().
  */
-#ifndef efi_in_nmi
-#define efi_in_nmi()   (0)
-#endif
 
 /*
  * As per commit ef68c8f87ed1 ("x86: Serialize EFI time accesses on rtc_lock"),
@@ -189,17 +186,32 @@ static efi_status_t virt_efi_set_variable(efi_char16_t *name,
 {
        unsigned long flags;
        efi_status_t status;
-       bool __in_nmi = efi_in_nmi();
 
-       if (!__in_nmi)
-               spin_lock_irqsave(&efi_runtime_lock, flags);
+       spin_lock_irqsave(&efi_runtime_lock, flags);
+       status = efi_call_virt(set_variable, name, vendor, attr, data_size,
+                              data);
+       spin_unlock_irqrestore(&efi_runtime_lock, flags);
+       return status;
+}
+
+static efi_status_t
+virt_efi_set_variable_nonblocking(efi_char16_t *name, efi_guid_t *vendor,
+                                 u32 attr, unsigned long data_size,
+                                 void *data)
+{
+       unsigned long flags;
+       efi_status_t status;
+
+       if (!spin_trylock_irqsave(&efi_runtime_lock, flags))
+               return EFI_NOT_READY;
+
        status = efi_call_virt(set_variable, name, vendor, attr, data_size,
                               data);
-       if (!__in_nmi)
-               spin_unlock_irqrestore(&efi_runtime_lock, flags);
+       spin_unlock_irqrestore(&efi_runtime_lock, flags);
        return status;
 }
 
+
 static efi_status_t virt_efi_query_variable_info(u32 attr,
                                                 u64 *storage_space,
                                                 u64 *remaining_space,
@@ -207,17 +219,14 @@ static efi_status_t virt_efi_query_variable_info(u32 attr,
 {
        unsigned long flags;
        efi_status_t status;
-       bool __in_nmi = efi_in_nmi();
 
        if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
                return EFI_UNSUPPORTED;
 
-       if (!__in_nmi)
-               spin_lock_irqsave(&efi_runtime_lock, flags);
+       spin_lock_irqsave(&efi_runtime_lock, flags);
        status = efi_call_virt(query_variable_info, attr, storage_space,
                               remaining_space, max_variable_size);
-       if (!__in_nmi)
-               spin_unlock_irqrestore(&efi_runtime_lock, flags);
+       spin_unlock_irqrestore(&efi_runtime_lock, flags);
        return status;
 }
 
@@ -287,6 +296,7 @@ void efi_native_runtime_setup(void)
        efi.get_variable = virt_efi_get_variable;
        efi.get_next_variable = virt_efi_get_next_variable;
        efi.set_variable = virt_efi_set_variable;
+       efi.set_variable_nonblocking = virt_efi_set_variable_nonblocking;
        efi.get_next_high_mono_count = virt_efi_get_next_high_mono_count;
        efi.reset_system = virt_efi_reset_system;
        efi.query_variable_info = virt_efi_query_variable_info;