]> Git Repo - J-u-boot.git/blobdiff - cmd/eficonfig.c
rockchip: rk3399-gru: Include pinctrl and regulators in SPL
[J-u-boot.git] / cmd / eficonfig.c
index 5b1f2a7731ab85ed289fe2e0526fdeb79f7edb30..e08b6ba4a5db4889bb2060c2029f8c1cb56be727 100644 (file)
@@ -7,7 +7,6 @@
 
 #include <ansi.h>
 #include <cli.h>
-#include <common.h>
 #include <charset.h>
 #include <efi_loader.h>
 #include <efi_load_initrd.h>
 
 static struct efi_simple_text_input_protocol *cin;
 const char *eficonfig_menu_desc =
-       "  Press UP/DOWN to move, ENTER to select, ESC/CTRL+C to quit";
+       "  Press UP/DOWN to move, ENTER to select, ESC to quit";
 
 static const char *eficonfig_change_boot_order_desc =
        "  Press UP/DOWN to move, +/- to change orde\n"
        "  Press SPACE to activate or deactivate the entry\n"
-       "  Select [Save] to complete, ESC/CTRL+C to quit";
+       "  CTRL+S to save, ESC to quit";
 
 static struct efi_simple_text_output_protocol *cout;
 static int avail_row;
@@ -62,6 +61,7 @@ struct eficonfig_filepath_info {
 struct eficonfig_boot_option {
        struct eficonfig_select_file_info file_info;
        struct eficonfig_select_file_info initrd_info;
+       struct eficonfig_select_file_info fdt_info;
        unsigned int boot_index;
        u16 *description;
        u16 *optional_data;
@@ -443,7 +443,7 @@ efi_status_t eficonfig_process_common(struct efimenu *efi_menu,
                efi_menu->menu_desc = menu_desc;
 
        menu = menu_create(NULL, 0, 1, display_statusline, item_data_print,
-                          item_choice, efi_menu);
+                          item_choice, NULL, efi_menu);
        if (!menu)
                return EFI_INVALID_PARAMETER;
 
@@ -528,7 +528,10 @@ struct efi_device_path *eficonfig_create_device_path(struct efi_device_path *dp_
        p += fp_size;
        *((struct efi_device_path *)p) = END;
 
-       dp = efi_dp_append(dp_volume, (struct efi_device_path *)buf);
+       dp = efi_dp_shorten(dp_volume);
+       if (!dp)
+               dp = dp_volume;
+       dp = efi_dp_concat(dp, &fp->dp, 0);
        free(buf);
 
        return dp;
@@ -927,7 +930,7 @@ static efi_status_t handle_user_input(u16 *buf, int buf_size,
               ANSI_CURSOR_POSITION
               "%s"
               ANSI_CURSOR_POSITION
-              "  Press ENTER to complete, ESC/CTRL+C to quit",
+              "  Press ENTER to complete, ESC to quit",
               0, 1, msg, 8, 1);
 
        /* tmp is used to accept user cancel */
@@ -960,7 +963,7 @@ static efi_status_t eficonfig_boot_add_enter_description(void *data)
        return handle_user_input(bo->description, EFICONFIG_DESCRIPTION_MAX, 22,
                                 "\n  ** Edit Description **\n"
                                 "\n"
-                                "  enter description: ");
+                                "  Enter description: ");
 }
 
 /**
@@ -1134,43 +1137,6 @@ out:
        return ret;
 }
 
-/**
- * eficonfig_get_unused_bootoption() - get unused "Boot####" index
- *
- * @buf:       pointer to the buffer to store boot option variable name
- * @buf_size:  buffer size
- * @index:     pointer to store the index in the BootOrder variable
- * Return:     status code
- */
-efi_status_t eficonfig_get_unused_bootoption(u16 *buf, efi_uintn_t buf_size,
-                                            unsigned int *index)
-{
-       u32 i;
-       efi_status_t ret;
-       efi_uintn_t size;
-
-       if (buf_size < u16_strsize(u"Boot####"))
-               return EFI_BUFFER_TOO_SMALL;
-
-       for (i = 0; i <= 0xFFFF; i++) {
-               size = 0;
-               efi_create_indexed_name(buf, buf_size, "Boot", i);
-               ret = efi_get_variable_int(buf, &efi_global_variable_guid,
-                                          NULL, &size, NULL, NULL);
-               if (ret == EFI_BUFFER_TOO_SMALL)
-                       continue;
-               else
-                       break;
-       }
-
-       if (i > 0xFFFF)
-               return EFI_OUT_OF_RESOURCES;
-
-       *index = i;
-
-       return EFI_SUCCESS;
-}
-
 /**
  * eficonfig_set_boot_option() - set boot option
  *
@@ -1208,46 +1174,6 @@ static efi_status_t eficonfig_set_boot_option(u16 *varname, struct efi_device_pa
        return ret;
 }
 
-/**
- * eficonfig_append_bootorder() - append new boot option in BootOrder variable
- *
- * @index:     "Boot####" index to append to BootOrder variable
- * Return:     status code
- */
-efi_status_t eficonfig_append_bootorder(u16 index)
-{
-       u16 *bootorder;
-       efi_status_t ret;
-       u16 *new_bootorder = NULL;
-       efi_uintn_t last, size, new_size;
-
-       /* append new boot option */
-       bootorder = efi_get_var(u"BootOrder", &efi_global_variable_guid, &size);
-       last = size / sizeof(u16);
-       new_size = size + sizeof(u16);
-       new_bootorder = calloc(1, new_size);
-       if (!new_bootorder) {
-               ret = EFI_OUT_OF_RESOURCES;
-               goto out;
-       }
-       memcpy(new_bootorder, bootorder, size);
-       new_bootorder[last] = index;
-
-       ret = efi_set_variable_int(u"BootOrder", &efi_global_variable_guid,
-                                  EFI_VARIABLE_NON_VOLATILE |
-                                  EFI_VARIABLE_BOOTSERVICE_ACCESS |
-                                  EFI_VARIABLE_RUNTIME_ACCESS,
-                                  new_size, new_bootorder, false);
-       if (ret != EFI_SUCCESS)
-               goto out;
-
-out:
-       free(bootorder);
-       free(new_bootorder);
-
-       return ret;
-}
-
 /**
  * create_boot_option_entry() - create boot option entry
  *
@@ -1382,6 +1308,10 @@ static efi_status_t eficonfig_show_boot_option(struct eficonfig_boot_option *bo,
        if (ret != EFI_SUCCESS)
                goto out;
 
+       ret = prepare_file_selection_entry(efi_menu, "Fdt File: ", &bo->fdt_info);
+       if (ret != EFI_SUCCESS)
+               goto out;
+
        ret = create_boot_option_entry(efi_menu, "Optional Data: ", bo->optional_data,
                                       eficonfig_boot_add_optional_data, bo);
        if (ret != EFI_SUCCESS)
@@ -1462,27 +1392,44 @@ static efi_status_t eficonfig_edit_boot_option(u16 *varname, struct eficonfig_bo
        efi_status_t ret;
        char *tmp = NULL, *p;
        struct efi_load_option lo = {0};
-       efi_uintn_t final_dp_size;
+       efi_uintn_t dp_size;
        struct efi_device_path *dp = NULL;
        efi_uintn_t size = load_option_size;
-       struct efi_device_path *final_dp = NULL;
        struct efi_device_path *device_dp = NULL;
        struct efi_device_path *initrd_dp = NULL;
+       struct efi_device_path *fdt_dp = NULL;
        struct efi_device_path *initrd_device_dp = NULL;
+       struct efi_device_path *fdt_device_dp = NULL;
 
-       const struct efi_initrd_dp id_dp = {
+       const struct efi_lo_dp_prefix initrd_prefix = {
                .vendor = {
                        {
                        DEVICE_PATH_TYPE_MEDIA_DEVICE,
                        DEVICE_PATH_SUB_TYPE_VENDOR_PATH,
-                       sizeof(id_dp.vendor),
+                       sizeof(initrd_prefix.vendor),
                        },
                        EFI_INITRD_MEDIA_GUID,
                },
                .end = {
                        DEVICE_PATH_TYPE_END,
                        DEVICE_PATH_SUB_TYPE_END,
-                       sizeof(id_dp.end),
+                       sizeof(initrd_prefix.end),
+               }
+       };
+
+       const struct efi_lo_dp_prefix fdt_prefix = {
+               .vendor = {
+                       {
+                       DEVICE_PATH_TYPE_MEDIA_DEVICE,
+                       DEVICE_PATH_SUB_TYPE_VENDOR_PATH,
+                       sizeof(fdt_prefix.vendor),
+                       },
+                       EFI_FDT_GUID,
+               },
+               .end = {
+                       DEVICE_PATH_TYPE_END,
+                       DEVICE_PATH_SUB_TYPE_END,
+                       sizeof(initrd_prefix.end),
                }
        };
 
@@ -1493,7 +1440,13 @@ static efi_status_t eficonfig_edit_boot_option(u16 *varname, struct eficonfig_bo
        }
 
        bo->initrd_info.current_path = calloc(1, EFICONFIG_FILE_PATH_BUF_SIZE);
-       if (!bo->file_info.current_path) {
+       if (!bo->initrd_info.current_path) {
+               ret =  EFI_OUT_OF_RESOURCES;
+               goto out;
+       }
+
+       bo->fdt_info.current_path = calloc(1, EFICONFIG_FILE_PATH_BUF_SIZE);
+       if (!bo->fdt_info.current_path) {
                ret =  EFI_OUT_OF_RESOURCES;
                goto out;
        }
@@ -1530,13 +1483,20 @@ static efi_status_t eficonfig_edit_boot_option(u16 *varname, struct eficonfig_bo
                if (lo.file_path)
                        fill_file_info(lo.file_path, &bo->file_info, device_dp);
 
-               /* Initrd file path(optional) is placed at second instance. */
+               /* Initrd file path (optional) is placed at second instance. */
                initrd_dp = efi_dp_from_lo(&lo, &efi_lf2_initrd_guid);
                if (initrd_dp) {
                        fill_file_info(initrd_dp, &bo->initrd_info, initrd_device_dp);
                        efi_free_pool(initrd_dp);
                }
 
+               /* Fdt file path (optional) is placed as third instance. */
+               fdt_dp = efi_dp_from_lo(&lo, &efi_guid_fdt);
+               if (fdt_dp) {
+                       fill_file_info(fdt_dp, &bo->fdt_info, fdt_device_dp);
+                       efi_free_pool(fdt_dp);
+               }
+
                if (size > 0)
                        memcpy(bo->optional_data, lo.optional_data, size);
        }
