summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2025-01-15 17:34:26 -0600
committerTom Rini <trini@konsulko.com>2025-01-15 19:27:14 -0600
commit178f6ecb21fe12ada74a9a1a08093c812b15eea5 (patch)
tree60dee6152b33cbd13f311875ce2fc8e9350a8c3d /cmd
parente26a9ac4c6900cac2fa043ac50a3a3c038f4505d (diff)
parenta3d0fadca6b14f57477a4143334993daf52f89dc (diff)
Merge patch series "bootstd: Support recording images"
Simon Glass <sjg@chromium.org> says: This series provides a way to keep track of the images used in bootstd, including the type of each image. At present this is sort-of handled by struct bootflow but in quite an ad-hoc way. The structure has become quite large and is hard to query. Future work will be able to reduce its size. Ultimately the 'bootflow info' command may change to also show images as a list, but that is left for later, as this series is already fairly long. So for now, just introduce the concept and adjust bootstd to use it, with a simple command to list the images. This series includes various alist enhancements, to make use of this new data structure a little easier. [trini: Drop patch 18 and 19 for now due to size considerations] Link: https://lore.kernel.org/r/20241115231926.211999-1-sjg@chromium.org
Diffstat (limited to 'cmd')
-rw-r--r--cmd/Kconfig9
-rw-r--r--cmd/Makefile1
-rw-r--r--cmd/bootdev.c2
-rw-r--r--cmd/bootflow.c6
-rw-r--r--cmd/bootstd.c65
-rw-r--r--cmd/pxe.c2
-rw-r--r--cmd/sysboot.c6
7 files changed, 84 insertions, 7 deletions
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 4c4ad9d9979..1a0985ca479 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -328,6 +328,15 @@ config CMD_BOOTMETH
This command is not necessary for bootstd to work.
+config CMD_BOOTSTD
+ bool "bootstd"
+ depends on BOOTSTD
+ default y if BOOTSTD_FULL
+ help
+ Provide general information and control for bootstd.
+
+ This command is not necessary for bootstd to work.
+
config BOOTM_EFI
bool "Support booting UEFI FIT images"
depends on EFI_BINARY_EXEC && CMD_BOOTM && FIT
diff --git a/cmd/Makefile b/cmd/Makefile
index bf322201c64..0691136054d 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -23,6 +23,7 @@ obj-$(CONFIG_BLK) += blk_common.o
obj-$(CONFIG_CMD_BOOTDEV) += bootdev.o
obj-$(CONFIG_CMD_BOOTFLOW) += bootflow.o
obj-$(CONFIG_CMD_BOOTMETH) += bootmeth.o
+obj-$(CONFIG_CMD_BOOTSTD) += bootstd.o
obj-$(CONFIG_CMD_SOURCE) += source.o
obj-$(CONFIG_CMD_BCB) += bcb.o
obj-$(CONFIG_CMD_BDI) += bdinfo.o
diff --git a/cmd/bootdev.c b/cmd/bootdev.c
index fa7285ba25e..4bc229e809a 100644
--- a/cmd/bootdev.c
+++ b/cmd/bootdev.c
@@ -81,7 +81,7 @@ static int do_bootdev_info(struct cmd_tbl *cmdtp, int flag, int argc,
dev = priv->cur_bootdev;
- /* Count the number of bootflows, including how many are valid*/
+ /* Count the number of bootflows, including how many are valid */
num_valid = 0;
for (ret = bootdev_first_bootflow(dev, &bflow), i = 0;
!ret;
diff --git a/cmd/bootflow.c b/cmd/bootflow.c
index f67948d7368..f88995a478f 100644
--- a/cmd/bootflow.c
+++ b/cmd/bootflow.c
@@ -197,7 +197,7 @@ static int do_bootflow_scan(struct cmd_tbl *cmdtp, int flag, int argc,
show_header();
}
if (dev)
- bootdev_clear_bootflows(dev);
+ bootstd_clear_bootflows_for_bootdev(dev);
else
bootstd_clear_glob();
for (i = 0,
@@ -207,8 +207,8 @@ static int do_bootflow_scan(struct cmd_tbl *cmdtp, int flag, int argc,
bflow.err = ret;
if (!ret)
num_valid++;
- ret = bootdev_add_bootflow(&bflow);
- if (ret) {
+ ret = bootstd_add_bootflow(&bflow);
+ if (ret < 0) {
printf("Out of memory\n");
return CMD_RET_FAILURE;
}
diff --git a/cmd/bootstd.c b/cmd/bootstd.c
new file mode 100644
index 00000000000..e1d82744eb5
--- /dev/null
+++ b/cmd/bootstd.c
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * 'bootstd' command
+ *
+ * Copyright 2024 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+
+#include <bootdev.h>
+#include <bootflow.h>
+#include <bootmeth.h>
+#include <bootstd.h>
+#include <command.h>
+#include <dm.h>
+#include <malloc.h>
+#include <dm/uclass-internal.h>
+
+static int do_bootstd_images(struct cmd_tbl *cmdtp, int flag, int argc,
+ char *const argv[])
+{
+ const struct bootflow *bflow;
+ struct bootstd_priv *std;
+ int ret, i;
+
+ ret = bootstd_get_priv(&std);
+ if (ret) {
+ printf("Cannot get bootstd (err=%d)\n", ret);
+ return CMD_RET_FAILURE;
+ }
+
+ printf("Seq Bootflow Type At Size Filename\n");
+ printf("--- ------------------- -------------- -------- -------- ----------------\n");
+
+ /*
+ * Use the ordering if we have one, so long as we are not trying to list
+ * all bootmethds
+ */
+ i = 0;
+ alist_for_each(bflow, &std->bootflows) {
+ const struct bootflow_img *img;
+
+ alist_for_each(img, &bflow->images) {
+ printf("%3d %-20.20s %-15.15s ",
+ bootflow_get_seq(bflow), bflow->name,
+ bootflow_img_type_name(img->type));
+ if (img->addr)
+ printf("%8lx", img->addr);
+ else
+ printf("%8s", "-");
+ printf(" %8lx %s\n", img->size, img->fname);
+ i++;
+ }
+ }
+
+ printf("--- ------------------- -------------- -------- -------- ----------------\n");
+ printf("(%d image%s)\n", i, i != 1 ? "s" : "");
+
+ return 0;
+}
+
+U_BOOT_LONGHELP(bootstd,
+ "images - list loaded images");
+
+U_BOOT_CMD_WITH_SUBCMDS(bootstd, "Standard-boot operation", bootstd_help_text,
+ U_BOOT_SUBCMD_MKENT(images, 1, 1, do_bootstd_images));
diff --git a/cmd/pxe.c b/cmd/pxe.c
index 982e2b1e7ea..37b8dea6ad6 100644
--- a/cmd/pxe.c
+++ b/cmd/pxe.c
@@ -27,7 +27,7 @@ const char *pxe_default_paths[] = {
};
static int do_get_tftp(struct pxe_context *ctx, const char *file_path,
- char *file_addr, ulong *sizep)
+ char *file_addr, enum bootflow_img_t type, ulong *sizep)
{
char *tftp_argv[] = {"tftp", NULL, NULL, NULL};
int ret;
diff --git a/cmd/sysboot.c b/cmd/sysboot.c
index 8a060780cab..93d4a400830 100644
--- a/cmd/sysboot.c
+++ b/cmd/sysboot.c
@@ -23,7 +23,8 @@ struct sysboot_info {
};
static int sysboot_read_file(struct pxe_context *ctx, const char *file_path,
- char *file_addr, ulong *sizep)
+ char *file_addr, enum bootflow_img_t type,
+ ulong *sizep)
{
struct sysboot_info *info = ctx->userdata;
loff_t len_read;
@@ -110,7 +111,8 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc,
return CMD_RET_FAILURE;
}
- if (get_pxe_file(&ctx, filename, pxefile_addr_r) < 0) {
+ if (get_pxe_file(&ctx, filename, pxefile_addr_r)
+ < 0) {
printf("Error reading config file\n");
pxe_destroy_ctx(&ctx);
return 1;