get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2217981/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2217981,
    "url": "http://patchwork.ozlabs.org/api/patches/2217981/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/uboot/patch/20260331075338.2391-3-ansuelsmth@gmail.com/",
    "project": {
        "id": 18,
        "url": "http://patchwork.ozlabs.org/api/projects/18/?format=api",
        "name": "U-Boot",
        "link_name": "uboot",
        "list_id": "u-boot.lists.denx.de",
        "list_email": "u-boot@lists.denx.de",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260331075338.2391-3-ansuelsmth@gmail.com>",
    "list_archive_url": null,
    "date": "2026-03-31T07:53:21",
    "name": "[v4,2/5] misc: fs_loader: reorganize and split to FS and FW loader",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "72425723067998f89c7eedb62f9dcd3974437b4c",
    "submitter": {
        "id": 71108,
        "url": "http://patchwork.ozlabs.org/api/people/71108/?format=api",
        "name": "Christian Marangi",
        "email": "ansuelsmth@gmail.com"
    },
    "delegate": {
        "id": 3651,
        "url": "http://patchwork.ozlabs.org/api/users/3651/?format=api",
        "username": "trini",
        "first_name": "Tom",
        "last_name": "Rini",
        "email": "trini@ti.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/20260331075338.2391-3-ansuelsmth@gmail.com/mbox/",
    "series": [
        {
            "id": 498136,
            "url": "http://patchwork.ozlabs.org/api/series/498136/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/uboot/list/?series=498136",
            "date": "2026-03-31T07:53:19",
            "name": "misc: fs_loader: reorg and split to FS and FW loader + FIP loader",
            "version": 4,
            "mbox": "http://patchwork.ozlabs.org/series/498136/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2217981/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2217981/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<u-boot-bounces@lists.denx.de>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=alf+PSDr;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=85.214.62.61; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)",
            "phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=gmail.com",
            "phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de",
            "phobos.denx.de;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.b=\"alf+PSDr\";\n\tdkim-atps=neutral",
            "phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=gmail.com",
            "phobos.denx.de;\n spf=pass smtp.mailfrom=ansuelsmth@gmail.com"
        ],
        "Received": [
            "from phobos.denx.de (phobos.denx.de [85.214.62.61])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4flL3l4dp1z1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 31 Mar 2026 18:54:11 +1100 (AEDT)",
            "from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id BC59584035;\n\tTue, 31 Mar 2026 09:53:56 +0200 (CEST)",
            "by phobos.denx.de (Postfix, from userid 109)\n id D3FC58403D; Tue, 31 Mar 2026 09:53:53 +0200 (CEST)",
            "from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com\n [IPv6:2a00:1450:4864:20::32b])\n (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 8484684010\n for <u-boot@lists.denx.de>; Tue, 31 Mar 2026 09:53:51 +0200 (CEST)",
            "by mail-wm1-x32b.google.com with SMTP id\n 5b1f17b1804b1-48334ee0aeaso47405645e9.1\n for <u-boot@lists.denx.de>; Tue, 31 Mar 2026 00:53:51 -0700 (PDT)",
            "from Ansuel-XPS24 (93-34-88-122.ip49.fastwebnet.it. [93.34.88.122])\n by smtp.googlemail.com with ESMTPSA id\n 5b1f17b1804b1-4887c561750sm23889915e9.2.2026.03.31.00.53.49\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 31 Mar 2026 00:53:50 -0700 (PDT)"
        ],
        "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de",
        "X-Spam-Level": "",
        "X-Spam-Status": "No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,\n RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=ham\n autolearn_force=no version=3.4.2",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1774943631; x=1775548431; darn=lists.denx.de;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:to:from:from:to:cc:subject:date:message-id\n :reply-to; bh=RDMBQWS9htR3mGUUg/+RMhdKpU4pDJrtegAYcUEJjM8=;\n b=alf+PSDrlps+X+jI6BxfhS9fKg6AOwG4kx8x1BJu2W1MGPB0/jDJVajHcnp2NOfKg2\n n8h9X0co8qAIXDtOZn4UGiTjD+eY3mSuq/5VBMDM3j2W7519tWSJaY+tCOTETwz3iEp9\n lUI+TW/tPFlwaKbjG0PHm07pOWFyLCw9QyLxoBt1MgUf429t1jGa6tGRa429R9corQYK\n Xb3b9WpeuCJ5TiA36jS7IUD6AuUiYhGJ+dnBIuODM+PFbM+WakBYQGDRu6UxboLtByiB\n OnHylF5Sqe8cUYE9FhJzwz/eBjw6hE3fDo5d0efMC2vG6x6BNcHrt1wxYiditUNsVfNA\n kG4A==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1774943631; x=1775548431;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to\n :cc:subject:date:message-id:reply-to;\n bh=RDMBQWS9htR3mGUUg/+RMhdKpU4pDJrtegAYcUEJjM8=;\n b=rzwHMKhEVWACfIPVOiOmz+1HeuDOYERkQ2iM+ijyIy71HIoFVHGJWhF78ujTnhiODO\n 3o3ymafwjk5WyWAyr4B7U9vEEVNPzWoQx6HBKuIV0ryTkbuYDS577NJbPLxq8HaSvnFV\n BDVwmIWYEqLkz0sG9Bzg/VlO3G+Xg8OFrm2Q73yit4cUuZpgcs8bWXQAL6AuHl5vpZ+V\n Z2goKUOuge+O3rr8Mdyq5bahgdgmd/v4lrikZ3rjnohxJFZrmhjlCTWGmvjuMKqCXfMD\n 3fQ+5lZR297joEZ23NCKL9zk54HBDUI3YqPIuKn1KxHtDAV5ItJHfCCns99Zu3Hof4o0\n Lo2g==",
        "X-Forwarded-Encrypted": "i=1;\n AJvYcCU1tUh1qn2lQlYgBib+MjV5yRrAmTETpxIHG5861TvlnP5SnsuBwX5fKiFPziEu5+yU3CSntAU=@lists.denx.de",
        "X-Gm-Message-State": "AOJu0Yw32lDUUYcLyHFXToqKM0haZyp1ViOCDl9NBsqIoZh/YTXMrKOt\n nJ3pmP1eSPVt/w48DXMs8XdzIIbq4WeM5BrexpoTsg9psFSGqEmSF+k3",
        "X-Gm-Gg": "ATEYQzyWiHN+EohFhQYMPOpJLftVqvOSOAwD0+bcYl7/fahaD38j0IxTUF7FKuZgFGk\n kOSP2bBpGUlUdGHeXJunI2fWQVsimEX4gd+DZxQxflLRu18BUHJhuVh0+O8AzgYBPYlH3TJWu/F\n HYcvJPT+oJAIPhZN/J3NBMYf9kRuOf1h1EbMj0j/7wuHHGrGMtPH40oWu/X2n5RR85HCt18VlnX\n HNsqdmSnV/lo+mZ/n4lzs7JO/tl51mo8FXpphAnP54LJUiBkE/vvNcnByIwK3KrJXDSAZpBdlKu\n 5yJ1FFDHHCWgDmah4vSek3ow7FLIQtLKB2G7NQFZpx9kdk0LSqp3b4BCI5ApnXnGm+0lf7gnb5P\n MlBJA5IR4nE3RK2hrf1N86wtkiO2jdOw9Au2XjdC9zrd6Qjdu7VgtLfNwe6Eucajxq4IHTnbSey\n wrO/sVNN7ltuI5LPJW90BkYfUMfkQYn44f9hIf2RuGFGhZH35snlizYXs=",
        "X-Received": "by 2002:a05:600c:810a:b0:480:690e:f14a with SMTP id\n 5b1f17b1804b1-48727e91110mr261816055e9.14.1774943630656;\n Tue, 31 Mar 2026 00:53:50 -0700 (PDT)",
        "From": "Christian Marangi <ansuelsmth@gmail.com>",
        "To": "Tom Rini <trini@konsulko.com>, Simon Glass <sjg@chromium.org>,\n Casey Connolly <casey.connolly@linaro.org>,\n Quentin Schulz <quentin.schulz@cherry.de>,\n Christian Marangi <ansuelsmth@gmail.com>, Peng Fan <peng.fan@nxp.com>,\n Ilias Apalodimas <ilias.apalodimas@linaro.org>,\n Chen-Yu Tsai <wens@kernel.org>,\n Jamie Gibbons <jamie.gibbons@microchip.com>,\n Neha Malcom Francis <n-francis@ti.com>,\n Justin Klaassen <justin@tidylabs.net>, Harsha Vardhan V M <h-vm@ti.com>,\n Leo Yu-Chi Liang <ycliang@andestech.com>,\n Weijie Gao <weijie.gao@mediatek.com>,\n Marek Vasut <marek.vasut+renesas@mailbox.org>,\n Alif Zakuan Yuslaimi <alif.zakuan.yuslaimi@altera.com>,\n Sky Huang <SkyLake.Huang@mediatek.com>,\n \"Lucien.Jheng\" <lucienzx159@gmail.com>, u-boot@lists.denx.de",
        "Subject": "[PATCH v4 2/5] misc: fs_loader: reorganize and split to FS and FW\n loader",
        "Date": "Tue, 31 Mar 2026 09:53:21 +0200",
        "Message-ID": "<20260331075338.2391-3-ansuelsmth@gmail.com>",
        "X-Mailer": "git-send-email 2.53.0",
        "In-Reply-To": "<20260331075338.2391-1-ansuelsmth@gmail.com>",
        "References": "<20260331075338.2391-1-ansuelsmth@gmail.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "u-boot@lists.denx.de",
        "X-Mailman-Version": "2.1.39",
        "Precedence": "list",
        "List-Id": "U-Boot discussion <u-boot.lists.denx.de>",
        "List-Unsubscribe": "<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>",
        "List-Archive": "<https://lists.denx.de/pipermail/u-boot/>",
        "List-Post": "<mailto:u-boot@lists.denx.de>",
        "List-Help": "<mailto:u-boot-request@lists.denx.de?subject=help>",
        "List-Subscribe": "<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>",
        "Errors-To": "u-boot-bounces@lists.denx.de",
        "Sender": "\"U-Boot\" <u-boot-bounces@lists.denx.de>",
        "X-Virus-Scanned": "clamav-milter 0.103.8 at phobos.denx.de",
        "X-Virus-Status": "Clean"
    },
    "content": "In preparation to the introduction of variant of the FS loader,\nreorganize and split the driver to generic fw_loader function and\nspecific fs_loader function. Create a dedicated directory for the loader\nand move the internal structs and functions to a dedicated header file.\n\nThis will permit to reuse all the property and logic of FS loader\nwith container that are not exactly a readable filesystem.\n\nSigned-off-by: Christian Marangi <ansuelsmth@gmail.com>\n---\n drivers/misc/Kconfig                     |   5 +\n drivers/misc/Makefile                    |   2 +-\n drivers/misc/fw_loader/Makefile          |   4 +\n drivers/misc/{ => fw_loader}/fs_loader.c | 139 ++--------------------\n drivers/misc/fw_loader/fw_loader.c       | 144 +++++++++++++++++++++++\n drivers/misc/fw_loader/internal.h        |  61 ++++++++++\n include/fs_loader.h                      |  47 +-------\n include/fw_loader.h                      |  19 +++\n 8 files changed, 246 insertions(+), 175 deletions(-)\n create mode 100644 drivers/misc/fw_loader/Makefile\n rename drivers/misc/{ => fw_loader}/fs_loader.c (58%)\n create mode 100644 drivers/misc/fw_loader/fw_loader.c\n create mode 100644 drivers/misc/fw_loader/internal.h",
    "diff": "diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig\nindex b2dfc7f5b663..818f93413b6b 100644\n--- a/drivers/misc/Kconfig\n+++ b/drivers/misc/Kconfig\n@@ -612,8 +612,12 @@ config MPC83XX_SERDES\n \thelp\n \t  Support for serdes found on MPC83xx SoCs.\n \n+config FW_LOADER\n+\tbool\n+\n config FS_LOADER\n \tbool \"Enable loader driver for file system\"\n+\tselect FW_LOADER\n \thelp\n \t  This is file system generic loader which can be used to load\n \t  the file image from the storage into target such as memory.\n@@ -623,6 +627,7 @@ config FS_LOADER\n \n config SPL_FS_LOADER\n \tbool \"Enable loader driver for file system in SPL\"\n+\tselect FW_LOADER\n \tdepends on SPL\n \thelp\n \t  This is file system generic loader which can be used to load\ndiff --git a/drivers/misc/Makefile b/drivers/misc/Makefile\nindex e2170212e5ad..7d73b6f843e4 100644\n--- a/drivers/misc/Makefile\n+++ b/drivers/misc/Makefile\n@@ -36,7 +36,7 @@ obj-$(CONFIG_FSL_DEVICE_DISABLE) += fsl_devdis.o\n obj-$(CONFIG_FSL_IFC) += fsl_ifc.o\n obj-$(CONFIG_FSL_IIM) += fsl_iim.o\n obj-$(CONFIG_FSL_SEC_MON) += fsl_sec_mon.o\n-obj-$(CONFIG_$(PHASE_)FS_LOADER) += fs_loader.o\n+obj-$(CONFIG_FW_LOADER) += fw_loader/\n obj-$(CONFIG_GATEWORKS_SC) += gsc.o\n obj-$(CONFIG_GDSYS_IOEP) += gdsys_ioep.o\n obj-$(CONFIG_GDSYS_RXAUI_CTRL) += gdsys_rxaui_ctrl.o\ndiff --git a/drivers/misc/fw_loader/Makefile b/drivers/misc/fw_loader/Makefile\nnew file mode 100644\nindex 000000000000..96baebede788\n--- /dev/null\n+++ b/drivers/misc/fw_loader/Makefile\n@@ -0,0 +1,4 @@\n+# SPDX-License-Identifier: GPL-2.0+\n+\n+obj-y += fw_loader.o\n+obj-$(CONFIG_$(PHASE_)FS_LOADER) += fs_loader.o\ndiff --git a/drivers/misc/fs_loader.c b/drivers/misc/fw_loader/fs_loader.c\nsimilarity index 58%\nrename from drivers/misc/fs_loader.c\nrename to drivers/misc/fw_loader/fs_loader.c\nindex cd4695b08eea..26ac936aa590 100644\n--- a/drivers/misc/fs_loader.c\n+++ b/drivers/misc/fw_loader/fs_loader.c\n@@ -24,33 +24,16 @@\n #include <ubi_uboot.h>\n #endif\n \n-/**\n- * struct firmware - A place for storing firmware and its attribute data.\n- *\n- * This holds information about a firmware and its content.\n- *\n- * @size: Size of a file\n- * @data: Buffer for file\n- * @priv: Firmware loader private fields\n- * @name: Filename\n- * @offset: Offset of reading a file\n- */\n-struct firmware {\n-\tsize_t size;\n-\tconst u8 *data;\n-\tconst char *name;\n-\tu32 offset;\n-};\n+#include \"internal.h\"\n \n #ifdef CONFIG_CMD_UBIFS\n static int mount_ubifs(char *mtdpart, char *ubivol)\n {\n-\tint ret = ubi_part(mtdpart, NULL);\n+\tint ret;\n \n-\tif (ret) {\n-\t\tdebug(\"Cannot find mtd partition %s\\n\", mtdpart);\n+\tret = generic_fw_loader_ubi_select(mtdpart);\n+\tif (ret)\n \t\treturn ret;\n-\t}\n \n \treturn cmd_ubifs_mount(ubivol);\n }\n@@ -106,37 +89,6 @@ static int select_fs_dev(struct device_plat *plat)\n \treturn ret;\n }\n \n-/**\n- * _request_firmware_prepare - Prepare firmware struct.\n- *\n- * @dev: An instance of a driver.\n- * @name: Name of firmware file.\n- * @dbuf: Address of buffer to load firmware into.\n- * @size: Size of buffer.\n- * @offset: Offset of a file for start reading into buffer.\n- *\n- * Return: Negative value if fail, 0 for successful.\n- */\n-static int _request_firmware_prepare(struct udevice *dev,\n-\t\t\t\t    const char *name, void *dbuf,\n-\t\t\t\t    size_t size, u32 offset)\n-{\n-\tif (!name || name[0] == '\\0')\n-\t\treturn -EINVAL;\n-\n-\tstruct firmware *firmwarep = dev_get_priv(dev);\n-\n-\tif (!firmwarep)\n-\t\treturn -ENOMEM;\n-\n-\tfirmwarep->name = name;\n-\tfirmwarep->offset = offset;\n-\tfirmwarep->data = dbuf;\n-\tfirmwarep->size = size;\n-\n-\treturn 0;\n-}\n-\n /**\n  * fw_get_filesystem_firmware - load firmware into an allocated buffer.\n  * @dev: An instance of a driver.\n@@ -197,87 +149,16 @@ out:\n \treturn ret;\n }\n \n-/**\n- * request_firmware_into_buf - Load firmware into a previously allocated buffer.\n- * @dev: An instance of a driver.\n- * @name: Name of firmware file.\n- * @buf: Address of buffer to load firmware into.\n- * @size: Size of buffer.\n- * @offset: Offset of a file for start reading into buffer.\n- *\n- * The firmware is loaded directly into the buffer pointed to by @buf.\n- *\n- * Return: Size of total read, negative value when error.\n- */\n-int request_firmware_into_buf(struct udevice *dev,\n-\t\t\t      const char *name,\n-\t\t\t      void *buf, size_t size, u32 offset)\n-{\n-\tint ret;\n-\n-\tif (!dev)\n-\t\treturn -EINVAL;\n-\n-\tret = _request_firmware_prepare(dev, name, buf, size, offset);\n-\tif (ret < 0) /* error */\n-\t\treturn ret;\n-\n-\tret = fw_get_filesystem_firmware(dev);\n-\n-\treturn ret;\n-}\n-\n-static int fs_loader_of_to_plat(struct udevice *dev)\n-{\n-\tu32 phandlepart[2];\n-\n-\tofnode fs_loader_node = dev_ofnode(dev);\n-\n-\tif (ofnode_valid(fs_loader_node)) {\n-\t\tstruct device_plat *plat;\n-\n-\t\tplat = dev_get_plat(dev);\n-\t\tif (!ofnode_read_u32_array(fs_loader_node,\n-\t\t\t\t\t  \"phandlepart\",\n-\t\t\t\t\t  phandlepart, 2)) {\n-\t\t\tplat->phandlepart.phandle = phandlepart[0];\n-\t\t\tplat->phandlepart.partition = phandlepart[1];\n-\t\t}\n-\n-\t\tplat->mtdpart = (char *)ofnode_read_string(\n-\t\t\t\t fs_loader_node, \"mtdpart\");\n-\n-\t\tplat->ubivol = (char *)ofnode_read_string(\n-\t\t\t\t fs_loader_node, \"ubivol\");\n-\t}\n-\n-\treturn 0;\n-}\n-\n static int fs_loader_probe(struct udevice *dev)\n {\n-#if CONFIG_IS_ENABLED(DM) && CONFIG_IS_ENABLED(BLK)\n-\tint ret;\n \tstruct device_plat *plat = dev_get_plat(dev);\n+\tint ret;\n \n-\tif (plat->phandlepart.phandle) {\n-\t\tofnode node = ofnode_get_by_phandle(plat->phandlepart.phandle);\n-\t\tstruct udevice *parent_dev = NULL;\n-\n-\t\tret = device_get_global_by_ofnode(node, &parent_dev);\n-\t\tif (!ret) {\n-\t\t\tstruct udevice *dev;\n-\n-\t\t\tret = blk_get_from_parent(parent_dev, &dev);\n-\t\t\tif (ret) {\n-\t\t\t\tdebug(\"fs_loader: No block device: %d\\n\",\n-\t\t\t\t\tret);\n+\tret = generic_fw_loader_probe(dev);\n+\tif (ret)\n+\t\treturn ret;\n \n-\t\t\t\treturn ret;\n-\t\t\t}\n-\t\t}\n-\t}\n-#endif\n+\tplat->get_firmware = fw_get_filesystem_firmware;\n \n \treturn 0;\n };\n@@ -292,7 +173,7 @@ U_BOOT_DRIVER(fs_loader) = {\n \t.id\t\t\t= UCLASS_FS_FIRMWARE_LOADER,\n \t.of_match\t\t= fs_loader_ids,\n \t.probe\t\t\t= fs_loader_probe,\n-\t.of_to_plat\t= fs_loader_of_to_plat,\n+\t.of_to_plat\t= generic_fw_loader_of_to_plat,\n \t.plat_auto\t= sizeof(struct device_plat),\n \t.priv_auto\t= sizeof(struct firmware),\n };\ndiff --git a/drivers/misc/fw_loader/fw_loader.c b/drivers/misc/fw_loader/fw_loader.c\nnew file mode 100644\nindex 000000000000..644b98de9f6c\n--- /dev/null\n+++ b/drivers/misc/fw_loader/fw_loader.c\n@@ -0,0 +1,144 @@\n+// SPDX-License-Identifier: GPL-2.0\n+/*\n+ * Copyright (C) 2018-2019 Intel Corporation <www.intel.com>\n+ *\n+ */\n+\n+#include <errno.h>\n+#include <blk.h>\n+#include <linux/types.h>\n+#include <dm/device.h>\n+#include <fw_loader.h>\n+\n+#ifdef CONFIG_CMD_UBIFS\n+#include <ubi_uboot.h>\n+#endif\n+\n+#include \"internal.h\"\n+\n+#ifdef CONFIG_CMD_UBIFS\n+int generic_fw_loader_ubi_select(char *mtdpart)\n+{\n+\tint ret;\n+\n+\tret = ubi_part(mtdpart, NULL);\n+\tif (ret)\n+\t\tdebug(\"Cannot find mtd partition %s\\n\", mtdpart);\n+\n+\treturn ret;\n+}\n+#else\n+int generic_fw_loader_ubi_select(char *mtdpart)\n+{\n+\tdebug(\"Error: Cannot select ubi partition: no UBIFS support\\n\");\n+\treturn -ENOSYS;\n+}\n+#endif\n+\n+int generic_fw_loader_of_to_plat(struct udevice *dev)\n+{\n+\tu32 phandlepart[2];\n+\n+\tofnode fw_loader_node = dev_ofnode(dev);\n+\n+\tif (ofnode_valid(fw_loader_node)) {\n+\t\tstruct device_plat *plat;\n+\n+\t\tplat = dev_get_plat(dev);\n+\t\tif (!ofnode_read_u32_array(fw_loader_node,\n+\t\t\t\t\t   \"phandlepart\",\n+\t\t\t\t\t   phandlepart, 2)) {\n+\t\t\tplat->phandlepart.phandle = phandlepart[0];\n+\t\t\tplat->phandlepart.partition = phandlepart[1];\n+\t\t}\n+\n+\t\tplat->mtdpart = (char *)ofnode_read_string(fw_loader_node,\n+\t\t\t\t\t\t\t   \"mtdpart\");\n+\n+\t\tplat->ubivol = (char *)ofnode_read_string(fw_loader_node,\n+\t\t\t\t\t\t\t  \"ubivol\");\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int generic_fw_loader_probe(struct udevice *dev)\n+{\n+#if CONFIG_IS_ENABLED(DM) && CONFIG_IS_ENABLED(BLK)\n+\tint ret;\n+\tstruct device_plat *plat = dev_get_plat(dev);\n+\n+\tif (plat->phandlepart.phandle) {\n+\t\tofnode node = ofnode_get_by_phandle(plat->phandlepart.phandle);\n+\t\tstruct udevice *parent_dev = NULL;\n+\n+\t\tret = device_get_global_by_ofnode(node, &parent_dev);\n+\t\tif (!ret) {\n+\t\t\tstruct udevice *blk_dev;\n+\n+\t\t\tret = blk_get_from_parent(parent_dev, &blk_dev);\n+\t\t\tif (ret) {\n+\t\t\t\tdebug(\"fw_loader: No block device: %d\\n\",\n+\t\t\t\t      ret);\n+\n+\t\t\t\treturn ret;\n+\t\t\t}\n+\t\t}\n+\t}\n+#endif\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * _request_firmware_prepare - Prepare firmware struct.\n+ *\n+ * @dev: An instance of a driver.\n+ * @name: Name of firmware file.\n+ * @dbuf: Address of buffer to load firmware into.\n+ * @size: Size of buffer.\n+ * @offset: Offset of a file for start reading into buffer.\n+ *\n+ * Return: Negative value if fail, 0 for successful.\n+ */\n+static int _request_firmware_prepare(struct udevice *dev,\n+\t\t\t\t     const char *name, void *dbuf,\n+\t\t\t\t     size_t size, u32 offset)\n+{\n+\tif (!name || name[0] == '\\0')\n+\t\treturn -EINVAL;\n+\n+\tstruct firmware *firmwarep = dev_get_priv(dev);\n+\n+\tif (!firmwarep)\n+\t\treturn -ENOMEM;\n+\n+\tfirmwarep->name = name;\n+\tfirmwarep->offset = offset;\n+\tfirmwarep->data = dbuf;\n+\tfirmwarep->size = size;\n+\n+\treturn 0;\n+}\n+\n+int request_firmware_into_buf(struct udevice *dev,\n+\t\t\t      const char *name,\n+\t\t\t      void *buf, size_t size, u32 offset)\n+{\n+\tstruct device_plat *plat;\n+\tint ret;\n+\n+\tif (!dev)\n+\t\treturn -EINVAL;\n+\n+\tret = _request_firmware_prepare(dev, name, buf, size, offset);\n+\tif (ret < 0) /* error */\n+\t\treturn ret;\n+\n+\tplat = dev_get_plat(dev);\n+\n+\tif (!plat->get_firmware)\n+\t\treturn -EOPNOTSUPP;\n+\n+\treturn plat->get_firmware(dev);\n+}\ndiff --git a/drivers/misc/fw_loader/internal.h b/drivers/misc/fw_loader/internal.h\nnew file mode 100644\nindex 000000000000..fa006b7e6077\n--- /dev/null\n+++ b/drivers/misc/fw_loader/internal.h\n@@ -0,0 +1,61 @@\n+/* SPDX-License-Identifier: GPL-2.0 */\n+/*\n+ * Copyright (C) 2018-2019 Intel Corporation <www.intel.com>\n+ */\n+#ifndef _FW_LOADER_INTERNAL_H_\n+#define _FW_LOADER_INTERNAL_H_\n+\n+/**\n+ * struct phandle_part - A place for storing phandle of node and its partition\n+ *\n+ * This holds information about a phandle of the block device, and its\n+ * partition where the firmware would be loaded from.\n+ *\n+ * @phandle: Phandle of storage device node\n+ * @partition: Partition of block device\n+ */\n+struct phandle_part {\n+\tu32 phandle;\n+\tu32 partition;\n+};\n+\n+/**\n+ * struct device_plat - A place for storing all supported storage devices\n+ *\n+ * This holds information about all supported storage devices for driver use.\n+ *\n+ * @phandlepart: Attribute data for block device.\n+ * @mtdpart: MTD partition for ubi partition.\n+ * @ubivol: UBI volume-name for ubifsmount.\n+ */\n+struct device_plat {\n+\tstruct phandle_part phandlepart;\n+\tchar *mtdpart;\n+\tchar *ubivol;\n+\n+\tint (*get_firmware)(struct udevice *dev);\n+};\n+\n+/**\n+ * struct firmware - A place for storing firmware and its attribute data.\n+ *\n+ * This holds information about a firmware and its content.\n+ *\n+ * @size: Size of a file\n+ * @data: Buffer for file\n+ * @priv: Firmware loader private fields\n+ * @name: Filename\n+ * @offset: Offset of reading a file\n+ */\n+struct firmware {\n+\tsize_t size;\n+\tconst u8 *data;\n+\tconst char *name;\n+\tu32 offset;\n+};\n+\n+int generic_fw_loader_ubi_select(char *mtdpart);\n+int generic_fw_loader_probe(struct udevice *dev);\n+int generic_fw_loader_of_to_plat(struct udevice *dev);\n+\n+#endif\ndiff --git a/include/fs_loader.h b/include/fs_loader.h\nindex 7e16e0f70309..3c64efe1b439 100644\n--- a/include/fs_loader.h\n+++ b/include/fs_loader.h\n@@ -6,52 +6,9 @@\n #ifndef _FS_LOADER_H_\n #define _FS_LOADER_H_\n \n-struct udevice;\n-\n-/**\n- * struct phandle_part - A place for storing phandle of node and its partition\n- *\n- * This holds information about a phandle of the block device, and its\n- * partition where the firmware would be loaded from.\n- *\n- * @phandle: Phandle of storage device node\n- * @partition: Partition of block device\n- */\n-struct phandle_part {\n-\tu32 phandle;\n-\tu32 partition;\n-};\n-\n-/**\n- * struct phandle_part - A place for storing all supported storage devices\n- *\n- * This holds information about all supported storage devices for driver use.\n- *\n- * @phandlepart: Attribute data for block device.\n- * @mtdpart: MTD partition for ubi partition.\n- * @ubivol: UBI volume-name for ubifsmount.\n- */\n-struct device_plat {\n-\tstruct phandle_part phandlepart;\n-\tchar *mtdpart;\n-\tchar *ubivol;\n-};\n+#include <fw_loader.h>\n \n-/**\n- * request_firmware_into_buf - Load firmware into a previously allocated buffer.\n- * @dev: An instance of a driver.\n- * @name: Name of firmware file.\n- * @buf: Address of buffer to load firmware into.\n- * @size: Size of buffer.\n- * @offset: Offset of a file for start reading into buffer.\n- *\n- * The firmware is loaded directly into the buffer pointed to by @buf.\n- *\n- * Return: Size of total read, negative value when error.\n- */\n-int request_firmware_into_buf(struct udevice *dev,\n-\t\t\t      const char *name,\n-\t\t\t      void *buf, size_t size, u32 offset);\n+struct udevice;\n \n /**\n  * get_fs_loader() - Get the chosen filesystem loader\ndiff --git a/include/fw_loader.h b/include/fw_loader.h\nindex 35574482b2b9..56f5e3be6195 100644\n--- a/include/fw_loader.h\n+++ b/include/fw_loader.h\n@@ -1,10 +1,29 @@\n /* SPDX-License-Identifier: GPL-2.0 */\n /*\n+ * Copyright (C) 2018-2019 Intel Corporation <www.intel.com>\n  * Copyright (C) 2025 Lucien Jheng <lucienzx159@gmail.com>\n  */\n #ifndef _FW_LOADER_H_\n #define _FW_LOADER_H_\n \n+struct udevice;\n+\n+/**\n+ * request_firmware_into_buf - Load firmware into a previously allocated buffer.\n+ * @dev: An instance of a driver.\n+ * @name: Name of firmware file.\n+ * @buf: Address of buffer to load firmware into.\n+ * @size: Size of buffer.\n+ * @offset: Offset of a file for start reading into buffer.\n+ *\n+ * The firmware is loaded directly into the buffer pointed to by @buf.\n+ *\n+ * Return: Size of total read, negative value when error.\n+ */\n+int request_firmware_into_buf(struct udevice *dev,\n+\t\t\t      const char *name,\n+\t\t\t      void *buf, size_t size, u32 offset);\n+\n /**\n  * request_firmware_into_buf_via_script() -\n  * Load firmware using a U-Boot script and copy to buffer\n",
    "prefixes": [
        "v4",
        "2/5"
    ]
}