From: Christian Marangi <ansuelsmth@gmail.com>
To: Simon Glass <sjg@chromium.org>, Tom Rini <trini@konsulko.com>,
Mattijs Korpershoek <mkorpershoek@kernel.org>,
Marek Vasut <marek.vasut+renesas@mailbox.org>,
Heiko Schocher <hs@nabladev.com>,
Alexey Charkov <alchark@flipper.net>,
Rasmus Villemoes <ravi@prevas.dk>,
"Lucien.Jheng" <lucienzx159@gmail.com>,
"Markus Schneider-Pargmann (TI.com)" <msp@baylibre.com>,
Christian Marangi <ansuelsmth@gmail.com>,
Neil Armstrong <neil.armstrong@linaro.org>,
Daniel Golle <daniel@makrotopia.org>,
Mehmet Fide <mehmet.fide@screeningeagle.com>,
Casey Connolly <casey.connolly@linaro.org>,
Michal Simek <michal.simek@amd.com>,
Aristo Chen <aristo.chen@canonical.com>,
Quentin Schulz <quentin.schulz@cherry.de>,
Johan Jonker <jbx6244@gmail.com>, Anshul Dalal <anshuld@ti.com>,
Marcello Sylvester Bauer <marcello.bauer@9elements.com>,
Mateus Lima Alves <mateuslima.ti@gmail.com>,
Patrice Chotard <patrice.chotard@foss.st.com>,
Neha Malcom Francis <n-francis@ti.com>, Yao Zi <me@ziyao.cc>,
Peng Fan <peng.fan@nxp.com>, Martin Schwan <m.schwan@phytec.de>,
Heinrich Schuchardt <xypron.glpk@gmx.de>,
u-boot@lists.u-boot-project.org
Subject: [PATCH v11 7/8] misc: fw_loader: introduce FIP loader driver
Date: Tue, 27 Oct 2026 13:39:02 +0100 [thread overview]
Message-ID: <20261027123905.839-8-ansuelsmth@gmail.com> (raw)
In-Reply-To: <20261027123905.839-1-ansuelsmth@gmail.com>
Introduce a variant of the FS loader driver to extract images from FIP
image. These image can contain additional binary used to init Network
accelerator or PHY firmware blob.
The way FIP handle image type is with the usage of UUID.
This FIP loader driver implement a simple FIP image parser that check
every entry for a matching UUID.
Similar to FS loader, this driver also support both UBI and Block
devices.
Also an additional property is added to handle special case with eMMC
that doesn't have a GPT partition and require a global offset to
reference the FIP partition.
An example usage of this driver is the following:
Entry in DTS:
fw_loader0: fip-loader {
bootph-all;
compatible = "u-boot,fip-loader";
phandlepart = <&mmc0 0>;
partoffset = <0x100>;
};
ethernet@1fb50000 {
firmware-loader = <&fw_loader0>;
}
FIP loader user:
/* get the FW loader from the ethernet node */
get_fw_loader_from_node(dev_ofnode(dev), &fw_loader);
/* read the blob identified by "58704aef-389f-3e52-b475-e0bf2234a6a2" UUID */
request_firmware_into_buf(fw_loader, "58704aef-389f-3e52-b475-e0bf2234a6a2",
buf, 261400, 0);
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
drivers/misc/Kconfig | 23 ++
drivers/misc/fw_loader/Makefile | 1 +
drivers/misc/fw_loader/fip_loader.c | 558 ++++++++++++++++++++++++++++
drivers/misc/fw_loader/internal.h | 2 +
4 files changed, 584 insertions(+)
create mode 100644 drivers/misc/fw_loader/fip_loader.c
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 1cab469a3434..f1091e96775e 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -624,6 +624,17 @@ config MPC83XX_SERDES
config FW_LOADER_UCLASS
bool
+config FIP_LOADER
+ bool "Enable loader driver from FIP partition"
+ select LIB_UUID
+ select FW_LOADER_UCLASS
+ help
+ This is FIP partition generic loader which can be used to load
+ the file image from the FIP image into target such as memory.
+
+ The consumer driver would then use this loader to program whatever,
+ ie. the FPGA device/PHY firmware.
+
config FS_LOADER
bool "Enable loader driver for file system"
select FW_LOADER_UCLASS
@@ -637,6 +648,18 @@ config FS_LOADER
config SPL_FW_LOADER_UCLASS
bool
+config SPL_FIP_LOADER
+ bool "Enable loader driver from FIP partition in SPL"
+ select LIB_UUID
+ select SPL_FW_LOADER_UCLASS
+ depends on SPL
+ help
+ This is FIP partition generic loader which can be used to load
+ the file image from the FIP image into target such as memory.
+
+ The consumer driver would then use this loader to program whatever,
+ ie. the FPGA device/PHY firmware.
+
config SPL_FS_LOADER
bool "Enable loader driver for file system in SPL"
select SPL_FW_LOADER_UCLASS
diff --git a/drivers/misc/fw_loader/Makefile b/drivers/misc/fw_loader/Makefile
index f5df0db61c22..120722c4ed17 100644
--- a/drivers/misc/fw_loader/Makefile
+++ b/drivers/misc/fw_loader/Makefile
@@ -1,4 +1,5 @@
# SPDX-License-Identifier: GPL-2.0+
obj-$(CONFIG_$(PHASE_)FW_LOADER_UCLASS) += fw_loader-uclass.o
+obj-$(CONFIG_$(PHASE_)FIP_LOADER) += fip_loader.o
obj-$(CONFIG_$(PHASE_)FS_LOADER) += fs_loader.o
diff --git a/drivers/misc/fw_loader/fip_loader.c b/drivers/misc/fw_loader/fip_loader.c
new file mode 100644
index 000000000000..83c74e60d798
--- /dev/null
+++ b/drivers/misc/fw_loader/fip_loader.c
@@ -0,0 +1,558 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2025 Christian Marangi <ansuelsmth@gmail.com>
+ *
+ */
+
+#define LOG_CATEGORY UCLASS_FIRMWARE_LOADER
+
+#include <blk.h>
+#include <dm.h>
+#include <div64.h>
+#include <env.h>
+#include <errno.h>
+#include <fs.h>
+#include <linux/kernel.h>
+#include <log.h>
+#include <malloc.h>
+#include <memalign.h>
+#include <part.h>
+#include <u-boot/uuid.h>
+
+#if CONFIG_IS_ENABLED(CMD_UBIFS)
+#include <ubi_uboot.h>
+#endif
+
+#include "internal.h"
+
+#define TOC_HEADER_NAME 0xaa640001
+
+/*
+ * FIP toc and entry is always in the
+ * native byte order of the system.
+ */
+struct fip_toc_header {
+ u32 name;
+ u32 serial_number;
+ u64 flags;
+} __packed;
+
+struct fip_toc_entry {
+ struct uuid uuid;
+ u64 offset_address;
+ u64 size;
+ u64 flags;
+} __packed;
+
+enum fip_storage_interface {
+ FIP_STORAGE_INTERFACE_BLK,
+ FIP_STORAGE_INTERFACE_UBI,
+};
+
+struct fip_storage_info {
+ enum fip_storage_interface storage_interface;
+
+ /* BLK info */
+ struct disk_partition part_info;
+ struct blk_desc *desc;
+ unsigned int part_offset;
+
+ /* UBI info */
+ char *ubi_volume;
+};
+
+static bool validate_fip_toc_header(struct fip_toc_header *hdr)
+{
+ if (hdr->name != TOC_HEADER_NAME) {
+ log_err("Invalid FIP header\n");
+ return false;
+ }
+
+ return true;
+}
+
+static int firmware_name_to_uuid(struct firmware *firmwarep,
+ struct uuid *uuid)
+{
+ const char *uuid_str = firmwarep->name;
+ int ret;
+
+ ret = uuid_str_to_bin(uuid_str, (unsigned char *)uuid,
+ UUID_STR_FORMAT_STD);
+ if (ret)
+ log_err("Invalid UUID str: %s\n", uuid_str);
+
+ return ret;
+}
+
+static int check_fip_toc_entry(struct fip_toc_entry *ent,
+ struct uuid *uuid,
+ struct fip_toc_entry *dent)
+{
+ struct uuid uuid_null = { };
+
+ /* NULL uuid. We parsed every entry */
+ if (!memcmp(&ent->uuid, &uuid_null, sizeof(uuid_null)))
+ return -ENOENT;
+
+ /* We found the related uuid */
+ if (!memcmp(&ent->uuid, uuid, sizeof(*uuid))) {
+ log_debug("Found matching FIP entry. offset: 0x%llx size: %lld\n",
+ ent->offset_address, ent->size);
+ memcpy(dent, ent, sizeof(*ent));
+ return 0;
+ }
+
+ return -EAGAIN;
+}
+
+static int blk_read_fip_toc_header(struct blk_desc *desc, lbaint_t offset,
+ char *buf, struct fip_toc_header *hdr)
+{
+ lbaint_t blkcnt = BLOCK_CNT(sizeof(*hdr), desc);
+ lbaint_t to_read, read = 0;
+ int i, ret;
+
+ for (i = 0; i < blkcnt && read < sizeof(*hdr); i++) {
+ to_read = min_t(lbaint_t, desc->blksz,
+ (sizeof(*hdr) - read));
+
+ ret = blk_dread(desc, offset + i, 1, buf);
+ if (ret != 1)
+ return -EINVAL;
+
+ memcpy((u8 *)hdr + read, buf, to_read);
+ read += to_read;
+ }
+
+ return read;
+}
+
+static int blk_read_fip_toc_entry(struct blk_desc *desc, lbaint_t offset,
+ int pos, char *buf,
+ struct fip_toc_entry *ent)
+{
+ lbaint_t left, consumed, to_read, read = 0;
+ lbaint_t blkstart, blkcnt;
+ int i, ret;
+
+ consumed = pos % desc->blksz;
+ left = desc->blksz - consumed;
+ to_read = min_t(lbaint_t, left, sizeof(*ent));
+
+ blkstart = BLOCK_CNT(pos, desc);
+ blkcnt = BLOCK_CNT(sizeof(*ent) - to_read, desc);
+
+ /* Read data from previous cached block if present */
+ if (consumed) {
+ memcpy(ent, buf + consumed, to_read);
+ read += to_read;
+ }
+
+ for (i = 0; i < blkcnt && read < sizeof(*ent); i++) {
+ to_read = min(desc->blksz,
+ (lbaint_t)(sizeof(*ent) - read));
+
+ ret = blk_dread(desc, offset + blkstart + i, 1, buf);
+ if (ret != 1)
+ return -EINVAL;
+
+ memcpy((u8 *)ent + read, buf, to_read);
+ read += to_read;
+ }
+
+ return read;
+}
+
+static int blk_parse_fip_firmware(struct firmware *firmwarep,
+ struct blk_desc *desc,
+ struct disk_partition *part_info,
+ unsigned int part_offset,
+ struct fip_toc_entry *dent)
+{
+ lbaint_t offset = part_info->start + part_offset;
+ struct fip_toc_header hdr;
+ struct fip_toc_entry ent;
+ struct uuid uuid;
+ unsigned int pos;
+ char *read_buf;
+ int ret;
+
+ /* Allocate a Scratch Buffer for FIP parsing */
+ read_buf = malloc(desc->blksz);
+ if (!read_buf)
+ return -ENOMEM;
+
+ ret = blk_read_fip_toc_header(desc, offset, read_buf, &hdr);
+ if (ret < 0) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ pos = ret;
+
+ if (!validate_fip_toc_header(&hdr)) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ ret = firmware_name_to_uuid(firmwarep, &uuid);
+ if (ret)
+ goto out;
+
+ /* Loop for every FIP entry searching for uuid */
+ while (true) {
+ ret = blk_read_fip_toc_entry(desc, offset, pos,
+ read_buf, &ent);
+ if (ret < 0)
+ goto out;
+
+ pos += ret;
+
+ ret = check_fip_toc_entry(&ent, &uuid, dent);
+ if (ret != -EAGAIN)
+ break;
+ }
+
+out:
+ free(read_buf);
+ return ret;
+}
+
+#if CONFIG_IS_ENABLED(CMD_UBIFS)
+static int ubi_parse_fip_firmware(struct firmware *firmwarep,
+ char *ubi_vol,
+ struct fip_toc_entry *dent)
+{
+ struct fip_toc_header hdr;
+ struct fip_toc_entry ent;
+ struct uuid uuid;
+ unsigned int pos;
+ int ret;
+
+ ret = ubi_volume_read(ubi_vol, (char *)&hdr, 0, sizeof(hdr));
+ if (ret)
+ return ret;
+
+ pos = sizeof(hdr);
+
+ if (!validate_fip_toc_header(&hdr))
+ return -EINVAL;
+
+ ret = firmware_name_to_uuid(firmwarep, &uuid);
+ if (ret)
+ return ret;
+
+ /* Loop for every FIP entry searching for uuid */
+ while (true) {
+ ret = ubi_volume_read(ubi_vol, (char *)&ent, pos,
+ sizeof(ent));
+ if (ret)
+ return ret;
+
+ ret = check_fip_toc_entry(&ent, &uuid, dent);
+ if (ret != -EAGAIN)
+ break;
+
+ pos += sizeof(ent);
+ }
+
+ return ret;
+}
+#endif
+
+static int parse_fip_firmware(struct firmware *firmwarep,
+ struct fip_storage_info *info,
+ struct fip_toc_entry *dent)
+{
+ switch (info->storage_interface) {
+ case FIP_STORAGE_INTERFACE_BLK:
+ return blk_parse_fip_firmware(firmwarep, info->desc,
+ &info->part_info,
+ info->part_offset,
+ dent);
+#if CONFIG_IS_ENABLED(CMD_UBIFS)
+ case FIP_STORAGE_INTERFACE_UBI:
+ return ubi_parse_fip_firmware(firmwarep,
+ info->ubi_volume,
+ dent);
+#endif
+ default:
+ return -EINVAL;
+ }
+}
+
+static int blk_read_fip_firmware(struct firmware *firmwarep,
+ struct blk_desc *desc,
+ struct disk_partition *part_info,
+ unsigned int part_offset,
+ const struct fip_toc_entry *ent)
+{
+ lbaint_t offset = part_info->start + part_offset;
+ lbaint_t pos, to_read, read = 0;
+ u64 blkstart, blkcnt;
+ char *read_buf;
+ size_t size;
+ int i, ret;
+
+ read_buf = malloc(desc->blksz);
+ if (!read_buf)
+ return -ENOMEM;
+
+ size = min(firmwarep->size, (size_t)ent->size - firmwarep->offset);
+ blkcnt = BLOCK_CNT(size, desc);
+ blkstart = ent->offset_address + firmwarep->offset;
+ pos = do_div(blkstart, desc->blksz);
+
+ /* Read data in the middle of a block */
+ if (pos) {
+ to_read = min_t(lbaint_t, desc->blksz - pos, size);
+ ret = blk_dread(desc, offset + blkstart, 1, read_buf);
+ if (ret != 1) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ memcpy((u8 *)firmwarep->data, read_buf + pos, to_read);
+ read += to_read;
+ blkstart++;
+ }
+
+ /* Consume all the remaining block */
+ for (i = 0; i < blkcnt && read < size; i++) {
+ to_read = min_t(lbaint_t, desc->blksz, size - read);
+ ret = blk_dread(desc, offset + blkstart + i, 1, read_buf);
+ if (ret != 1) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ memcpy((u8 *)firmwarep->data + read, read_buf, to_read);
+ read += to_read;
+ }
+
+ ret = read;
+
+out:
+ free(read_buf);
+ return ret;
+}
+
+#if CONFIG_IS_ENABLED(CMD_UBIFS)
+static int ubi_read_fip_firmware(struct firmware *firmwarep,
+ char *ubi_vol,
+ const struct fip_toc_entry *ent)
+{
+ unsigned int offset = firmwarep->offset;
+ size_t size;
+ int ret;
+
+ size = min(firmwarep->size, (size_t)ent->size - offset);
+ if (!size)
+ return 0;
+
+ ret = ubi_volume_read(ubi_vol,
+ (u8 *)firmwarep->data,
+ ent->offset_address + offset,
+ size);
+ if (ret)
+ return ret;
+
+ return size;
+}
+#endif
+
+static int read_fip_firmware(struct firmware *firmwarep,
+ struct fip_storage_info *info,
+ const struct fip_toc_entry *dent)
+{
+ switch (info->storage_interface) {
+ case FIP_STORAGE_INTERFACE_BLK:
+ return blk_read_fip_firmware(firmwarep, info->desc,
+ &info->part_info,
+ info->part_offset,
+ dent);
+#if CONFIG_IS_ENABLED(CMD_UBIFS)
+ case FIP_STORAGE_INTERFACE_UBI:
+ return ubi_read_fip_firmware(firmwarep,
+ info->ubi_volume,
+ dent);
+#endif
+ default:
+ return -EINVAL;
+ }
+}
+
+static int fw_parse_storage_info(struct udevice *dev,
+ struct fip_storage_info *info)
+{
+ struct fw_loader_plat *plat = dev_get_uclass_plat(dev);
+ struct fw_loader_env_info env_info = { };
+ int ret;
+
+ generic_fw_loader_env_info(&env_info);
+ info->part_offset = env_get_hex("fw_partoffset", 0);
+
+ if (env_info.storage_interface && env_info.dev_part) {
+ int part;
+
+ part = part_get_info_by_dev_and_name_or_num(env_info.storage_interface,
+ env_info.dev_part,
+ &info->desc,
+ &info->part_info, 1);
+ if (part < 0)
+ return part;
+
+ info->storage_interface = FIP_STORAGE_INTERFACE_BLK;
+
+ return 0;
+ }
+
+ if (env_info.storage_interface && env_info.ubi_mtdpart &&
+ env_info.ubi_volume) {
+ if (strcmp("ubi", env_info.storage_interface))
+ return -ENODEV;
+
+ ret = generic_fw_loader_ubi_select(env_info.ubi_mtdpart);
+ if (ret)
+ return ret;
+
+ info->ubi_volume = env_info.ubi_volume;
+ info->storage_interface = FIP_STORAGE_INTERFACE_UBI;
+
+ return 0;
+ }
+
+ info->part_offset = plat->partoffset;
+
+ if (plat->phandlepart.phandle) {
+ int part;
+
+ ret = generic_fw_loader_get_phandle_desc(plat, &info->desc);
+ if (ret)
+ return ret;
+
+ part = plat->phandlepart.partition;
+ if (part >= 1)
+ ret = part_get_info(info->desc, part,
+ &info->part_info);
+ else
+ ret = part_get_info_whole_disk(info->desc,
+ &info->part_info);
+
+ info->storage_interface = FIP_STORAGE_INTERFACE_BLK;
+
+ return ret;
+ }
+
+ if (plat->mtdpart && plat->ubivol) {
+ ret = generic_fw_loader_ubi_select(plat->mtdpart);
+ if (ret)
+ return ret;
+
+ info->ubi_volume = plat->ubivol;
+ info->storage_interface = FIP_STORAGE_INTERFACE_UBI;
+
+ return 0;
+ }
+
+ return -EINVAL;
+}
+
+/**
+ * fw_get_fip_firmware - load firmware into an allocated buffer.
+ * @dev: An instance of a driver.
+ *
+ * Return: Size of total read, negative value when error.
+ */
+static int fw_get_fip_firmware(struct udevice *dev)
+{
+ struct fip_storage_info info = { };
+ struct firmware *firmwarep;
+ struct fip_toc_entry ent;
+ int ret;
+
+ ret = fw_parse_storage_info(dev, &info);
+ if (ret)
+ return ret;
+
+ firmwarep = dev_get_uclass_priv(dev);
+ if (!firmwarep)
+ return -EINVAL;
+
+ ret = parse_fip_firmware(firmwarep, &info, &ent);
+ if (ret)
+ return ret;
+
+ if (firmwarep->offset > ent.size) {
+ log_err("Invalid offset. Entry too small\n");
+ return -EINVAL;
+ }
+
+ ret = read_fip_firmware(firmwarep, &info, &ent);
+ if (ret < 0)
+ log_err("Failed to read %s from FIP: %d.\n",
+ firmwarep->name, ret);
+
+ return ret;
+}
+
+/**
+ * fw_get_fip_firmware_size - get firmware size.
+ * @dev: An instance of a driver.
+ *
+ * Return: Size of firmware, negative value when error.
+ */
+static int fw_get_fip_firmware_size(struct udevice *dev)
+{
+ struct fip_storage_info info = { };
+ struct firmware *firmwarep;
+ struct fip_toc_entry ent;
+ int ret;
+
+ ret = fw_parse_storage_info(dev, &info);
+ if (ret)
+ return ret;
+
+ firmwarep = dev_get_uclass_priv(dev);
+ if (!firmwarep)
+ return -EINVAL;
+
+ ret = parse_fip_firmware(firmwarep, &info, &ent);
+ if (ret)
+ return ret;
+
+ return ent.size - firmwarep->offset;
+}
+
+static const struct fw_loader_ops fip_loader_ops = {
+ .get_firmware = fw_get_fip_firmware,
+ .get_size = fw_get_fip_firmware_size,
+};
+
+static int fip_loader_of_to_plat(struct udevice *dev)
+{
+ struct fw_loader_plat *plat = dev_get_uclass_plat(dev);
+ ofnode fw_loader_node;
+
+ fw_loader_node = dev_ofnode(dev);
+ if (ofnode_valid(fw_loader_node)) {
+ ofnode_read_u32(fw_loader_node, "partoffset",
+ &plat->partoffset);
+ }
+
+ return 0;
+}
+
+static const struct udevice_id fip_loader_ids[] = {
+ { .compatible = "u-boot,fip-loader"},
+ { }
+};
+
+U_BOOT_DRIVER(fip_loader) = {
+ .name = "fip-loader",
+ .id = UCLASS_FIRMWARE_LOADER,
+ .of_match = fip_loader_ids,
+ .of_to_plat = fip_loader_of_to_plat,
+ .ops = &fip_loader_ops,
+};
diff --git a/drivers/misc/fw_loader/internal.h b/drivers/misc/fw_loader/internal.h
index 1abe7504a81e..5af061321512 100644
--- a/drivers/misc/fw_loader/internal.h
+++ b/drivers/misc/fw_loader/internal.h
@@ -49,11 +49,13 @@ struct fw_loader_ops {
* This holds information about all supported storage devices for driver use.
*
* @phandlepart: Attribute data for block device.
+ * @partoffset: Global offset for BLK partition.
* @mtdpart: MTD partition for ubi partition.
* @ubivol: UBI volume-name for ubifsmount.
*/
struct fw_loader_plat {
struct phandle_part phandlepart;
+ u32 partoffset;
char *mtdpart;
char *ubivol;
};
--
2.55.0
next prev parent reply other threads:[~2026-10-27 12:39 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-27 12:38 [PATCH v11 0/8] misc: fs_loader: reorg and split to FS and FW loader + FIP loader Christian Marangi
2026-10-27 12:38 ` [PATCH v11 1/8] misc: fs_loader: fix ubifs not unmounted on dev_get_priv error Christian Marangi
2026-10-27 12:38 ` [PATCH v11 2/8] misc: fs_loader: reorganize and split to FS loader and FW UCLASS Christian Marangi
2026-10-27 12:38 ` [PATCH v11 3/8] misc: fw_loader: implement generic get_fw_loader_from_node() Christian Marangi
2026-10-27 12:38 ` [PATCH v11 4/8] misc: fs_loader: validate requested offset on reading file Christian Marangi
2026-10-27 14:36 ` Simon Glass
2026-10-27 14:41 ` Christian Marangi (Ansuel)
2026-10-27 12:39 ` [PATCH v11 5/8] misc: fw_loader: implement request_firmware_size() OP Christian Marangi
2026-10-27 12:39 ` [PATCH v11 6/8] doc: dtbinding: Update documentation for Generic Firmware loader Christian Marangi
2026-10-27 12:39 ` Christian Marangi [this message]
2026-10-27 12:39 ` [PATCH v11 8/8] test: dm: Add test for FW Loader feature Christian Marangi
2026-10-27 14:36 ` Simon Glass
2026-10-27 14:36 ` [PATCH v11 0/8] misc: fs_loader: reorg and split to FS and FW loader + FIP loader Simon Glass
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261027123905.839-8-ansuelsmth@gmail.com \
--to=ansuelsmth@gmail.com \
--cc=alchark@flipper.net \
--cc=anshuld@ti.com \
--cc=aristo.chen@canonical.com \
--cc=casey.connolly@linaro.org \
--cc=daniel@makrotopia.org \
--cc=hs@nabladev.com \
--cc=jbx6244@gmail.com \
--cc=lucienzx159@gmail.com \
--cc=m.schwan@phytec.de \
--cc=marcello.bauer@9elements.com \
--cc=marek.vasut+renesas@mailbox.org \
--cc=mateuslima.ti@gmail.com \
--cc=me@ziyao.cc \
--cc=mehmet.fide@screeningeagle.com \
--cc=michal.simek@amd.com \
--cc=mkorpershoek@kernel.org \
--cc=msp@baylibre.com \
--cc=n-francis@ti.com \
--cc=neil.armstrong@linaro.org \
--cc=patrice.chotard@foss.st.com \
--cc=peng.fan@nxp.com \
--cc=quentin.schulz@cherry.de \
--cc=ravi@prevas.dk \
--cc=sjg@chromium.org \
--cc=trini@konsulko.com \
--cc=u-boot@lists.u-boot-project.org \
--cc=xypron.glpk@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox