bootmeth: Update the read_file() method to include a type
authorSimon Glass <sjg@chromium.org>
Fri, 15 Nov 2024 23:19:17 +0000 (16:19 -0700)
committerTom Rini <trini@konsulko.com>
Wed, 15 Jan 2025 14:48:42 +0000 (08:48 -0600)
We want to record the type of each file which is loaded. Add an new
parameter for this, to the read_file() method. Update all users.

Make bootmeth_common_read_file() store information about the image that
is read.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
boot/bootmeth-uclass.c
boot/bootmeth_android.c
boot/bootmeth_cros.c
boot/bootmeth_efi.c
boot/bootmeth_efi_mgr.c
boot/bootmeth_extlinux.c
boot/bootmeth_pxe.c
boot/bootmeth_qfw.c
boot/bootmeth_sandbox.c
boot/vbe_simple.c
include/bootmeth.h

index c219631..1f48d0c 100644 (file)
@@ -84,14 +84,15 @@ int bootmeth_boot(struct udevice *dev, struct bootflow *bflow)
 }
 
 int bootmeth_read_file(struct udevice *dev, struct bootflow *bflow,
-                      const char *file_path, ulong addr, ulong *sizep)
+                      const char *file_path, ulong addr,
+                      enum bootflow_img_t type, ulong *sizep)
 {
        const struct bootmeth_ops *ops = bootmeth_get_ops(dev);
 
        if (!ops->read_file)
                return -ENOSYS;
 
-       return ops->read_file(dev, bflow, file_path, addr, sizep);
+       return ops->read_file(dev, bflow, file_path, addr, type, sizep);
 }
 
 int bootmeth_get_bootflow(struct udevice *dev, struct bootflow *bflow)
@@ -394,7 +395,8 @@ int bootmeth_alloc_other(struct bootflow *bflow, const char *fname,
 }
 
 int bootmeth_common_read_file(struct udevice *dev, struct bootflow *bflow,
-                             const char *file_path, ulong addr, ulong *sizep)
+                             const char *file_path, ulong addr,
+                             enum bootflow_img_t type, ulong *sizep)
 {
        struct blk_desc *desc = NULL;
        loff_t len_read;
@@ -423,6 +425,9 @@ int bootmeth_common_read_file(struct udevice *dev, struct bootflow *bflow,
                return ret;
        *sizep = len_read;
 
+       if (!bootflow_img_add(bflow, bflow->fname, type, addr, size))
+               return log_msg_ret("bci", -ENOMEM);
+
        return 0;
 }
 
index 19b1f2c..bd6c05a 100644 (file)
@@ -298,7 +298,8 @@ static int android_read_bootflow(struct udevice *dev, struct bootflow *bflow)
 }
 
 static int android_read_file(struct udevice *dev, struct bootflow *bflow,
-                            const char *file_path, ulong addr, ulong *sizep)
+                            const char *file_path, ulong addr,
+                            enum bootflow_img_t type, ulong *sizep)
 {
        /*
         * Reading individual files is not supported since we only
index 676f550..1825293 100644 (file)
@@ -400,7 +400,8 @@ static int cros_read_bootflow(struct udevice *dev, struct bootflow *bflow)
 }
 
 static int cros_read_file(struct udevice *dev, struct bootflow *bflow,
-                        const char *file_path, ulong addr, ulong *sizep)
+                        const char *file_path, ulong addr,
+                         enum bootflow_img_t type, ulong *sizep)
 {
        return -ENOSYS;
 }
index 47a22d5..f711b9d 100644 (file)
@@ -97,7 +97,7 @@ static int efiload_read_file(struct bootflow *bflow, ulong addr)
 
        size = SZ_1G;
        ret = bootmeth_common_read_file(bflow->method, bflow, bflow->fname,
-                                       addr, &size);
+                                       addr, BFI_EFI, &size);
        if (ret)
                return log_msg_ret("rdf", ret);
        bflow->buf = map_sysmem(addr, bflow->size);
@@ -172,7 +172,8 @@ static int distro_efi_try_bootflow_files(struct udevice *dev,
                        /* Limit FDT files to 4MB */
                        size = SZ_4M;
                        ret = bootmeth_common_read_file(dev, bflow, fname,
-                                                       fdt_addr, &size);
+                               fdt_addr, (enum bootflow_img_t)IH_TYPE_FLATDT,
+                               &size);
                }
        }
 