@@ -1558,7 +1518,20 @@ static efi_status_t eficonfig_edit_boot_option(u16 *varname, struct eficonfig_bo
                        ret = EFI_OUT_OF_RESOURCES;
                        goto out;
                }
-               initrd_dp = efi_dp_append((const struct efi_device_path *)&id_dp, dp);
+               initrd_dp = efi_dp_concat((const struct efi_device_path *)&initrd_prefix,
+                                         dp, 0);
+               efi_free_pool(dp);
+       }
+
+       if (bo->fdt_info.dp_volume) {
+               dp = eficonfig_create_device_path(bo->fdt_info.dp_volume,
+                                                 bo->fdt_info.current_path);
+               if (!dp) {
+                       ret = EFI_OUT_OF_RESOURCES;
+                       goto out;
+               }
+               fdt_dp = efi_dp_concat((const struct efi_device_path *)&fdt_prefix,
+                                      dp, 0);
                efi_free_pool(dp);
        }
 
@@ -1567,16 +1540,9 @@ static efi_status_t eficonfig_edit_boot_option(u16 *varname, struct eficonfig_bo
                ret = EFI_OUT_OF_RESOURCES;
                goto out;
        }
-       final_dp_size = efi_dp_size(dp) + sizeof(END);
-       if (initrd_dp) {
-               final_dp = efi_dp_concat(dp, initrd_dp);
-               final_dp_size += efi_dp_size(initrd_dp) + sizeof(END);
-       } else {
-               final_dp = efi_dp_dup(dp);
-       }
-       efi_free_pool(dp);
 
