aboutsummaryrefslogtreecommitdiff
path: root/boot
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2023-08-10 19:33:18 -0600
committerSimon Glass <sjg@chromium.org>2023-08-11 07:33:38 -0600
commitc279224ea6686a992b258b01e07fcadb7f0c7ecb (patch)
tree48273b66cf481b328b6a8871e14cafaedaf87123 /boot
parentcbb607d2d9be44a5ded7a652e8e7646925adc1e0 (diff)
downloadu-boot-c279224ea6686a992b258b01e07fcadb7f0c7ecb.zip
u-boot-c279224ea6686a992b258b01e07fcadb7f0c7ecb.tar.gz
u-boot-c279224ea6686a992b258b01e07fcadb7f0c7ecb.tar.bz2
bootstd: Add a command to read all files for a bootflow
Some bootflows (such as EFI and ChromiumOS) delay reading the kernel until it is needed to boot. This saves time when scanning and avoids needing to allocate memory for something that may never be used. To permit reading of these files, add a new 'bootflow read' command. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'boot')
-rw-r--r--boot/bootflow.c16
-rw-r--r--boot/bootmeth-uclass.c12
-rw-r--r--boot/bootmeth_cros.c22
3 files changed, 49 insertions, 1 deletions
diff --git a/boot/bootflow.c b/boot/bootflow.c
index daf862f..6ef62e1 100644
--- a/boot/bootflow.c
+++ b/boot/bootflow.c
@@ -445,6 +445,22 @@ void bootflow_remove(struct bootflow *bflow)
free(bflow);
}
+#if CONFIG_IS_ENABLED(BOOTSTD_FULL)
+int bootflow_read_all(struct bootflow *bflow)
+{
+ int ret;
+
+ if (bflow->state != BOOTFLOWST_READY)
+ return log_msg_ret("rd", -EPROTO);
+
+ ret = bootmeth_read_all(bflow->method, bflow);
+ if (ret)
+ return log_msg_ret("rd2", ret);
+
+ return 0;
+}
+#endif /* BOOTSTD_FULL */
+
int bootflow_boot(struct bootflow *bflow)
{
int ret;
diff --git a/boot/bootmeth-uclass.c b/boot/bootmeth-uclass.c
index 175eb1d..1d157d5 100644
--- a/boot/bootmeth-uclass.c
+++ b/boot/bootmeth-uclass.c
@@ -61,6 +61,18 @@ int bootmeth_set_bootflow(struct udevice *dev, struct bootflow *bflow,
return ops->set_bootflow(dev, bflow, buf, size);
}
+#if CONFIG_IS_ENABLED(BOOTSTD_FULL)
+int bootmeth_read_all(struct udevice *dev, struct bootflow *bflow)
+{
+ const struct bootmeth_ops *ops = bootmeth_get_ops(dev);
+
+ if (!ops->read_all)
+ return -ENOSYS;
+
+ return ops->read_all(dev, bflow);
+}
+#endif /* BOOTSTD_FULL */
+
int bootmeth_boot(struct udevice *dev, struct bootflow *bflow)
{
const struct bootmeth_ops *ops = bootmeth_get_ops(dev);
diff --git a/boot/bootmeth_cros.c b/boot/bootmeth_cros.c
index 06709dd..6c28feb 100644
--- a/boot/bootmeth_cros.c
+++ b/boot/bootmeth_cros.c
@@ -395,13 +395,30 @@ static int cros_read_file(struct udevice *dev, struct bootflow *bflow,
return -ENOSYS;
}
-static int cros_boot(struct udevice *dev, struct bootflow *bflow)
+#if CONFIG_IS_ENABLED(BOOSTD_FULL)
+static int cros_read_all(struct udevice *dev, struct bootflow *bflow)
{
int ret;
+ if (bflow->buf)
+ return log_msg_ret("ld", -EALREADY);
ret = cros_read_kernel(bflow);
if (ret)
return log_msg_ret("rd", ret);
+
+ return 0;
+}
+#endif /* BOOSTD_FULL */
+
+static int cros_boot(struct udevice *dev, struct bootflow *bflow)
+{
+ int ret;
+
+ if (!bflow->buf) {
+ ret = cros_read_kernel(bflow);
+ if (ret)
+ return log_msg_ret("rd", ret);
+ }
#ifdef CONFIG_X86
zboot_start(map_to_sysmem(bflow->buf), bflow->size, 0, 0,
map_to_sysmem(bflow->x86_setup),
@@ -425,6 +442,9 @@ static struct bootmeth_ops cros_bootmeth_ops = {
.read_bootflow = cros_read_bootflow,
.read_file = cros_read_file,
.boot = cros_boot,
+#if CONFIG_IS_ENABLED(BOOSTD_FULL)
+ .read_all = cros_read_all,
+#endif /* BOOSTD_FULL */
};
static const struct udevice_id cros_bootmeth_ids[] = {