]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
misc: fs_loader: Add function to get the chosen loader
authorSean Anderson <sean.anderson@seco.com>
Thu, 29 Dec 2022 16:52:59 +0000 (11:52 -0500)
committerTom Rini <trini@konsulko.com>
Thu, 12 Jan 2023 19:06:15 +0000 (14:06 -0500)
The fs_loader device is used to pull in settings via the chosen node.
However, there was no library function for this, so arria10 was doing it
explicitly. This function subsumes that, and uses ofnode_get_chosen_node
instead of navigating the device tree directly. Because fs_loader pulls
its config from the environment by default, it's fine to create a device
with nothing backing it at all. Doing this allows enabling
CONFIG_FS_LOADER without needing to modify the device tree.

Signed-off-by: Sean Anderson <sean.anderson@seco.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
arch/arm/mach-k3/common.c
arch/arm/mach-omap2/boot-common.c
drivers/fpga/socfpga_arria10.c
drivers/misc/fs_loader.c
include/fs_loader.h

index d5e1f8e2e780e1ae785e7d3347da5294fb025234..a2adb791f6c06cc254259f93005452ba24bb7521 100644 (file)
@@ -181,7 +181,7 @@ int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr)
        if (!*loadaddr)
                return 0;
 
-       if (!uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &fsdev)) {
+       if (!get_fs_loader(&fsdev)) {
                size = request_firmware_into_buf(fsdev, name, (void *)*loadaddr,
                                                 0, 0);
        }
index d104f23b3e23e9348af032b286c856079d9cc77a..9a342a1bf952954ab855679c72ac48cf1d455bba 100644 (file)
@@ -214,7 +214,7 @@ int load_firmware(char *name_fw, u32 *loadaddr)
        if (!*loadaddr)
                return 0;
 
-       if (!uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &fsdev)) {
+       if (!get_fs_loader(&fsdev)) {
                size = request_firmware_into_buf(fsdev, name_fw,
                                                 (void *)*loadaddr, 0, 0);
        }
index 3b785e67d0b2b5d1d2eaa0218645d74d7fdf269b..96b195063e0802ec82eaaf7d6036e1828b0a1507 100644 (file)
@@ -777,42 +777,20 @@ int socfpga_loadfs(fpga_fs_info *fpga_fsinfo, const void *buf, size_t bsize,
 {
        struct fpga_loadfs_info fpga_loadfs;
        struct udevice *dev;
-       int status, ret, size;
+       int status, ret;
        u32 buffer = (uintptr_t)buf;
        size_t buffer_sizebytes = bsize;
        size_t buffer_sizebytes_ori = bsize;
        size_t total_sizeof_image = 0;
        ofnode node;
-       const fdt32_t *phandle_p;
-       u32 phandle;
 
        node = get_fpga_mgr_ofnode(ofnode_null());
-
-       if (ofnode_valid(node)) {
-               phandle_p = ofnode_get_property(node, "firmware-loader", &size);
-               if (!phandle_p) {
-                       node = ofnode_path("/chosen");
-                       if (!ofnode_valid(node)) {
-                               debug("FPGA: /chosen node was not found.\n");
-                               return -ENOENT;
-                       }
-
-                       phandle_p = ofnode_get_property(node, "firmware-loader",
-                                                      &size);
-                       if (!phandle_p) {
-                               debug("FPGA: firmware-loader property was not");
-                               debug(" found.\n");
-                               return -ENOENT;
-                       }
-               }
-       } else {
+       if (!ofnode_valid(node)) {
                debug("FPGA: FPGA manager node was not found.\n");
                return -ENOENT;
        }
 
-       phandle = fdt32_to_cpu(*phandle_p);
-       ret = uclass_get_device_by_phandle_id(UCLASS_FS_FIRMWARE_LOADER,
-                                            phandle, &dev);
+       ret = get_fs_loader(&dev);
        if (ret)
                return ret;
 
index 5b4d03639c35f9aa5585fc0e76ad8db1f2ff89a7..ccf5c7a803714b0947774500afb18957ce67f66b 100644 (file)
@@ -15,6 +15,8 @@
 #include <fs_loader.h>
 #include <log.h>
 #include <asm/global_data.h>
+#include <dm/device-internal.h>
+#include <dm/root.h>
 #include <linux/string.h>
 #include <mapmem.h>
 #include <malloc.h>
@@ -297,6 +299,31 @@ U_BOOT_DRIVER(fs_loader) = {
        .priv_auto      = sizeof(struct firmware),
 };
 
+static struct device_plat default_plat = { 0 };
+
+int get_fs_loader(struct udevice **dev)
+{
+       int ret;
+       ofnode node = ofnode_get_chosen_node("firmware-loader");
+
+       if (ofnode_valid(node))
+               return uclass_get_device_by_ofnode(UCLASS_FS_FIRMWARE_LOADER,
+                                                  node, dev);
+
+       /* Try the first device if none was chosen */
+       ret = uclass_first_device_err(UCLASS_FS_FIRMWARE_LOADER, dev);
+       if (ret != -ENODEV)
+               return ret;
+
+       /* Just create a new device */
+       ret = device_bind(dm_root(), DM_DRIVER_GET(fs_loader), "default-loader",
+                         &default_plat, ofnode_null(), dev);
+       if (ret)
+               return ret;
+
+       return device_probe(*dev);
+}
+
 UCLASS_DRIVER(fs_loader) = {
        .id             = UCLASS_FS_FIRMWARE_LOADER,
        .name           = "fs-loader",
index 8de7cb18dc73f9a03b8055c226b608547a09cdc0..5eb5b7ab4a105348ab5c0f944bad309c0cfeb01a 100644 (file)
@@ -52,4 +52,16 @@ struct device_plat {
 int request_firmware_into_buf(struct udevice *dev,
                              const char *name,
                              void *buf, size_t size, u32 offset);
+
+/**
+ * get_fs_loader() - Get the chosen filesystem loader
+ * @dev: Where to store the device
+ *
+ * This gets a filesystem loader device based on the value of
+ * /chosen/firmware-loader. If no such property exists, it returns a
+ * firmware loader which is configured by environmental variables.
+ *
+ * Return: 0 on success, negative value on error
+ */
+int get_fs_loader(struct udevice **dev);
 #endif