-       if (!final_dp)
+       ret = efi_load_option_dp_join(&dp, &dp_size, initrd_dp, fdt_dp);
+       if (ret != EFI_SUCCESS)
                goto out;
 
        if (utf16_utf8_strlen(bo->optional_data)) {
@@ -1588,17 +1554,20 @@ static efi_status_t eficonfig_edit_boot_option(u16 *varname, struct eficonfig_bo
                utf16_utf8_strncpy(&p, bo->optional_data, u16_strlen(bo->optional_data));
        }
 
-       ret = eficonfig_set_boot_option(varname, final_dp, final_dp_size, bo->description, tmp);
+       ret = eficonfig_set_boot_option(varname, dp, dp_size, bo->description, tmp);
 out:
        free(tmp);
        free(bo->optional_data);
        free(bo->description);
        free(bo->file_info.current_path);
        free(bo->initrd_info.current_path);
+       free(bo->fdt_info.current_path);
        efi_free_pool(device_dp);
        efi_free_pool(initrd_device_dp);
        efi_free_pool(initrd_dp);
-       efi_free_pool(final_dp);
+       efi_free_pool(fdt_device_dp);
+       efi_free_pool(fdt_dp);
+       efi_free_pool(dp);
 
        return ret;
 }
@@ -1619,7 +1588,7 @@ static efi_status_t eficonfig_process_add_boot_option(void *data)
        if (!bo)
                return EFI_OUT_OF_RESOURCES;
 
