[RESEND PATCH v2 0/3] net: fm: Add support for loading firmware from filesystem

This adds support for loading Fman firmware from a filesystem using the firmware loader subsystem. It was originally part of [1], but has been split off because it is conceptually separate.
[1] https://lore.kernel.org/u-boot/20220324182306.2037094-1-sean.anderson@seco.c...
Changes in v2: - Split series into two
Sean Anderson (3): misc: fs_loader: Add function to get the chosen loader net: fm: Add firmware name parameter net: fm: Support loading firmware from a filesystem
arch/arm/mach-k3/common.c | 2 +- arch/arm/mach-omap2/boot-common.c | 2 +- drivers/fpga/socfpga_arria10.c | 24 ++----------------- drivers/misc/fs_loader.c | 27 +++++++++++++++++++++ drivers/net/fm/fm.c | 40 +++++++++++++++++++++++++++---- drivers/net/fm/fm.h | 2 +- drivers/net/fm/init.c | 4 ++-- drivers/qe/Kconfig | 4 ++++ include/fs_loader.h | 12 ++++++++++ 9 files changed, 86 insertions(+), 31 deletions(-)

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 ---
(no changes since v1)
arch/arm/mach-k3/common.c | 2 +- arch/arm/mach-omap2/boot-common.c | 2 +- drivers/fpga/socfpga_arria10.c | 24 ++---------------------- drivers/misc/fs_loader.c | 27 +++++++++++++++++++++++++++ include/fs_loader.h | 12 ++++++++++++ 5 files changed, 43 insertions(+), 24 deletions(-)
diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c index b4b75f4e6c..ec236d5a2e 100644 --- a/arch/arm/mach-k3/common.c +++ b/arch/arm/mach-k3/common.c @@ -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); } diff --git a/arch/arm/mach-omap2/boot-common.c b/arch/arm/mach-omap2/boot-common.c index c463c96c74..88132b6572 100644 --- a/arch/arm/mach-omap2/boot-common.c +++ b/arch/arm/mach-omap2/boot-common.c @@ -212,7 +212,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); } diff --git a/drivers/fpga/socfpga_arria10.c b/drivers/fpga/socfpga_arria10.c index 798e3a3f90..65bebd8997 100644 --- a/drivers/fpga/socfpga_arria10.c +++ b/drivers/fpga/socfpga_arria10.c @@ -765,32 +765,12 @@ int socfpga_loadfs(fpga_fs_info *fpga_fsinfo, const void *buf, size_t bsize, 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;
diff --git a/drivers/misc/fs_loader.c b/drivers/misc/fs_loader.c index 0139bd66ba..0018c930ec 100644 --- a/drivers/misc/fs_loader.c +++ b/drivers/misc/fs_loader.c @@ -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> @@ -293,6 +295,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", diff --git a/include/fs_loader.h b/include/fs_loader.h index 8de7cb18dc..5eb5b7ab4a 100644 --- a/include/fs_loader.h +++ b/include/fs_loader.h @@ -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

On Fri, Apr 22, 2022 at 8:30 PM Sean Anderson sean.anderson@seco.com wrote:
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
(no changes since v1)
arch/arm/mach-k3/common.c | 2 +- arch/arm/mach-omap2/boot-common.c | 2 +- drivers/fpga/socfpga_arria10.c | 24 ++---------------------- drivers/misc/fs_loader.c | 27 +++++++++++++++++++++++++++ include/fs_loader.h | 12 ++++++++++++ 5 files changed, 43 insertions(+), 24 deletions(-)
diff --git a/arch/arm/mach-k3/common.c b/arch/arm/mach-k3/common.c index b4b75f4e6c..ec236d5a2e 100644 --- a/arch/arm/mach-k3/common.c +++ b/arch/arm/mach-k3/common.c @@ -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); }
diff --git a/arch/arm/mach-omap2/boot-common.c b/arch/arm/mach-omap2/boot-common.c index c463c96c74..88132b6572 100644 --- a/arch/arm/mach-omap2/boot-common.c +++ b/arch/arm/mach-omap2/boot-common.c @@ -212,7 +212,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); }
diff --git a/drivers/fpga/socfpga_arria10.c b/drivers/fpga/socfpga_arria10.c index 798e3a3f90..65bebd8997 100644 --- a/drivers/fpga/socfpga_arria10.c +++ b/drivers/fpga/socfpga_arria10.c @@ -765,32 +765,12 @@ int socfpga_loadfs(fpga_fs_info *fpga_fsinfo, const void *buf, size_t bsize, 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;
diff --git a/drivers/misc/fs_loader.c b/drivers/misc/fs_loader.c index 0139bd66ba..0018c930ec 100644 --- a/drivers/misc/fs_loader.c +++ b/drivers/misc/fs_loader.c @@ -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> @@ -293,6 +295,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", diff --git a/include/fs_loader.h b/include/fs_loader.h index 8de7cb18dc..5eb5b7ab4a 100644 --- a/include/fs_loader.h +++ b/include/fs_loader.h @@ -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
2.35.1.1320.gc452695387.dirty
Reviewed-by: Ramon Fried rfried.dev@gmail.com

In order to read the firmware from the filesystem, we need a file name. Read the firmware name from the device tree, using the firmware-name property. This property is commonly used in Linux to determine the correct name to use (and can be seen in several device trees in U-Boot).
Signed-off-by: Sean Anderson sean.anderson@seco.com ---
(no changes since v1)
drivers/net/fm/fm.c | 15 ++++++++++++--- drivers/net/fm/fm.h | 2 +- drivers/net/fm/init.c | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/drivers/net/fm/fm.c b/drivers/net/fm/fm.c index f825612640..aa0cc69232 100644 --- a/drivers/net/fm/fm.c +++ b/drivers/net/fm/fm.c @@ -7,6 +7,7 @@ #include <env.h> #include <malloc.h> #include <asm/io.h> +#include <dm/device_compat.h> #include <linux/errno.h> #include <u-boot/crc.h> #ifdef CONFIG_DM_ETH @@ -354,7 +355,7 @@ static void fm_init_qmi(struct fm_qmi_common *qmi)
/* Init common part of FM, index is fm num# like fm as above */ #ifdef CONFIG_TFABOOT -int fm_init_common(int index, struct ccsr_fman *reg) +int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name) { int rc; void *addr = NULL; @@ -449,7 +450,7 @@ int fm_init_common(int index, struct ccsr_fman *reg) return fm_init_bmi(index, ®->fm_bmi_common); } #else -int fm_init_common(int index, struct ccsr_fman *reg) +int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name) { int rc; #if defined(CONFIG_SYS_QE_FMAN_FW_IN_NOR) @@ -546,6 +547,8 @@ static const struct udevice_id fman_ids[] = {
static int fman_probe(struct udevice *dev) { + const char *firmware_name = NULL; + int ret; struct fman_priv *priv = dev_get_priv(dev);
priv->reg = (struct ccsr_fman *)(uintptr_t)dev_read_addr(dev); @@ -555,7 +558,13 @@ static int fman_probe(struct udevice *dev) return -EINVAL; }
- return fm_init_common(priv->fman_id, priv->reg); + ret = dev_read_string_index(dev, "firmware-name", 0, &firmware_name); + if (ret && ret != -EINVAL) { + dev_dbg(dev, "Could not read firmware-name\n"); + return ret; + } + + return fm_init_common(priv->fman_id, priv->reg, firmware_name); }
static int fman_remove(struct udevice *dev) diff --git a/drivers/net/fm/fm.h b/drivers/net/fm/fm.h index 2379b3a11c..32de5cf2b6 100644 --- a/drivers/net/fm/fm.h +++ b/drivers/net/fm/fm.h @@ -108,7 +108,7 @@ struct fm_port_global_pram {
void *fm_muram_alloc(int fm_idx, size_t size, ulong align); void *fm_muram_base(int fm_idx); -int fm_init_common(int index, struct ccsr_fman *reg); +int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name); int fm_eth_initialize(struct ccsr_fman *reg, struct fm_eth_info *info); phy_interface_t fman_port_enet_if(enum fm_port port); void fman_disable_port(enum fm_port port); diff --git a/drivers/net/fm/init.c b/drivers/net/fm/init.c index 2fed64205c..a9a20931a1 100644 --- a/drivers/net/fm/init.c +++ b/drivers/net/fm/init.c @@ -93,7 +93,7 @@ int fm_standard_init(struct bd_info *bis) struct ccsr_fman *reg;
reg = (void *)CONFIG_SYS_FSL_FM1_ADDR; - if (fm_init_common(0, reg)) + if (fm_init_common(0, reg, NULL)) return 0;
for (i = 0; i < ARRAY_SIZE(fm_info); i++) { @@ -103,7 +103,7 @@ int fm_standard_init(struct bd_info *bis)
#if (CONFIG_SYS_NUM_FMAN == 2) reg = (void *)CONFIG_SYS_FSL_FM2_ADDR; - if (fm_init_common(1, reg)) + if (fm_init_common(1, reg, NULL)) return 0;
for (i = 0; i < ARRAY_SIZE(fm_info); i++) {

On Fri, Apr 22, 2022 at 8:30 PM Sean Anderson sean.anderson@seco.com wrote:
In order to read the firmware from the filesystem, we need a file name. Read the firmware name from the device tree, using the firmware-name property. This property is commonly used in Linux to determine the correct name to use (and can be seen in several device trees in U-Boot).
Signed-off-by: Sean Anderson sean.anderson@seco.com
(no changes since v1)
drivers/net/fm/fm.c | 15 ++++++++++++--- drivers/net/fm/fm.h | 2 +- drivers/net/fm/init.c | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/drivers/net/fm/fm.c b/drivers/net/fm/fm.c index f825612640..aa0cc69232 100644 --- a/drivers/net/fm/fm.c +++ b/drivers/net/fm/fm.c @@ -7,6 +7,7 @@ #include <env.h> #include <malloc.h> #include <asm/io.h> +#include <dm/device_compat.h> #include <linux/errno.h> #include <u-boot/crc.h> #ifdef CONFIG_DM_ETH @@ -354,7 +355,7 @@ static void fm_init_qmi(struct fm_qmi_common *qmi)
/* Init common part of FM, index is fm num# like fm as above */ #ifdef CONFIG_TFABOOT -int fm_init_common(int index, struct ccsr_fman *reg) +int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name) { int rc; void *addr = NULL; @@ -449,7 +450,7 @@ int fm_init_common(int index, struct ccsr_fman *reg) return fm_init_bmi(index, ®->fm_bmi_common); } #else -int fm_init_common(int index, struct ccsr_fman *reg) +int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name) { int rc; #if defined(CONFIG_SYS_QE_FMAN_FW_IN_NOR) @@ -546,6 +547,8 @@ static const struct udevice_id fman_ids[] = {
static int fman_probe(struct udevice *dev) {
const char *firmware_name = NULL;
int ret; struct fman_priv *priv = dev_get_priv(dev); priv->reg = (struct ccsr_fman *)(uintptr_t)dev_read_addr(dev);
@@ -555,7 +558,13 @@ static int fman_probe(struct udevice *dev) return -EINVAL; }
return fm_init_common(priv->fman_id, priv->reg);
ret = dev_read_string_index(dev, "firmware-name", 0, &firmware_name);
if (ret && ret != -EINVAL) {
dev_dbg(dev, "Could not read firmware-name\n");
return ret;
}
return fm_init_common(priv->fman_id, priv->reg, firmware_name);
}
static int fman_remove(struct udevice *dev) diff --git a/drivers/net/fm/fm.h b/drivers/net/fm/fm.h index 2379b3a11c..32de5cf2b6 100644 --- a/drivers/net/fm/fm.h +++ b/drivers/net/fm/fm.h @@ -108,7 +108,7 @@ struct fm_port_global_pram {
void *fm_muram_alloc(int fm_idx, size_t size, ulong align); void *fm_muram_base(int fm_idx); -int fm_init_common(int index, struct ccsr_fman *reg); +int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name); int fm_eth_initialize(struct ccsr_fman *reg, struct fm_eth_info *info); phy_interface_t fman_port_enet_if(enum fm_port port); void fman_disable_port(enum fm_port port); diff --git a/drivers/net/fm/init.c b/drivers/net/fm/init.c index 2fed64205c..a9a20931a1 100644 --- a/drivers/net/fm/init.c +++ b/drivers/net/fm/init.c @@ -93,7 +93,7 @@ int fm_standard_init(struct bd_info *bis) struct ccsr_fman *reg;
reg = (void *)CONFIG_SYS_FSL_FM1_ADDR;
if (fm_init_common(0, reg))
if (fm_init_common(0, reg, NULL)) return 0; for (i = 0; i < ARRAY_SIZE(fm_info); i++) {
@@ -103,7 +103,7 @@ int fm_standard_init(struct bd_info *bis)
#if (CONFIG_SYS_NUM_FMAN == 2) reg = (void *)CONFIG_SYS_FSL_FM2_ADDR;
if (fm_init_common(1, reg))
if (fm_init_common(1, reg, NULL)) return 0; for (i = 0; i < ARRAY_SIZE(fm_info); i++) {
-- 2.35.1.1320.gc452695387.dirty
Reviewed-by: Ramon Fried rfried.dev@gmail.com

This adds a new method to load Fman firmware from a filesystem. This allows users to use regular files instead of hard-coded offsets for the firmware.
Signed-off-by: Sean Anderson sean.anderson@seco.com ---
(no changes since v1)
drivers/net/fm/fm.c | 25 ++++++++++++++++++++++++- drivers/qe/Kconfig | 4 ++++ 2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/drivers/net/fm/fm.c b/drivers/net/fm/fm.c index aa0cc69232..39b939cb97 100644 --- a/drivers/net/fm/fm.c +++ b/drivers/net/fm/fm.c @@ -5,6 +5,7 @@ */ #include <common.h> #include <env.h> +#include <fs_loader.h> #include <malloc.h> #include <asm/io.h> #include <dm/device_compat.h> @@ -453,7 +454,29 @@ int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name) int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name) { int rc; -#if defined(CONFIG_SYS_QE_FMAN_FW_IN_NOR) +#if defined(CONFIG_SYS_QE_FMAN_FW_IN_FS) + struct udevice *fs_loader; + void *addr = malloc(CONFIG_SYS_QE_FMAN_FW_LENGTH); + + if (!addr) + return -ENOMEM; + + rc = get_fs_loader(&fs_loader); + if (rc) { + debug("could not get fs loader: %d\n", rc); + return rc; + } + + if (!firmware_name) + firmware_name = "fman.itb"; + + rc = request_firmware_into_buf(fs_loader, firmware_name, addr, + CONFIG_SYS_QE_FMAN_FW_LENGTH, 0); + if (rc < 0) { + debug("could not request %s: %d\n", firmware_name, rc); + return rc; + } +#elif defined(CONFIG_SYS_QE_FMAN_FW_IN_NOR) void *addr = (void *)CONFIG_SYS_FMAN_FW_ADDR; #elif defined(CONFIG_SYS_QE_FMAN_FW_IN_NAND) size_t fw_length = CONFIG_SYS_QE_FMAN_FW_LENGTH; diff --git a/drivers/qe/Kconfig b/drivers/qe/Kconfig index c44a81f69a..89a75c175b 100644 --- a/drivers/qe/Kconfig +++ b/drivers/qe/Kconfig @@ -27,6 +27,10 @@ choice depends on FMAN_ENET || QE default SYS_QE_FMAN_FW_IN_ROM
+config SYS_QE_FMAN_FW_IN_FS + depends on FS_LOADER && FMAN_ENET + bool "Filesystem" + config SYS_QE_FMAN_FW_IN_NOR bool "NOR flash"

On Fri, Apr 22, 2022 at 8:30 PM Sean Anderson sean.anderson@seco.com wrote:
This adds a new method to load Fman firmware from a filesystem. This allows users to use regular files instead of hard-coded offsets for the firmware.
Signed-off-by: Sean Anderson sean.anderson@seco.com
(no changes since v1)
drivers/net/fm/fm.c | 25 ++++++++++++++++++++++++- drivers/qe/Kconfig | 4 ++++ 2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/drivers/net/fm/fm.c b/drivers/net/fm/fm.c index aa0cc69232..39b939cb97 100644 --- a/drivers/net/fm/fm.c +++ b/drivers/net/fm/fm.c @@ -5,6 +5,7 @@ */ #include <common.h> #include <env.h> +#include <fs_loader.h> #include <malloc.h> #include <asm/io.h> #include <dm/device_compat.h> @@ -453,7 +454,29 @@ int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name) int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name) { int rc; -#if defined(CONFIG_SYS_QE_FMAN_FW_IN_NOR) +#if defined(CONFIG_SYS_QE_FMAN_FW_IN_FS)
struct udevice *fs_loader;
void *addr = malloc(CONFIG_SYS_QE_FMAN_FW_LENGTH);
if (!addr)
return -ENOMEM;
rc = get_fs_loader(&fs_loader);
if (rc) {
debug("could not get fs loader: %d\n", rc);
return rc;
}
if (!firmware_name)
firmware_name = "fman.itb";
rc = request_firmware_into_buf(fs_loader, firmware_name, addr,
CONFIG_SYS_QE_FMAN_FW_LENGTH, 0);
if (rc < 0) {
debug("could not request %s: %d\n", firmware_name, rc);
return rc;
}
+#elif defined(CONFIG_SYS_QE_FMAN_FW_IN_NOR) void *addr = (void *)CONFIG_SYS_FMAN_FW_ADDR; #elif defined(CONFIG_SYS_QE_FMAN_FW_IN_NAND) size_t fw_length = CONFIG_SYS_QE_FMAN_FW_LENGTH; diff --git a/drivers/qe/Kconfig b/drivers/qe/Kconfig index c44a81f69a..89a75c175b 100644 --- a/drivers/qe/Kconfig +++ b/drivers/qe/Kconfig @@ -27,6 +27,10 @@ choice depends on FMAN_ENET || QE default SYS_QE_FMAN_FW_IN_ROM
+config SYS_QE_FMAN_FW_IN_FS
depends on FS_LOADER && FMAN_ENET
bool "Filesystem"
config SYS_QE_FMAN_FW_IN_NOR bool "NOR flash"
-- 2.35.1.1320.gc452695387.dirty
Reviewed-by: Ramon Fried rfried.dev@gmail.com

On 4/22/22 1:30 PM, Sean Anderson wrote:
This adds support for loading Fman firmware from a filesystem using the firmware loader subsystem. It was originally part of [1], but has been split off because it is conceptually separate.
[1] https://lore.kernel.org/u-boot/20220324182306.2037094-1-sean.anderson@seco.c...
Changes in v2:
- Split series into two
Sean Anderson (3): misc: fs_loader: Add function to get the chosen loader net: fm: Add firmware name parameter net: fm: Support loading firmware from a filesystem
arch/arm/mach-k3/common.c | 2 +- arch/arm/mach-omap2/boot-common.c | 2 +- drivers/fpga/socfpga_arria10.c | 24 ++----------------- drivers/misc/fs_loader.c | 27 +++++++++++++++++++++ drivers/net/fm/fm.c | 40 +++++++++++++++++++++++++++---- drivers/net/fm/fm.h | 2 +- drivers/net/fm/init.c | 4 ++-- drivers/qe/Kconfig | 4 ++++ include/fs_loader.h | 12 ++++++++++ 9 files changed, 86 insertions(+), 31 deletions(-)
ping

On Sat, Aug 13, 2022 at 9:15 AM Sean Anderson sean.anderson@seco.com wrote:
On 4/22/22 1:30 PM, Sean Anderson wrote:
This adds support for loading Fman firmware from a filesystem using the firmware loader subsystem. It was originally part of [1], but has been split off because it is conceptually separate.
[1] https://lore.kernel.org/u-boot/20220324182306.2037094-1-sean.anderson@seco.c...
Changes in v2:
- Split series into two
Sean Anderson (3): misc: fs_loader: Add function to get the chosen loader net: fm: Add firmware name parameter net: fm: Support loading firmware from a filesystem
arch/arm/mach-k3/common.c | 2 +- arch/arm/mach-omap2/boot-common.c | 2 +- drivers/fpga/socfpga_arria10.c | 24 ++----------------- drivers/misc/fs_loader.c | 27 +++++++++++++++++++++ drivers/net/fm/fm.c | 40 +++++++++++++++++++++++++++---- drivers/net/fm/fm.h | 2 +- drivers/net/fm/init.c | 4 ++-- drivers/qe/Kconfig | 4 ++++ include/fs_loader.h | 12 ++++++++++ 9 files changed, 86 insertions(+), 31 deletions(-)
ping
Pong, sorry, was lost in the mailbox.

On 8/14/22 16:48, Ramon Fried wrote:
On Sat, Aug 13, 2022 at 9:15 AM Sean Anderson sean.anderson@seco.com wrote:
On 4/22/22 1:30 PM, Sean Anderson wrote:
This adds support for loading Fman firmware from a filesystem using the firmware loader subsystem. It was originally part of [1], but has been split off because it is conceptually separate.
[1] https://lore.kernel.org/u-boot/20220324182306.2037094-1-sean.anderson@seco.c...
Changes in v2:
- Split series into two
Sean Anderson (3): misc: fs_loader: Add function to get the chosen loader net: fm: Add firmware name parameter net: fm: Support loading firmware from a filesystem
arch/arm/mach-k3/common.c | 2 +- arch/arm/mach-omap2/boot-common.c | 2 +- drivers/fpga/socfpga_arria10.c | 24 ++----------------- drivers/misc/fs_loader.c | 27 +++++++++++++++++++++ drivers/net/fm/fm.c | 40 +++++++++++++++++++++++++++---- drivers/net/fm/fm.h | 2 +- drivers/net/fm/init.c | 4 ++-- drivers/qe/Kconfig | 4 ++++ include/fs_loader.h | 12 ++++++++++ 9 files changed, 86 insertions(+), 31 deletions(-)
ping
Pong, sorry, was lost in the mailbox.
ping again
Looks like this got reviewed but never applied. Does it still apply cleanly? If not I can rebase and resend.
--Sean

On Thu, Nov 17, 2022 at 11:29 PM Sean Anderson sean.anderson@seco.com wrote:
On 8/14/22 16:48, Ramon Fried wrote:
On Sat, Aug 13, 2022 at 9:15 AM Sean Anderson sean.anderson@seco.com wrote:
On 4/22/22 1:30 PM, Sean Anderson wrote:
This adds support for loading Fman firmware from a filesystem using the firmware loader subsystem. It was originally part of [1], but has been split off because it is conceptually separate.
[1] https://lore.kernel.org/u-boot/20220324182306.2037094-1-sean.anderson@seco.c...
Changes in v2:
- Split series into two
Sean Anderson (3): misc: fs_loader: Add function to get the chosen loader net: fm: Add firmware name parameter net: fm: Support loading firmware from a filesystem
arch/arm/mach-k3/common.c | 2 +- arch/arm/mach-omap2/boot-common.c | 2 +- drivers/fpga/socfpga_arria10.c | 24 ++----------------- drivers/misc/fs_loader.c | 27 +++++++++++++++++++++ drivers/net/fm/fm.c | 40 +++++++++++++++++++++++++++---- drivers/net/fm/fm.h | 2 +- drivers/net/fm/init.c | 4 ++-- drivers/qe/Kconfig | 4 ++++ include/fs_loader.h | 12 ++++++++++ 9 files changed, 86 insertions(+), 31 deletions(-)
ping
Pong, sorry, was lost in the mailbox.
ping again
Looks like this got reviewed but never applied. Does it still apply cleanly? If not I can rebase and resend.
Tom ?
--Sean

On Sun, Nov 27, 2022 at 12:47:37AM +0200, Ramon Fried wrote:
On Thu, Nov 17, 2022 at 11:29 PM Sean Anderson sean.anderson@seco.com wrote:
On 8/14/22 16:48, Ramon Fried wrote:
On Sat, Aug 13, 2022 at 9:15 AM Sean Anderson sean.anderson@seco.com wrote:
On 4/22/22 1:30 PM, Sean Anderson wrote:
This adds support for loading Fman firmware from a filesystem using the firmware loader subsystem. It was originally part of [1], but has been split off because it is conceptually separate.
[1] https://lore.kernel.org/u-boot/20220324182306.2037094-1-sean.anderson@seco.c...
Changes in v2:
- Split series into two
Sean Anderson (3): misc: fs_loader: Add function to get the chosen loader net: fm: Add firmware name parameter net: fm: Support loading firmware from a filesystem
arch/arm/mach-k3/common.c | 2 +- arch/arm/mach-omap2/boot-common.c | 2 +- drivers/fpga/socfpga_arria10.c | 24 ++----------------- drivers/misc/fs_loader.c | 27 +++++++++++++++++++++ drivers/net/fm/fm.c | 40 +++++++++++++++++++++++++++---- drivers/net/fm/fm.h | 2 +- drivers/net/fm/init.c | 4 ++-- drivers/qe/Kconfig | 4 ++++ include/fs_loader.h | 12 ++++++++++ 9 files changed, 86 insertions(+), 31 deletions(-)
ping
Pong, sorry, was lost in the mailbox.
ping again
Looks like this got reviewed but never applied. Does it still apply cleanly? If not I can rebase and resend.
Tom ?
I don't see a problem with this. I see in patchwork it's assigned to Marek and "Under Review", which I don't recall doing, so, are you looking at these currently Marek?
participants (3)
-
Ramon Fried
-
Sean Anderson
-
Tom Rini