All of lore.kernel.org
 help / color / mirror / Atom feed
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 5/8] misc: fw_loader: implement request_firmware_size() OP
Date: Tue, 27 Oct 2026 13:39:00 +0100	[thread overview]
Message-ID: <20261027123905.839-6-ansuelsmth@gmail.com> (raw)
In-Reply-To: <20261027123905.839-1-ansuelsmth@gmail.com>

It might be useful to get the firmware size before reading it to allocate
the correct size. This is needed for case where the firmware size change
across different firmware version and is not always the same. In such case
the only way to handle this scenario is to allocate a big-enough buffer to
read the firmware.

To better handle this, introduce the request_firmware_size() OP to get the
firmware size before reading it. This way proper buffer can be allocated
and dynamic firmware size can be better supported.

FS loader is updated to handle the new .get_size() handler.

Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
 drivers/misc/fw_loader/fs_loader.c        | 28 +++++++++++++++++++++++
 drivers/misc/fw_loader/fw_loader-uclass.c | 19 +++++++++++++++
 drivers/misc/fw_loader/internal.h         |  7 ++++++
 include/fw_loader.h                       |  9 ++++++++
 4 files changed, 63 insertions(+)

diff --git a/drivers/misc/fw_loader/fs_loader.c b/drivers/misc/fw_loader/fs_loader.c
index cc1bbd2f0db9..b7ba57ce6778 100644
--- a/drivers/misc/fw_loader/fs_loader.c
+++ b/drivers/misc/fw_loader/fs_loader.c
@@ -190,8 +190,36 @@ out:
 	return ret;
 }
 
+/**
+ * fw_get_filesystem_firmware_size - get firmware size.
+ * @dev: An instance of a driver.
+ *
+ * Return: Size of firmware, negative value when error.
+ */
+static int fw_get_filesystem_firmware_size(struct udevice *dev)
+{
+	struct firmware *upriv = dev_get_uclass_priv(dev);
+	loff_t size;
+	int ret;
+
+	ret = fw_get_filesystem_mount(dev);
+	if (ret)
+		goto out;
+
+	ret = __fw_get_filesystem_firmware_size(dev, upriv->name, &size);
+	if (ret)
+		goto out;
+
+	ret = size;
+
+out:
+	fw_get_filesystem_release(dev);
+	return ret;
+}
+
 static const struct fw_loader_ops fs_loader_ops = {
 	.get_firmware = fw_get_filesystem_firmware,
+	.get_size = fw_get_filesystem_firmware_size,
 };
 
 static const struct udevice_id fs_loader_ids[] = {
diff --git a/drivers/misc/fw_loader/fw_loader-uclass.c b/drivers/misc/fw_loader/fw_loader-uclass.c
index 7f19d6c4af4c..4e67f2559fa2 100644
--- a/drivers/misc/fw_loader/fw_loader-uclass.c
+++ b/drivers/misc/fw_loader/fw_loader-uclass.c
@@ -210,3 +210,22 @@ int request_firmware_into_buf(struct udevice *dev,
 
 	return ops->get_firmware(dev);
 }
+
+int request_firmware_size(struct udevice *dev, const char *name)
+{
+	const struct fw_loader_ops *ops;
+	int ret;
+
+	if (!dev)
+		return -EINVAL;
+
+	ret = _request_firmware_prepare(dev, name, NULL, 0, 0);
+	if (ret < 0) /* error */
+		return ret;
+
+	ops = fw_loader_get_ops(dev);
+	if (!ops->get_size)
+		return -EOPNOTSUPP;
+
+	return ops->get_size(dev);
+}
diff --git a/drivers/misc/fw_loader/internal.h b/drivers/misc/fw_loader/internal.h
index 9ff43e872554..1abe7504a81e 100644
--- a/drivers/misc/fw_loader/internal.h
+++ b/drivers/misc/fw_loader/internal.h
@@ -32,6 +32,13 @@ struct fw_loader_ops {
 	 * @dev:	Firmware Loader device to read firmware from
 	 */
 	int (*get_firmware)(struct udevice *dev);
+
+	/**
+	 * get_size() - get firmware size from Firmware Loader driver
+	 *
+	 * @dev:	Firmware Loader device to get firmware size from
+	 */
+	int (*get_size)(struct udevice *dev);
 };
 
 #define fw_loader_get_ops(dev)	((const struct fw_loader_ops *)(dev)->driver->ops)
diff --git a/include/fw_loader.h b/include/fw_loader.h
index 99c47380a172..01f242dcbefd 100644
--- a/include/fw_loader.h
+++ b/include/fw_loader.h
@@ -38,6 +38,15 @@ int request_firmware_into_buf(struct udevice *dev,
 			      const char *name,
 			      void *buf, size_t size, u32 offset);
 
+/**
+ * request_firmware_size - Get firmware size.
+ * @dev: An instance of a driver.
+ * @name: Name of firmware file.
+ *
+ * Return: Size of firmware, negative value when error.
+ */
+int request_firmware_size(struct udevice *dev, const char *name);
+
 /**
  * request_firmware_into_buf_via_script() -
  * Load firmware using a U-Boot script and copy to buffer
-- 
2.55.0


  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 ` Christian Marangi [this message]
2026-10-27 12:39 ` [PATCH v11 6/8] doc: dtbinding: Update documentation for Generic Firmware loader Christian Marangi
2026-10-27 12:39 ` [PATCH v11 7/8] misc: fw_loader: introduce FIP loader driver Christian Marangi
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-6-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.