-       ret = eficonfig_get_unused_bootoption(varname, sizeof(varname), &bo->boot_index);
+       ret = efi_bootmgr_get_unused_bootoption(varname, sizeof(varname), &bo->boot_index);
        if (ret != EFI_SUCCESS)
                return ret;
 
@@ -1627,7 +1596,7 @@ static efi_status_t eficonfig_process_add_boot_option(void *data)
        if (ret != EFI_SUCCESS)
                goto out;
 
-       ret = eficonfig_append_bootorder((u16)bo->boot_index);
+       ret = efi_bootmgr_append_bootorder((u16)bo->boot_index);
        if (ret != EFI_SUCCESS)
                goto out;
 
@@ -1656,31 +1625,6 @@ static efi_status_t eficonfig_process_boot_selected(void *data)
        return EFI_SUCCESS;
 }
 
-/**
- * search_bootorder() - search the boot option index in BootOrder
- *
- * @bootorder: pointer to the BootOrder variable
- * @num:       number of BootOrder entry
- * @target:    target boot option index to search
- * @index:     pointer to store the index of BootOrder variable
- * Return:     true if exists, false otherwise
- */
-static bool search_bootorder(u16 *bootorder, efi_uintn_t num, u32 target, u32 *index)
-{
-       u32 i;
-
-       for (i = 0; i < num; i++) {
-               if (target == bootorder[i]) {
-                       if (index)
-                               *index = i;
-
-                       return true;
-               }
-       }
-
-       return false;
-}
-
 /**
  * eficonfig_add_boot_selection_entry() - add boot option menu entry
  *
@@ -1805,7 +1749,7 @@ static efi_status_t eficonfig_show_boot_selection(unsigned int *selected)
 
                if (efi_varname_is_load_option(var_name16, &index)) {
                        /* If the index is included in the BootOrder, skip it */
-                       if (search_bootorder(bootorder, num, index, NULL))
+                       if (efi_search_bootorder(bootorder, num, index, NULL))
                                continue;
 
                        ret = eficonfig_add_boot_selection_entry(efi_menu, index, selected);
@@ -1983,6 +1927,10 @@ char *eficonfig_choice_change_boot_order(void *data)
                                eficonfig_menu_down(efi_menu);
 
                        return NULL;
