1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-29 22:41:17 +02:00

efi_loader: auto-generate removable media boot option first

This commit auto-generates the boot option for removable
block io devices followed by fixed block io devices.
This is what EDK II reference implementation does.

Signed-off-by: Masahisa Kojima <masahisa.kojima@linaro.org>
Reviewed-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
This commit is contained in:
Masahisa Kojima
2024-01-12 09:19:23 +09:00
committed by Heinrich Schuchardt
parent f86fba8adb
commit 3f7822bf9f

View File

@@ -777,16 +777,19 @@ error:
* efi_bootmgr_enumerate_boot_options() - enumerate the possible bootable media * efi_bootmgr_enumerate_boot_options() - enumerate the possible bootable media
* *
* @opt: pointer to the media boot option structure * @opt: pointer to the media boot option structure
* @index: index of the opt array to store the boot option
* @handles: pointer to block device handles * @handles: pointer to block device handles
* @count: On entry number of handles to block devices. * @count: On entry number of handles to block devices.
* On exit number of boot options. * On exit number of boot options.
* @removable: flag to parse removable only
* Return: status code * Return: status code
*/ */
static efi_status_t static efi_status_t
efi_bootmgr_enumerate_boot_options(struct eficonfig_media_boot_option *opt, efi_bootmgr_enumerate_boot_options(struct eficonfig_media_boot_option *opt,
efi_handle_t *handles, efi_uintn_t *count) efi_uintn_t index, efi_handle_t *handles,
efi_uintn_t *count, bool removable)
{ {
u32 i, num = 0; u32 i, num = index;
struct efi_handler *handler; struct efi_handler *handler;
efi_status_t ret = EFI_SUCCESS; efi_status_t ret = EFI_SUCCESS;
@@ -806,6 +809,9 @@ efi_bootmgr_enumerate_boot_options(struct eficonfig_media_boot_option *opt,
if (blkio->media->logical_partition) if (blkio->media->logical_partition)
continue; continue;
if (removable != (blkio->media->removable_media != 0))
continue;
ret = efi_search_protocol(handles[i], &efi_guid_device_path, &handler); ret = efi_search_protocol(handles[i], &efi_guid_device_path, &handler);
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
continue; continue;
@@ -847,6 +853,9 @@ efi_bootmgr_enumerate_boot_options(struct eficonfig_media_boot_option *opt,
optional_data = (char *)opt[num].lo + (opt[num].size - u16_strsize(u"1234567")); optional_data = (char *)opt[num].lo + (opt[num].size - u16_strsize(u"1234567"));
memcpy(optional_data, &efi_guid_bootmenu_auto_generated, sizeof(efi_guid_t)); memcpy(optional_data, &efi_guid_bootmenu_auto_generated, sizeof(efi_guid_t));
num++; num++;
if (num >= *count)
break;
} }
out: out:
@@ -1095,7 +1104,7 @@ efi_status_t efi_bootmgr_update_media_device_boot_option(void)
{ {
u32 i; u32 i;
efi_status_t ret; efi_status_t ret;
efi_uintn_t count; efi_uintn_t count, num, total;
efi_handle_t *handles = NULL; efi_handle_t *handles = NULL;
struct eficonfig_media_boot_option *opt = NULL; struct eficonfig_media_boot_option *opt = NULL;
@@ -1112,22 +1121,32 @@ efi_status_t efi_bootmgr_update_media_device_boot_option(void)
goto out; goto out;
} }
ret = efi_bootmgr_enumerate_boot_options(opt, handles, &count); /* parse removable block io followed by fixed block io */
num = count;
ret = efi_bootmgr_enumerate_boot_options(opt, 0, handles, &num, true);
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
goto out; goto out;
total = num;
num = count;
ret = efi_bootmgr_enumerate_boot_options(opt, total, handles, &num, false);
if (ret != EFI_SUCCESS)
goto out;
total = num;
/* /*
* System hardware configuration may vary depending on the user setup. * System hardware configuration may vary depending on the user setup.
* The boot option is automatically added by the bootmenu. * The boot option is automatically added by the bootmenu.
* If the device is not attached to the system, the boot option needs * If the device is not attached to the system, the boot option needs
* to be deleted. * to be deleted.
*/ */
ret = efi_bootmgr_delete_invalid_boot_option(opt, count); ret = efi_bootmgr_delete_invalid_boot_option(opt, total);
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
goto out; goto out;
/* add non-existent boot option */ /* add non-existent boot option */
for (i = 0; i < count; i++) { for (i = 0; i < total; i++) {
u32 boot_index; u32 boot_index;
u16 var_name[9]; u16 var_name[9];
@@ -1156,7 +1175,7 @@ efi_status_t efi_bootmgr_update_media_device_boot_option(void)
out: out:
if (opt) { if (opt) {
for (i = 0; i < count; i++) for (i = 0; i < total; i++)
free(opt[i].lo); free(opt[i].lo);
} }
free(opt); free(opt);