index 23ae1e6..42b8863 100644 (file)
@@ -74,7 +74,8 @@ static int efi_mgr_read_bootflow(struct udevice *dev, struct bootflow *bflow)
 }
 
 static int efi_mgr_read_file(struct udevice *dev, struct bootflow *bflow,
-                               const char *file_path, ulong addr, ulong *sizep)
+                            const char *file_path, ulong addr,
+                            enum bootflow_img_t type, ulong *sizep)
 {
        /* Files are loaded by the 'bootefi bootmgr' command */
 
index 6c158c2..ae5ae4d 100644 (file)
@@ -79,7 +79,7 @@ static int extlinux_getfile(struct pxe_context *ctx, const char *file_path,
        /* Allow up to 1GB */
        *sizep = 1 << 30;
        ret = bootmeth_read_file(info->dev, info->bflow, file_path, addr,
-                                sizep);
+                                (enum bootflow_img_t)IH_TYPE_INVALID, sizep);
        if (ret)
                return log_msg_ret("read", ret);
 
index 05c6bec..e64429f 100644 (file)
@@ -23,7 +23,7 @@
 #include <pxe_utils.h>
 
 static int extlinux_pxe_getfile(struct pxe_context *ctx, const char *file_path,
-                               char *file_addr, ulong *sizep)
+                                       char *file_addr, ulong *sizep)
 {
        struct extlinux_info *info = ctx->userdata;
        ulong addr;
@@ -34,7 +34,7 @@ static int extlinux_pxe_getfile(struct pxe_context *ctx, const char *file_path,
        /* Allow up to 1GB */
        *sizep = 1 << 30;
        ret = bootmeth_read_file(info->dev, info->bflow, file_path, addr,
-                                sizep);
+                                IH_TYPE_INVALID, sizep);
        if (ret)
                return log_msg_ret("read", ret);
 
@@ -113,7 +113,7 @@ static int extlinux_pxe_read_bootflow(struct udevice *dev,
 
 static int extlinux_pxe_read_file(struct udevice *dev, struct bootflow *bflow,
                                  const char *file_path, ulong addr,
-                                 ulong *sizep)
+                                 enum bootflow_img_t type, ulong *sizep)
 {
        char *tftp_argv[] = {"tftp", NULL, NULL, NULL};
        struct pxe_context *ctx = dev_get_priv(dev);
index 2f8e00c..028c248 100644 (file)
@@ -52,7 +52,8 @@ static int qfw_read_bootflow(struct udevice *dev, struct bootflow *bflow)
 }
 
 static int qfw_read_file(struct udevice *dev, struct bootflow *bflow,
-                        const char *file_path, ulong addr, ulong *sizep)
+                        const char *file_path, ulong addr,
+                        enum bootflow_img_t type, ulong *sizep)
 {
        return -ENOSYS;
 }
index 26c713b..92ba2e3 100644 (file)
@@ -27,7 +27,8 @@ static int sandbox_read_bootflow(struct udevice *dev, struct bootflow *bflow)
 }
 
 static int sandbox_read_file(struct udevice *dev, struct bootflow *bflow,
-                            const char *file_path, ulong addr, ulong *sizep)
+                            const char *file_path, ulong addr,
+                            enum bootflow_img_t type, ulong *sizep)
 {
        return -ENOSYS;
 }
index 189e86d..ed7b959 100644 (file)
@@ -160,13 +160,14 @@ static int vbe_simple_read_bootflow(struct udevice *dev, struct bootflow *bflow)
 }
 
 static int vbe_simple_read_file(struct udevice *dev, struct bootflow *bflow,
-                               const char *file_path, ulong addr, ulong *sizep)
+                               const char *file_path, ulong addr,
+                               enum bootflow_img_t type, ulong *sizep)
 {
        int ret;
 
        if (vbe_phase() == VBE_PHASE_OS) {
                ret = bootmeth_common_read_file(dev, bflow, file_path, addr,
-                                               sizep);
+                                               type, sizep);
                if (ret)
                        return log_msg_ret("os", ret);
        }
index e812974..788d404 100644 (file)
@@ -8,7 +8,6 @@
 #define __bootmeth_h
 
 #include <bootflow.h>
-#include <image.h>
 #include <linux/bitops.h>
 
 struct blk_desc;
@@ -117,13 +116,15 @@ struct bootmeth_ops {
         * @bflow:      Bootflow providing info on where to read from
         * @file_path:  Path to file (may be absolute or relative)
         * @addr:       Address to load file
+        * @type:       File type (IH_TYPE_...)
         * @sizep:      On entry provides the maximum permitted size; on exit
         *              returns the size of the file
         * Return: 0 if OK, -ENOSPC if the file is too large for @sizep, other
         *      -ve value if something else goes wrong
         */
        int (*read_file)(struct udevice *dev, struct bootflow *bflow,
-                        const char *file_path, ulong addr, ulong *sizep);
+                        const char *file_path, ulong addr,
+                        enum bootflow_img_t type, ulong *sizep);
 #if CONFIG_IS_ENABLED(BOOTSTD_FULL)
        /**
         * readall() - read all files for a bootflow
@@ -245,13 +246,15 @@ int bootmeth_set_bootflow(struct udevice *dev, struct bootflow *bflow,
  * @bflow:     Bootflow providing info on where to read from
  * @file_path: Path to file (may be absolute or relative)
  * @addr:      Address to load file
+ * @type:      File type (IH_TYPE_...)
  * @sizep:     On entry provides the maximum permitted size; on exit
  *             returns the size of the file
  * Return: 0 if OK, -ENOSPC if the file is too large for @sizep, other
  *     -ve value if something else goes wrong
  */
 int bootmeth_read_file(struct udevice *dev, struct bootflow *bflow,
-                      const char *file_path, ulong addr, ulong *sizep);
+                      const char *file_path, ulong addr,
+                      enum bootflow_img_t type, ulong *sizep);
 
 /**
  * bootmeth_read_all() - read all bootflow files
@@ -397,11 +400,13 @@ int bootmeth_alloc_other(struct bootflow *bflow, const char *fname,
  * @bflow: Bootflow information
  * @file_path: Path to file
  * @addr: Address to load file to
+ * @type: File type (IH_TYPE_...)
  * @sizep: On entry, the maximum file size to accept, on exit the actual file
  *     size read
  */
 int bootmeth_common_read_file(struct udevice *dev, struct bootflow *bflow,
-                             const char *file_path, ulong addr, ulong *sizep);
+                             const char *file_path, ulong addr,
+                             enum bootflow_img_t type, ulong *sizep);
 
 /**
  * bootmeth_get_bootflow() - Get a bootflow from a global bootmeth