diff options
Diffstat (limited to 'lib/efi_loader/efi_capsule.c')
| -rw-r--r-- | lib/efi_loader/efi_capsule.c | 36 | 
1 files changed, 28 insertions, 8 deletions
| diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c index d7136035d8f..50bed32bfb3 100644 --- a/lib/efi_loader/efi_capsule.c +++ b/lib/efi_loader/efi_capsule.c @@ -949,6 +949,33 @@ efi_status_t __weak efi_load_capsule_drivers(void)  }  /** + * 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   *   * Launch all the capsules in system at boot time. @@ -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(); | 
