]> Git Repo - J-u-boot.git/blob - boot/bootmeth_efi_mgr.c
Merge patch series "provide names for emmc hardware partitions"
[J-u-boot.git] / boot / bootmeth_efi_mgr.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Bootmethod for EFI boot manager
4  *
5  * Copyright 2021 Google LLC
6  * Written by Simon Glass <[email protected]>
7  */
8
9 #define LOG_CATEGORY UCLASS_BOOTSTD
10
11 #include <bootdev.h>
12 #include <bootflow.h>
13 #include <bootmeth.h>
14 #include <command.h>
15 #include <dm.h>
16 #include <efi_loader.h>
17 #include <efi_variable.h>
18 #include <malloc.h>
19
20 /**
21  * struct efi_mgr_priv - private info for the efi-mgr driver
22  *
23  * @fake_bootflow: Fake a valid bootflow for testing
24  */
25 struct efi_mgr_priv {
26         bool fake_dev;
27 };
28
29 void sandbox_set_fake_efi_mgr_dev(struct udevice *dev, bool fake_dev)
30 {
31         struct efi_mgr_priv *priv = dev_get_priv(dev);
32
33         priv->fake_dev = fake_dev;
34 }
35
36 static int efi_mgr_check(struct udevice *dev, struct bootflow_iter *iter)
37 {
38         int ret;
39
40         /* Must be an bootstd device */
41         ret = bootflow_iter_check_system(iter);
42         if (ret)
43                 return log_msg_ret("net", ret);
44
45         return 0;
46 }
47
48 static int efi_mgr_read_bootflow(struct udevice *dev, struct bootflow *bflow)
49 {
50         struct efi_mgr_priv *priv = dev_get_priv(dev);
51         efi_status_t ret;
52         efi_uintn_t size;
53         u16 *bootorder;
54
55         if (priv->fake_dev) {
56                 bflow->state = BOOTFLOWST_READY;
57                 return 0;
58         }
59
60         ret = efi_init_obj_list();
61         if (ret)
62                 return log_msg_ret("init", ret);
63
64         /* Enable this method if the "BootOrder" UEFI exists. */
65         bootorder = efi_get_var(u"BootOrder", &efi_global_variable_guid,
66                                 &size);
67         if (bootorder) {
68                 free(bootorder);
69                 bflow->state = BOOTFLOWST_READY;
70                 return 0;
71         }
72
73         return -EINVAL;
74 }
75
76 static int efi_mgr_read_file(struct udevice *dev, struct bootflow *bflow,
77                                 const char *file_path, ulong addr, ulong *sizep)
78 {
79         /* Files are loaded by the 'bootefi bootmgr' command */
80
81         return -ENOSYS;
82 }
83
84 static int efi_mgr_boot(struct udevice *dev, struct bootflow *bflow)
85 {
86         int ret;
87
88         /* Booting is handled by the 'bootefi bootmgr' command */
89         ret = efi_bootmgr_run(EFI_FDT_USE_INTERNAL);
90
91         return 0;
92 }
93
94 static int bootmeth_efi_mgr_bind(struct udevice *dev)
95 {
96         struct bootmeth_uc_plat *plat = dev_get_uclass_plat(dev);
97
98         plat->desc = "EFI bootmgr flow";
99         plat->flags = BOOTMETHF_GLOBAL;
100
101         return 0;
102 }
103
104 static struct bootmeth_ops efi_mgr_bootmeth_ops = {
105         .check          = efi_mgr_check,
106         .read_bootflow  = efi_mgr_read_bootflow,
107         .read_file      = efi_mgr_read_file,
108         .boot           = efi_mgr_boot,
109 };
110
111 static const struct udevice_id efi_mgr_bootmeth_ids[] = {
112         { .compatible = "u-boot,efi-bootmgr" },
113         { }
114 };
115
116 U_BOOT_DRIVER(bootmeth_3efi_mgr) = {
117         .name           = "bootmeth_efi_mgr",
118         .id             = UCLASS_BOOTMETH,
119         .of_match       = efi_mgr_bootmeth_ids,
120         .ops            = &efi_mgr_bootmeth_ops,
121         .bind           = bootmeth_efi_mgr_bind,
122         .priv_auto      = sizeof(struct efi_mgr_priv),
123 };
This page took 0.0322480000000001 seconds and 4 git commands to generate.