+               case BKEY_SAVE:
+                       /* force to select "Save" entry */
+                       efi_menu->active = efi_menu->count - 2;
+                       fallthrough;
                case BKEY_SELECT:
                        /* "Save" */
                        if (efi_menu->active == efi_menu->count - 2) {
@@ -2198,7 +2146,7 @@ static efi_status_t eficonfig_create_change_boot_order_entry(struct efimenu *efi
 
                if (efi_varname_is_load_option(var_name16, &index)) {
                        /* If the index is included in the BootOrder, skip it */
-                       if (search_bootorder(bootorder, num, index, NULL))
+                       if (efi_search_bootorder(bootorder, num, index, NULL))
                                continue;
 
                        ret = eficonfig_add_change_boot_order_entry(efi_menu, index, false);
@@ -2300,50 +2248,6 @@ out:
        return ret;
 }
 
-/**
- * delete_boot_option() - delete selected boot option
- *
- * @boot_index:        boot option index to delete
- * Return:     status code
- */
-static efi_status_t delete_boot_option(u16 boot_index)
-{
-       u16 *bootorder;
-       u16 varname[9];
-       efi_status_t ret;
-       unsigned int index;
-       efi_uintn_t num, size;
-
-       efi_create_indexed_name(varname, sizeof(varname),
-                               "Boot", boot_index);
-       ret = efi_set_variable_int(varname, &efi_global_variable_guid,
-                                  0, 0, NULL, false);
-       if (ret != EFI_SUCCESS) {
-               log_err("delete boot option(%ls) failed\n", varname);
-               return ret;
-       }
-
-       /* update BootOrder if necessary */
-       bootorder = efi_get_var(u"BootOrder", &efi_global_variable_guid, &size);
-       if (!bootorder)
-               return EFI_SUCCESS;
-
-       num = size / sizeof(u16);
-       if (!search_bootorder(bootorder, num, boot_index, &index))
-               return EFI_SUCCESS;
-
-       memmove(&bootorder[index], &bootorder[index + 1],
-               (num - index - 1) * sizeof(u16));
-       size -= sizeof(u16);
-       ret = efi_set_variable_int(u"BootOrder", &efi_global_variable_guid,
-                                  EFI_VARIABLE_NON_VOLATILE |
-                                  EFI_VARIABLE_BOOTSERVICE_ACCESS |
-                                  EFI_VARIABLE_RUNTIME_ACCESS,
-                                  size, bootorder, false);
-
-       return ret;
-}
-
 /**
  * eficonfig_process_delete_boot_option() - handler to delete boot option
  *
@@ -2358,7 +2262,7 @@ static efi_status_t eficonfig_process_delete_boot_option(void *data)
        while (1) {
                ret = eficonfig_show_boot_selection(&selected);
                if (ret == EFI_SUCCESS)
-                       ret = delete_boot_option(selected);
+                       ret = efi_bootmgr_delete_boot_option(selected);
 
                if (ret != EFI_SUCCESS)
                        break;
@@ -2370,256 +2274,6 @@ static efi_status_t eficonfig_process_delete_boot_option(void *data)
        return ret;
 }
 
-/**
- * eficonfig_enumerate_boot_option() - enumerate the possible bootable media
- *
- * @opt:               pointer to the media boot option structure
- * @volume_handles:    pointer to the efi handles
- * @count:             number of efi handle
- * Return:             status code
- */
-efi_status_t eficonfig_enumerate_boot_option(struct eficonfig_media_boot_option *opt,
-                                            efi_handle_t *volume_handles, efi_status_t count)
-{
-       u32 i;
-       struct efi_handler *handler;
-       efi_status_t ret = EFI_SUCCESS;
-
-       for (i = 0; i < count; i++) {
-               u16 *p;
-               u16 dev_name[BOOTMENU_DEVICE_NAME_MAX];
-               char *optional_data;
-               struct efi_load_option lo;
-               char buf[BOOTMENU_DEVICE_NAME_MAX];
-               struct efi_device_path *device_path;
-
-               ret = efi_search_protocol(volume_handles[i], &efi_guid_device_path, &handler);
-               if (ret != EFI_SUCCESS)
-                       continue;
-               ret = efi_protocol_open(handler, (void **)&device_path,
-                                       efi_root, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
-               if (ret != EFI_SUCCESS)
-                       continue;
-
-               ret = efi_disk_get_device_name(volume_handles[i], buf, BOOTMENU_DEVICE_NAME_MAX);
-               if (ret != EFI_SUCCESS)
-                       continue;
-
-               p = dev_name;
-               utf8_utf16_strncpy(&p, buf, strlen(buf));
-
-               lo.label = dev_name;
-               lo.attributes = LOAD_OPTION_ACTIVE;
-               lo.file_path = device_path;
-               lo.file_path_length = efi_dp_size(device_path) + sizeof(END);
-               /*
-                * Set the dedicated guid to optional_data, it is used to identify
-                * the boot option that automatically generated by the bootmenu.
-                * efi_serialize_load_option() expects optional_data is null-terminated
-                * utf8 string, so set the "1234567" string to allocate enough space
-                * to store guid, instead of realloc the load_option.
-                */
-               lo.optional_data = "1234567";
-               opt[i].size = efi_serialize_load_option(&lo, (u8 **)&opt[i].lo);
-               if (!opt[i].size) {
-                       ret = EFI_OUT_OF_RESOURCES;
-                       goto out;
-               }
-               /* set the guid */
-               optional_data = (char *)opt[i].lo + (opt[i].size - u16_strsize(u"1234567"));
-               memcpy(optional_data, &efi_guid_bootmenu_auto_generated, sizeof(efi_guid_t));
-       }
-
-out:
-       return ret;
-}
-
-/**
- * eficonfig_delete_invalid_boot_option() - delete non-existing boot option
- *
- * @opt:               pointer to the media boot option structure
- * @count:             number of media boot option structure
- * Return:             status code
- */
-efi_status_t eficonfig_delete_invalid_boot_option(struct eficonfig_media_boot_option *opt,
-                                                 efi_status_t count)
-{
-       efi_uintn_t size;
-       void *load_option;
-       u32 i, list_size = 0;
-       struct efi_load_option lo;
-       u16 *var_name16 = NULL;
-       u16 varname[] = u"Boot####";
-       efi_status_t ret = EFI_SUCCESS;
-       u16 *delete_index_list = NULL, *p;
-       efi_uintn_t buf_size;
-
-       buf_size = 128;
-       var_name16 = malloc(buf_size);
-       if (!var_name16)
-               return EFI_OUT_OF_RESOURCES;
-
-       var_name16[0] = 0;
-       for (;;) {
-               int index;
-               efi_guid_t guid;
-               efi_uintn_t tmp;
-
-               ret = efi_next_variable_name(&buf_size, &var_name16, &guid);
-               if (ret == EFI_NOT_FOUND) {
-                       /*
-                        * EFI_NOT_FOUND indicates we retrieved all EFI variables.
-                        * This should be treated as success.
-                        */
-                       ret = EFI_SUCCESS;
-                       break;
-               }
-               if (ret != EFI_SUCCESS)
-                       goto out;
-
-               if (!efi_varname_is_load_option(var_name16, &index))
-                       continue;
-
-               efi_create_indexed_name(varname, sizeof(varname), "Boot", index);
-               load_option = efi_get_var(varname, &efi_global_variable_guid, &size);
-               if (!load_option)
-                       continue;
-
-               tmp = size;
-               ret = efi_deserialize_load_option(&lo, load_option, &size);
-               if (ret != EFI_SUCCESS)
-                       goto next;
-
-               if (size >= sizeof(efi_guid_bootmenu_auto_generated) &&
-                   !guidcmp(lo.optional_data, &efi_guid_bootmenu_auto_generated)) {
-                       for (i = 0; i < count; i++) {
-                               if (opt[i].size == tmp &&
-                                   memcmp(opt[i].lo, load_option, tmp) == 0) {
-                                       opt[i].exist = true;
-                                       break;
-                               }
-                       }
-
-                       /*
-                        * The entire list of variables must be retrieved by
-                        * efi_get_next_variable_name_int() before deleting the invalid
-                        * boot option, just save the index here.
-                        */
-                       if (i == count) {
-                               p = realloc(delete_index_list, sizeof(u32) *
-                                           (list_size + 1));
-                               if (!p) {
-                                       ret = EFI_OUT_OF_RESOURCES;
-                                       goto out;
-                               }
-                               delete_index_list = p;
-                               delete_index_list[list_size++] = index;
-                       }
-               }
-next:
-               free(load_option);
-       }
-
-       /* delete all invalid boot options */
-       for (i = 0; i < list_size; i++) {
-               ret = delete_boot_option(delete_index_list[i]);
-               if (ret != EFI_SUCCESS)
-                       goto out;
-       }
-
-out:
-       free(var_name16);
-       free(delete_index_list);
-
-       return ret;
-}
-
-/**
- * eficonfig_generate_media_device_boot_option() - generate the media device boot option
- *
- * This function enumerates all devices supporting EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
- * and generate the bootmenu entries.
- * This function also provide the BOOT#### variable maintenance for
- * the media device entries.
- *   - Automatically create the BOOT#### variable for the newly detected device,
- *     this BOOT#### variable is distinguished by the special GUID
- *     stored in the EFI_LOAD_OPTION.optional_data
- *   - If the device is not attached to the system, the associated BOOT#### variable
- *     is automatically deleted.
- *
- * Return:     status code
- */
-efi_status_t eficonfig_generate_media_device_boot_option(void)
-{
-       u32 i;
-       efi_status_t ret;
-       efi_uintn_t count;
-       efi_handle_t *volume_handles = NULL;
-       struct eficonfig_media_boot_option *opt = NULL;
-
-       ret = efi_locate_handle_buffer_int(BY_PROTOCOL, &efi_simple_file_system_protocol_guid,
-                                          NULL, &count, (efi_handle_t **)&volume_handles);
-       if (ret != EFI_SUCCESS)
-               return ret;
-
-       opt = calloc(count, sizeof(struct eficonfig_media_boot_option));
-       if (!opt)
-               goto out;
-
-       /* enumerate all devices supporting EFI_SIMPLE_FILE_SYSTEM_PROTOCOL */
-       ret = eficonfig_enumerate_boot_option(opt, volume_handles, count);
-       if (ret != EFI_SUCCESS)
-               goto out;
-
-       /*
-        * System hardware configuration may vary depending on the user setup.
-        * The boot option is automatically added by the bootmenu.
-        * If the device is not attached to the system, the boot option needs
-        * to be deleted.
-        */
-       ret = eficonfig_delete_invalid_boot_option(opt, count);
-       if (ret != EFI_SUCCESS)
-               goto out;
-
-       /* add non-existent boot option */
-       for (i = 0; i < count; i++) {
-               u32 boot_index;
-               u16 var_name[9];
-
-               if (!opt[i].exist) {
-                       ret = eficonfig_get_unused_bootoption(var_name, sizeof(var_name),
-                                                             &boot_index);
-                       if (ret != EFI_SUCCESS)
-                               goto out;
-
-                       ret = efi_set_variable_int(var_name, &efi_global_variable_guid,
-                                                  EFI_VARIABLE_NON_VOLATILE |
-                                                  EFI_VARIABLE_BOOTSERVICE_ACCESS |
-                                                  EFI_VARIABLE_RUNTIME_ACCESS,
-                                                  opt[i].size, opt[i].lo, false);
-                       if (ret != EFI_SUCCESS)
-                               goto out;
-
-                       ret = eficonfig_append_bootorder(boot_index);
-                       if (ret != EFI_SUCCESS) {
-                               efi_set_variable_int(var_name, &efi_global_variable_guid,
-                                                    0, 0, NULL, false);
-                               goto out;
-                       }
-               }
-       }
-
-out:
-       if (opt) {
-               for (i = 0; i < count; i++)
-                       free(opt[i].lo);
-       }
-       free(opt);
-       efi_free_pool(volume_handles);
-
-       return ret;
-}
-
 /**
  * eficonfig_init() - do required initialization for eficonfig command
  *
@@ -2705,8 +2359,8 @@ static int do_eficonfig(struct cmd_tbl *cmdtp, int flag, int argc, char *const a
        if (ret != EFI_SUCCESS)
                return CMD_RET_FAILURE;
 
-       ret = eficonfig_generate_media_device_boot_option();
-       if (ret != EFI_SUCCESS && ret != EFI_NOT_FOUND)
+       ret = efi_bootmgr_update_media_device_boot_option();
+       if (ret != EFI_SUCCESS)
                return ret;
 
        while (1) {
This page took 0.04645 seconds and 4 git commands to generate.