|
@@ -948,6 +948,33 @@ efi_status_t __weak efi_load_capsule_drivers(void)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * check_run_capsules - Check whether capsule update should run
|
|
|
+ *
|
|
|
+ * The spec says OsIndications must be set in order to run the capsule update
|
|
|
+ * on-disk. Since U-Boot doesn't support runtime SetVariable, allow capsules to
|
|
|
+ * run explicitly if CONFIG_EFI_IGNORE_OSINDICATIONS is selected
|
|
|
+ */
|
|
|
+static bool check_run_capsules(void)
|
|
|
+{
|
|
|
+ u64 os_indications;
|
|
|
+ efi_uintn_t size;
|
|
|
+ efi_status_t ret;
|
|
|
+
|
|
|
+ if (IS_ENABLED(CONFIG_EFI_IGNORE_OSINDICATIONS))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ size = sizeof(os_indications);
|
|
|
+ ret = efi_get_variable_int(L"OsIndications", &efi_global_variable_guid,
|
|
|
+ NULL, &size, &os_indications, NULL);
|
|
|
+ if (ret == EFI_SUCCESS &&
|
|
|
+ (os_indications
|
|
|
+ & EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* efi_launch_capsule - launch capsules
|
|
|
*
|
|
@@ -958,20 +985,13 @@ efi_status_t __weak efi_load_capsule_drivers(void)
|
|
|
*/
|
|
|
efi_status_t efi_launch_capsules(void)
|
|
|
{
|
|
|
- u64 os_indications;
|
|
|
- efi_uintn_t size;
|
|
|
struct efi_capsule_header *capsule = NULL;
|
|
|
u16 **files;
|
|
|
unsigned int nfiles, index, i;
|
|
|
u16 variable_name16[12];
|
|
|
efi_status_t ret;
|
|
|
|
|
|
- size = sizeof(os_indications);
|
|
|
- ret = efi_get_variable_int(L"OsIndications", &efi_global_variable_guid,
|
|
|
- NULL, &size, &os_indications, NULL);
|
|
|
- if (ret != EFI_SUCCESS ||
|
|
|
- !(os_indications
|
|
|
- & EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED))
|
|
|
+ if (!check_run_capsules())
|
|
|
return EFI_SUCCESS;
|
|
|
|
|
|
index = get_last_capsule();
|