]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
bootstd: Maintain a list of images
authorSimon Glass <sjg@chromium.org>
Fri, 15 Nov 2024 23:19:13 +0000 (16:19 -0700)
committerTom Rini <trini@konsulko.com>
Wed, 15 Jan 2025 14:48:42 +0000 (08:48 -0600)
We want to keep track of images which are loaded, or those which could
perhaps be loaded. This will make it easier to manage memory allocation,
as well as permit removal of the EFI set_efi_bootdev() feature.

Add a list of these, attached to the bootflow. For now the list is
empty.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/bootflow.c
include/bootflow.h

index 7ce04fd92cddc98a905a3cbccc984ee6e1c46b94..94f34dcad0f896709891cdb6e8fba29180dbf83e 100644 (file)
@@ -23,6 +23,13 @@ enum {
        BF_NO_MORE_DEVICES      = -ENODEV,
 };
 
+static const char *const bootflow_img[BFI_COUNT - BFI_FIRST] = {
+       "extlinux_cfg",
+       "logo",
+       "efi",
+       "cmdline",
+};
+
 /**
  * bootflow_state - name for each state
  *
@@ -455,10 +462,13 @@ void bootflow_init(struct bootflow *bflow, struct udevice *bootdev,
        bflow->dev = bootdev;
        bflow->method = meth;
        bflow->state = BOOTFLOWST_BASE;
+       alist_init_struct(&bflow->images, struct bootflow_img);
 }
 
 void bootflow_free(struct bootflow *bflow)
 {
+       struct bootflow_img *img;
+
        free(bflow->name);
        free(bflow->subdir);
        free(bflow->fname);
@@ -467,6 +477,10 @@ void bootflow_free(struct bootflow *bflow)
        free(bflow->os_name);
        free(bflow->fdt_fname);
        free(bflow->bootmeth_priv);
+
+       alist_for_each(img, &bflow->images)
+               free(img->fname);
+       alist_empty(&bflow->images);
 }
 
 void bootflow_remove(struct bootflow *bflow)
@@ -950,3 +964,15 @@ int bootflow_cmdline_auto(struct bootflow *bflow, const char *arg)
 
        return 0;
 }
+
+const char *bootflow_img_type_name(enum bootflow_img_t type)
+{
+       const char *name;
+
+       if (type >= BFI_FIRST && type < BFI_COUNT)
+               name = bootflow_img[type - BFI_FIRST];
+       else
+               name = genimg_get_type_short_name(type);
+
+       return name;
+}
index 9b24fb5c3ebd9be4265c0927664f2b05d4685f30..f407bb356b4c696401609139ccee6ec7ef2edbbf 100644 (file)
@@ -7,7 +7,9 @@
 #ifndef __bootflow_h
 #define __bootflow_h
 
+#include <alist.h>
 #include <bootdev.h>
+#include <image.h>
 #include <dm/ofnode_decl.h>
 #include <linux/list.h>
 
@@ -85,6 +87,7 @@ enum bootflow_flags_t {
  * @cmdline: OS command line, or NULL if not known (allocated)
  * @x86_setup: Pointer to x86 setup block inside @buf, NULL if not present
  * @bootmeth_priv: Private data for the bootmeth
+ * @images: List of loaded images (struct bootstd_img)
  */
 struct bootflow {
        struct udevice *dev;
@@ -109,6 +112,44 @@ struct bootflow {
        char *cmdline;
        void *x86_setup;
        void *bootmeth_priv;
+       struct alist images;
+};
+
+/**
+ * bootflow_img_t: Supported image types
+ *
+ * This uses image_type_t for most types, but extends it
+ *
+ * @BFI_EXTLINUX_CFG: extlinux configuration-file
+ * @BFI_LOGO: logo image
+ * @BFI_EFI: EFI PE image
+ * @BFI_CMDLINE: OS command-line string
+ */
+enum bootflow_img_t {
+       BFI_FIRST = IH_TYPE_COUNT,
+       BFI_EXTLINUX_CFG = BFI_FIRST,
+       BFI_LOGO,
+       BFI_EFI,
+       BFI_CMDLINE,
+
+       BFI_COUNT,
+};
+
+/**
+ * struct bootflow_img - Information about an image which has been loaded
+ *
+ * This keeps track of a single, loaded image.
+ *
+ * @fname: Filename used to load the image (allocated)
+ * @type: Image type (IH_TYPE_...)
+ * @addr: Address to which the image was loaded, 0 if not yet loaded
+ * @size: Size of the image
+ */
+struct bootflow_img {
+       char *fname;
+       enum bootflow_img_t type;
+       ulong addr;
+       ulong size;
 };
 
 /**
@@ -565,4 +606,11 @@ int bootflow_cmdline_get_arg(struct bootflow *bflow, const char *arg,
  */
 int bootflow_cmdline_auto(struct bootflow *bflow, const char *arg);
 
+/**
+ * bootflow_img_type_name() - Get the name for an image type
+ *
+ * @type: Type to check (either enum bootflow_img_t or enum image_type_t
+ * Return: Image name, or "unknown" if not known
+ */
+const char *bootflow_img_type_name(enum bootflow_img_t type);
 #endif