Generic firmware loader
v6 cover Generic firmware loader
From: Tien Fong Chee <[email protected]>
This patchset contains generic firmware loader which is very close to Linux firmware loader but for U-Boot framework. Generic firmware loader can be used load whatever into target location, and then consumer driver would use it to program whatever, ie. the FPGA. This version mainly resolved comments from Lothar Waßmann in [v5].
This series is working on top of u-boot.git -
http://git.denx.de/u-boot.git .
[v5]: https://www.mail-archive.com/u-boot at lists.denx.de/msg272771.html
v5 -> v6 changes:
-----------------
- Return error code when fs_read is fail.
- Return actual read size when fs_read is success.
Patchset history
----------------
[v1]: https://www.mail-archive.com/u-boot at lists.denx.de/msg271905.html [v2]: https://www.mail-archive.com/u-boot at lists.denx.de/msg271979.html [v3]: https://www.mail-archive.com/u-boot at lists.denx.de/msg272039.html [v4]: https://www.mail-archive.com/u-boot at lists.denx.de/msg272432.html
Tien Fong Chee (2):
spl: Remove static declaration on spl_mmc_find_device function
common: Generic firmware loader for file system
common/Makefile | 1 + common/fs_loader.c | 309 +++++++++++++++++++++++++++++++++++++++++++++ common/spl/spl_mmc.c | 2 +- doc/README.firmware_loader | 76 +++++++++++ include/fs_loader.h | 28 ++++ include/spl.h | 2 + 6 files changed, 417 insertions(+), 1 deletion(-) create mode 100644 common/fs_loader.c create mode 100644 doc/README.firmware_loader create mode 100644 include/fs_loader.h
Signature · 1 line
2.2.0
PATCH v6 1/2 spl: Remove static declaration on spl_mmc_find_device function
From: Tien Fong Chee <[email protected]>
This patch removes the static declation on spl_mmc_find_device_function so this function is accessible by the caller from other file. This patch is required for later patch.
--- common/spl/spl_mmc.c | 2 +- include/spl.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-)
common/spl/spl_mmc.c +1 -1
@@ -114,7 +114,7 @@ static int spl_mmc_get_device_index(u32 boot_device)return -ENODEV ; } -static int spl_mmc_find_device (struct mmc **mmcp,u32 boot_device) +int spl_mmc_find_device (struct mmc **mmcp,u32 boot_device) {#if CONFIG_IS_ENABLED (DM_MMC )struct udevice *dev;
include/spl.h +2 -0
@@ -10,6 +10,7 @@/* Platform-specific defines */ #include <linux/compiler.h> #include <asm/spl.h> +#include <mmc.h> /* Value in r0 indicates we booted from U-Boot */ #define UBOOT_NOT_LOADED_FROM_SPL 0x13578642
@@ -72,6 +73,7 @@ void preloader_console_init(void);u32 spl_boot_device (void );u32 spl_boot_mode (const u32 boot_device);void spl_set_bd (void ); +int spl_mmc_find_device (struct mmc **mmcp,u32 boot_device);/** * spl_set_header_raw_uboot() - Set up a standard SPL image structure
Signature · 1 line
2.2.0
PATCH v6 1/2 spl: Remove static declaration on spl_mmc_find_device function
Quoted 7 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This patch removes the static declation on
spl_mmc_find_device_functionso this function is accessible by the caller from other file. This patch is required for later patch.Signed-off-by Tien Fong Chee <[email protected]>
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: not available URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180115/e763b240/attachment.sig>
PATCH v6 2/2 common: Generic firmware loader for file system
In reply to tien.fong.chee at intel.comFrom: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever, ie. the FPGA device.
--- common/Makefile | 1 + common/fs_loader.c | 309 +++++++++++++++++++++++++++++++++++++++++++++ doc/README.firmware_loader | 76 +++++++++++ include/fs_loader.h | 28 ++++ 4 files changed, 414 insertions(+) create mode 100644 common/fs_loader.c create mode 100644 doc/README.firmware_loader create mode 100644 include/fs_loader.h
common/Makefile +1 -0
@@ -130,3 +130,4 @@ obj-$(CONFIG_CMD_DFU) += dfu.o obj-y += command.o obj-y += s_record.o obj-y += xyzModem.o +obj-y += fs_loader.o
common/fs_loader.c new file +309 -0
309 lines not on this page · raw message
doc/README.firmware_loader new file +76 -0
76 lines not on this page · raw message
include/fs_loader.h new file +28 -0
@@ -0,0 +1,28 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/ +#ifndef _FS_LOADER_H_ +#define _FS_LOADER_H_ + +#include <linux/types.h> + +struct firmware { +size_t size;/* Size of a file */ +const u8 *data;/* Buffer for file */ +void *priv;/* Firmware loader private fields */ +}; + +struct device_location { +char *name;/* Such as mmc, usb,and sata. */ +char *devpart;/* Use the load command dev:part conventions */ +char *mtdpart;/* MTD partition for ubi part */ +char *ubivol;/* UBI volume-name for ubifsmount */ +}; + +int request_firmware_into_buf (struct firmware **firmware_p, +const char *name, +struct device_location *location, +void *buf,size_t size,u32 offset); +#endif
Signature · 1 line
2.2.0
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 8 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever, ie. the FPGA device.
Signed-off-by Tien Fong Chee <[email protected]>
Please add Lothar's Reviewed-by for v7. There's a number of minor checkpatch.pl issues that checkpatch.pl can in turn fixup itself, please correct them.
[snip]
common/Makefile obj-$(CONFIG_CMD_DFU) += dfu.o · line 133
Quoted 9 lines
common/Makefile +1
-0@@ -130,3 +130,4 @@ obj-$(CONFIG_CMD_DFU) += dfu.o obj-y += command.o obj-y += s_record.o obj-y += xyzModem.o +obj-y += fs_loader.o
This needs a new Kconfig option and not to be enabled globally, only when needed.
Quoted 11 lines
common/fs_loader.c new file +5
-0@@ -0,0 +1,309 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/
common/fs_loader.c line 15
Quoted 10 lines
common/fs_loader.c new file +10
-0+ +#include <common.h> +#include <errno.h> +#include <fs.h> +#include <fs_loader.h> +#include <nand.h> +#include <sata.h> +#include <spi.h> +#include <spi_flash.h> +#include <spl.h>
This wants <asm/spl.h> which is not globally available, so you need to come up with something here. At least making this Kconfig-enabled will be a start and perhaps OK for now.
[snip]
common/fs_loader.c line 266
Quoted 3 lines
common/fs_loader.c new file +3
-0+if (ret) { +printf ("Error: %d Failed to read %s from flash %lld != %d.\n" , + ret, fw_priv->name, actread, firmware_p->size);
The last %d needs to be %zu since it's a size_t, for portability.
Thanks!
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: not available URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180115/306c2eb2/attachment.sig>
Chee
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 11 lines · Tom Rini
Quoted 8 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever, ie. the FPGA device.
Quoted 6 lines
Quoted 1 line
Signed-off-by Tien Fong Chee <[email protected]>Please add Lothar's Reviewed-by for v7. There's a number of minor checkpatch.pl issues that checkpatch.pl can in turn fixup itself, please
correct them.
I have ran the checkpatch.pl on this patch, i didn't see any error.
Quoted 14 lines
[snip]
Quoted 10 lines
common/Makefile +0
-0@@ -130,3 +130,4 @@ obj-$(CONFIG_CMD_DFU) += dfu.oobj-y += command.o
obj-y += s_record.o
obj-y += xyzModem.o
+obj-y += fs_loader.oThis needs a new
Kconfigoption and not to be enabled globally, only when needed.
Okay.
Quoted 19 lines
Quoted 19 lines
common/fs_loader.c new file +12
-0@@ -0,0 +1,309 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/ + +#include <common.h> +#include <errno.h> +#include <fs.h> +#include <fs_loader.h> +#include <nand.h> +#include <sata.h>
Quoted 9 lines
common/fs_loader.c line 15
Quoted 3 lines
common/fs_loader.c new file +3
-0+#include <spi.h> +#include <spi_flash.h> +#include <spl.h> This wants <
asm/spl.h> which is not globally available, so you need to
come up with something here. At least making this Kconfig-enabled will
be a start and perhaps OK for now.
I can enable the Kconfig, and put the caution about dependency on <asm/spl.h> in document.
Quoted 11 lines
[snip]
Quoted 6 lines
common/fs_loader.c new file +2
-0+if (ret) { + printf("Error: %d Failed to read %s from flash%lld != %d.\n",
common/fs_loader.c new file +1
-0+ ret, fw_priv->name, actread, firmware_p-Quoted 1 line
size);
The last %d needs to be %zu since it's a
size_t, for portability.Thanks!
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 12 lines · Tien Fong
Quoted 11 lines · Tom Rini
Quoted 8 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever, ie. the FPGA device.
Quoted 7 lines
Quoted 6 lines
Quoted 1 line
Signed-off-by Tien Fong Chee <[email protected]>Please add Lothar's Reviewed-by for v7. There's a number of minor checkpatch.pl issues that checkpatch.pl can in turn fixup itself, please
correct them.I have ran the checkpatch.pl on this patch, i didn't see any error.
When I ran it, it was pointing out cases where you have:
if (foo->bar != NULL)
when you can just use:
if (foo->bar)
[snip]
Quoted 27 lines
Quoted 18 lines
Quoted 18 lines
common/fs_loader.c new file +12
-0@@ -0,0 +1,309 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/ + +#include <common.h> +#include <errno.h> +#include <fs.h> +#include <fs_loader.h> +#include <nand.h> +#include <sata.h> Quoted 9 lines
common/fs_loader.c line 15
Quoted 3 lines
common/fs_loader.c new file +3
-0+#include <spi.h> +#include <spi_flash.h> +#include <spl.h> This wants <
asm/spl.h> which is not globally available, so you need to
come up with something here. At least making this Kconfig-enabled will
be a start and perhaps OK for now.
Quoted 2 lines
I can enable the
Kconfig, and put the caution about dependency on <asm/spl.h> in document.
Well, you need to make that part of the code depend on CONFIG_SPL as SPL
support requires <asm/spl.h> to exist. Perhaps part of the code needs
to be refactored to more easily deal with SPL not always being present?
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: not available URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180116/bde7fd01/attachment.sig>
Chee
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 25 lines · Tom Rini
Quoted 24 lines · Tien Fong
Quoted 22 lines · Tom Rini
Quoted 11 lines · tien.fong.chee at intel.co m
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever,
ie. the FPGA device.Signed-off-by Tien Fong Chee <[email protected]>Please add Lothar's Reviewed-by for v7. There's a number of minor
checkpatch.pl issues that checkpatch.pl can in turn fixup itself, please
correct them.
Quoted 6 lines
Quoted 1 line
I have ran the checkpatch.pl on this patch, i didn't see any error.
When I ran it, it was pointing out cases where you have:
if (foo->bar!= NULL)
when you can just use:
if (foo->bar)
It's weird for checkpatch.pl not showing the same. I would fix the code with above example.
Quoted 33 lines
[snip]
Quoted 32 lines
Quoted 32 lines
Quoted 14 lines
common/fs_loader.c new file +5
-0@@ -0,0 +1,309 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/ common/fs_loader.c line 15
Quoted 10 lines
common/fs_loader.c new file +10
-0+ +#include <common.h> +#include <errno.h> +#include <fs.h> +#include <fs_loader.h> +#include <nand.h> +#include <sata.h> +#include <spi.h> +#include <spi_flash.h> +#include <spl.h> This wants <
asm/spl.h> which is not globally available, so you need
to
come up with something here. At least making this Kconfig- enabled
will
be a start and perhaps OK for now.
Quoted 9 lines
Quoted 2 lines
I can enable the
Kconfig, and put the caution about dependency on <asm/spl.h> in document.Well, you need to make that part of the code depend on
CONFIG_SPLas SPL
support requires <asm/spl.h> to exist. Perhaps part of the code needs
to be refactored to more easily deal with SPL not always being present?
How about i just move the whole enum { } from line 17 to line 35 in asm/spl.h to fs.h, and then enum{} above replaced with #include <fs.h>?
asm/spl.h
----------
#if defined(CONFIG_ARCH_OMAP2PLUS) \ || defined(CONFIG_EXYNOS4) || defined(CONFIG_EXYNOS5) \ || defined(CONFIG_EXYNOS4210)
/* Platform-specific defines */
#include <asm/arch/spl.h>
#else
#include <fs.h> <-- replacement
#endif
[...]
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 26 lines · Tien Fong
Quoted 25 lines · Tom Rini
Quoted 24 lines · Tien Fong
Quoted 22 lines · Tom Rini
Quoted 11 lines · tien.fong.chee at intel.co m
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever,
ie. the FPGA device.Signed-off-by Tien Fong Chee <[email protected]>Please add Lothar's Reviewed-by for v7. There's a number of minor
checkpatch.pl issues that checkpatch.pl can in turn fixup itself, please
correct them.
Quoted 8 lines
Quoted 6 lines
Quoted 1 line
I have ran the checkpatch.pl on this patch, i didn't see any error.
When I ran it, it was pointing out cases where you have:
if (foo->bar!= NULL)
when you can just use:
if (foo->bar)It's weird for checkpatch.pl not showing the same. I would fix the code with above example.
That is odd. Are you running it from within the U-Boot tree?
Quoted 50 lines
Quoted 33 lines
[snip]
Quoted 32 lines
Quoted 32 lines
Quoted 14 lines
common/fs_loader.c new file +5
-0@@ -0,0 +1,309 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/ common/fs_loader.c line 15
Quoted 10 lines
common/fs_loader.c new file +10
-0+ +#include <common.h> +#include <errno.h> +#include <fs.h> +#include <fs_loader.h> +#include <nand.h> +#include <sata.h> +#include <spi.h> +#include <spi_flash.h> +#include <spl.h> This wants <
asm/spl.h> which is not globally available, so you need
to
come up with something here. At least making this Kconfig- enabled
will
be a start and perhaps OK for now.Quoted 9 lines
Quoted 2 lines
I can enable the
Kconfig, and put the caution about dependency on <asm/spl.h> in document.Well, you need to make that part of the code depend on
CONFIG_SPLas SPL
support requires <asm/spl.h> to exist. Perhaps part of the code needs
to be refactored to more easily deal with SPL not always being present?How about i just move the whole enum { } from line 17 to line 35 in
asm/spl.htofs.h, and then enum{} above replaced with #include <fs.h>?
asm/spl.h
----------#if defined(CONFIG_ARCH_OMAP2PLUS) \ || defined(CONFIG_EXYNOS4) || defined(CONFIG_EXYNOS5) \ || defined(CONFIG_EXYNOS4210)
Quoted 7 lines
/* Platform-specific defines */
#include <asm/arch/spl.h>#else
#include <fs.h> <-- replacement
#endif
[...]
No, because that's still arch specific code and will blow up some platforms that do not have asm/spl.h at all and is still non-portable (look at the various asm/spl.h files that do exist for how BOOT_DEVICE_xxx is handled in different places).
It's OK to restructure your code to have:
#ifdef CONFIG_SPL
#include <spl.h>
... SPL specific functions
#endif
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: not available URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180118/0ff5993c/attachment.sig>
Chee
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 42 lines · Tom Rini
Quoted 41 lines · Tien Fong
Quoted 39 lines · Tom Rini
Quoted 30 lines · Tien Fong
Quoted 19 lines · Tom Rini
On Wed, Dec 27, 2017 at 01:04:38PM +0800, tien.fong.chee at inte l.co
mQuoted 12 lines · wrote:
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load
the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever,
ie. the FPGA device.Quoted 8 lines
Quoted 1 line
Signed-off-by Tien Fong Chee <[email protected]>Please add Lothar's Reviewed-by for v7. There's a number of minor
checkpatch.pl issues that checkpatch.pl can in turn fixup itself,
please
correct them.Quoted 2 lines
I have ran the checkpatch.pl on this patch, i didn't see any error.
When I ran it, it was pointing out cases where you have:
if (foo->bar!= NULL)
when you can just use:
if (foo->bar)
Quoted 5 lines
Quoted 3 lines
It's weird for checkpatch.pl not showing the same. I would fix the code
with above example.That is odd. Are you running it from within the U-Boot tree?
Yes.
Quoted 62 lines
Quoted 62 lines
Quoted 42 lines
[snip]
Quoted 36 lines
Quoted 27 lines
Quoted 17 lines
common/fs_loader.c new file +5
-0@@ -0,0 +1,309 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/ common/fs_loader.c line 15
Quoted 10 lines
common/fs_loader.c new file +10
-0+ +#include <common.h> +#include <errno.h> +#include <fs.h> +#include <fs_loader.h> +#include <nand.h> +#include <sata.h> +#include <spi.h> +#include <spi_flash.h> +#include <spl.h> Quoted 9 lines
This wants <
asm/spl.h> which is not globally available, so you
need
to
come up with something here. At least making this Kconfig- enabled
will
be a start and perhaps OK for now.Quoted 3 lines
I can enable the
Kconfig, and put the caution about dependency on
<asm/spl.h> in document.Quoted 8 lines
Well, you need to make that part of the code depend on
CONFIG_SPLas
SPL
support requires <asm/spl.h> to exist. Perhaps part of the code needs
to be refactored to more easily deal with SPL not always being present?How about i just move the whole enum { } from line 17 to line 35 in
asm/spl.htofs.h, and then enum{} above replaced with #include <fs.h>?
asm/spl.h
----------#if defined(CONFIG_ARCH_OMAP2PLUS) \ || defined(CONFIG_EXYNOS4) || defined(CONFIG_EXYNOS5) \ || defined(CONFIG_EXYNOS4210)/* Platform-specific defines */
#include <asm/arch/spl.h>
Quoted 9 lines
Quoted 4 lines
#else
#include <fs.h> <-- replacement
#endif
[...]No, because that's still arch specific code and will blow up some platforms that do not have
asm/spl.hat all and is still non-portable (look at the variousasm/spl.hfiles that do exist for howBOOT_DEVICE_xxxis handled in different places).
Ok, you are right.
Quoted 6 lines
It's OK to restructure your code to have:
#ifdefCONFIG_SPL
#include <spl.h>
... SPL specific functions
#endif
Okay, noted.
PATCH v6 2/2 common: Generic firmware loader for file system
In reply to tien.fong.chee at intel.comOn 12/27/2017 06:04 AM, tien.fong.chee at intel.com wrote:
Whoa, this improved substantially since last time I checked. Minor nitpicks below.
[...]
common/fs_loader.c line 51
Quoted 13 lines
common/fs_loader.c new file +13
-0+/* USB build is not supported yet in SPL */ +#ifndef CONFIG_SPL_BUILD +#ifdef CONFIG_USB_STORAGE +static int init_usb(void) +{ + int err; + + err = usb_init(); + if (err) + return err; + +#ifndef CONFIG_DM_USB + err = usb_stor_scan(1) < 0 ? -ENODEV : 0;
if (err)
return err;
?
common/fs_loader.c line 59
Quoted 8 lines
common/fs_loader.c new file +8
-0+#endif + +return err; +} +#else +static int init_usb (void ) +{ +printf ("Error: Cannot load flash image: no USB support\n" );
debug() ? Fix globally ...
Quoted 15 lines
common/fs_loader.c new file +15
-0+return -ENOSYS ; +} +#endif +#endif + +#ifdef CONFIG_SATA +static int init_storage_sata (void ) +{ +return sata_probe (0 ); +} +#else +static int init_storage_sata (void ) +{ +printf ("Error: Cannot load image: no SATA support\n" ); +return -ENOSYS ;
common/fs_loader.c line 84
Quoted 10 lines
common/fs_loader.c new file +10
-0+} +#endif + +#ifdef CONFIG_CMD_UBIFS +static int mount_ubifs (struct device_location *location) +{ +int ret; +char cmd[32 ]; + +sprintf (cmd,"ubi part %s" , location->mtdpart);
snprintf() ...
Quoted 4 lines
common/fs_loader.c new file +4
-0+ ret =run_command (cmd,0 ); +if (ret) +return ret; +
common/fs_loader.c line 99
Quoted 10 lines
common/fs_loader.c new file +10
-0+sprintf (cmd,"ubifsmount %s" , location->ubivol); + + ret =run_command (cmd,0 ); + +return ret; +} + +static int umount_ubifs (void ) +{ +return run_command ("ubifsumount" ,0 );
Just call the function directly ?
Quoted 86 lines
common/fs_loader.c new file +86
-0+} +#else +static int mount_ubifs (struct device_location *location) +{ +printf ("Error: Cannot load image: no UBIFS support\n" ); +return -ENOSYS ; +} +#endif + +#if defined(CONFIG_SPL_MMC_SUPPORT ) && defined(CONFIG_SPL_BUILD ) +static int init_mmc (void ) +{ +/* Just for the case MMC is not yet initialized */ +struct mmc *mmc =NULL ; +int err; + +spl_mmc_find_device (&mmc,spl_boot_device ()); + + err =mmc_init (mmc); +if (err) { +printf ("spl: mmc init failed with error: %d\n" , err); +return err; + } + +return err; +} +#else +static int init_mmc (void ) +{ +/* Expect somewhere already initialize MMC */ +return 0 ; +} +#endif + +static int select_fs_dev (struct device_location *location) +{ +int ret; + +if (!strcmp ("mmc" , location->name)) { + ret =fs_set_blk_dev ("mmc" , location->devpart,FS_TYPE_ANY ); + }else if (!strcmp ("usb" , location->name)) { + ret =fs_set_blk_dev ("usb" , location->devpart,FS_TYPE_ANY ); + }else if (!strcmp ("sata" , location->name)) { + ret =fs_set_blk_dev ("sata" , location->devpart,FS_TYPE_ANY ); + }else if (!strcmp ("ubi" , location->name)) { +if (location->ubivol !=NULL ) + ret =fs_set_blk_dev ("ubi" ,NULL ,FS_TYPE_UBIFS ); +else + ret = -ENODEV ; + }else { +printf ("Error: unsupported location storage.\n" ); +return -ENODEV ; + } + +if (ret) +printf ("Error: could not access storage.\n" ); + +return ret; +} + +static int init_storage_device (struct device_location *location) +{ +int ret; + +if (!strcmp ("mmc" , location->name)) { + ret =init_mmc (); + }else if (!strcmp ("sata" , location->name)) { + ret =init_storage_sata (); + }else if (location->ubivol !=NULL ) { + ret =mount_ubifs (location); +#ifndef CONFIG_SPL_BUILD + /* USB build is not supported yet in SPL */ + }else if (!strcmp ("usb" , location->name)) { + ret =init_usb (); +#endif + }else { +printf ("Error: no supported storage device is available.\n" ); + ret = -ENODEV ; + } + +return ret; +} + +static void set_storage_devpart (char *name,char *devpart) +{ +size_t i;
common/fs_loader.c line 195
Quoted 10 lines
common/fs_loader.c new file +10
-0+ +for (i =0 ; i <ARRAY_SIZE (default_locations); i++) { +if (!strcmp (default_locations[i].name, name)) + default_locations[i].devpart = devpart; + } +} + +/* +* Prepare firmware struct; +* return -ve if fail.
Use kerneldoc and keep it consistent.
Quoted 6 lines
+ */
common/fs_loader.c new file +5
-0+static int _request_firmware_prepare (struct firmware **firmware_p, +const char *name,void *dbuf, +size_t size,u32 offset) +{ +struct firmware *firmware;
common/fs_loader.c line 211
Quoted 10 lines
common/fs_loader.c new file +10
-0+struct firmware_priv *fw_priv; + + *firmware_p =NULL ; + +if (!name || name[0 ] =='\0' ) +return -EINVAL ; + + firmware =calloc (1 ,sizeof (*firmware)); +if (!firmware) { +printf ("%s: calloc(struct firmware) failed\n" , __func__);
If malloc fails, you're screwed anyway and printf will likely fail too, so drop it.
Quoted 19 lines
common/fs_loader.c new file +19
-0+return -ENOMEM ; + } + + fw_priv =calloc (1 ,sizeof (*fw_priv)); +if (!fw_priv) { +printf ("%s: calloc(struct fw_priv) failed\n" , __func__); +free (firmware); +return -ENOMEM ; + } + + fw_priv->name = name; + fw_priv->offset = offset; + firmware->data = dbuf; + firmware->size = size; + firmware->priv = fw_priv; + *firmware_p = firmware; + +return 0 ; +}
[...]
Signature · 2 lines
Best regards, Marek Vasut
Chee
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 22 lines · Marek Vasut
On 12/27/2017 06:04 AM, tien.fong.chee at intel.com wrote:
Whoa, this improved substantially since last time I checked. Minor nitpicks below.
[...]
Quoted 4 lines
common/fs_loader.c new file +3
-0+/* USB build is not supported yet in SPL */ +#ifndef CONFIG_SPL_BUILD +#ifdef CONFIG_USB_STORAGE common/fs_loader.c line 51
Quoted 10 lines
common/fs_loader.c new file +10
-0+static int init_usb (void ) +{ +int err; + + err =usb_init (); +if (err) +return err; + +#ifndef CONFIG_DM_USB + err =usb_stor_scan (1 ) <0 ? -ENODEV :0 ;if (err)
Quoted 3 lines
return err;?
This is last line code of the function, so it's always return the result regardless error or not.
Quoted 12 lines
Quoted 10 lines
common/fs_loader.c new file +8
-0+#endif + +return err; +} +#else +static int init_usb (void ) +{ + printf("Error: Cannot load flash image: no USBsupport\n");
debug()? Fix globally ...
okay.
Quoted 19 lines
Quoted 19 lines
common/fs_loader.c new file +18
-0+return -ENOSYS ; +} +#endif +#endif + +#ifdef CONFIG_SATA +static int init_storage_sata (void ) +{ +return sata_probe (0 ); +} +#else +static int init_storage_sata (void ) +{ +printf ("Error: Cannot load image: no SATA support\n" ); +return -ENOSYS ; +} +#endif +
Quoted 9 lines
common/fs_loader.c line 84
Quoted 7 lines
common/fs_loader.c new file +7
-0+#ifdef CONFIG_CMD_UBIFS +static int mount_ubifs (struct device_location *location) +{ +int ret; +char cmd[32 ]; + +sprintf (cmd,"ubi part %s" , location->mtdpart);
snprintf()...
okay.
Quoted 17 lines
Quoted 5 lines
common/fs_loader.c new file +4
-0+ ret =run_command (cmd,0 ); +if (ret) +return ret; +common/fs_loader.c line 99
Quoted 10 lines
common/fs_loader.c new file +10
-0+sprintf (cmd,"ubifsmount %s" , location->ubivol); + + ret =run_command (cmd,0 ); + +return ret; +} + +static int umount_ubifs (void ) +{ +return run_command ("ubifsumount" ,0 );Just call the function directly ?
There are some checking like ubifs_initialized in the cmd/ubifs.c. Direct callng the function would bypass those checking.
Quoted 96 lines
Quoted 96 lines
common/fs_loader.c new file +21
-0+} +#else +static int mount_ubifs (struct device_location *location) +{ +printf ("Error: Cannot load image: no UBIFS support\n" ); +return -ENOSYS ; +} +#endif + +#if defined(CONFIG_SPL_MMC_SUPPORT ) && defined(CONFIG_SPL_BUILD ) +static int init_mmc (void ) +{ +/* Just for the case MMC is not yet initialized */ +struct mmc *mmc =NULL ; +int err; + +spl_mmc_find_device (&mmc,spl_boot_device ()); + + err =mmc_init (mmc); +if (err) { + printf("spl: mmc init failed with error: %d\n",err);
common/fs_loader.c new file +19
-0+ return err; + } + +return err; +} +#else +static int init_mmc (void ) +{ +/* Expect somewhere already initialize MMC */ +return 0 ; +} +#endif + +static int select_fs_dev (struct device_location *location) +{ +int ret; + +if (!strcmp ("mmc" , location->name)) { + ret = fs_set_blk_dev("mmc", location->devpart,
FS_TYPE_ANY);(quoted diff) +2
-0+ } else if (!strcmp("usb", location->name)) { + ret = fs_set_blk_dev("usb", location->devpart,
FS_TYPE_ANY);(quoted diff) +2
-0+ } else if (!strcmp("sata", location->name)) { + ret = fs_set_blk_dev("sata", location->devpart,
FS_TYPE_ANY);common/fs_loader.c new file +3
-0+ }else if (!strcmp ("ubi" , location->name)) { +if (location->ubivol !=NULL ) + ret = fs_set_blk_dev("ubi", NULL,
FS_TYPE_UBIFS);common/fs_loader.c new file +30
-0+else + ret = -ENODEV ; + }else { +printf ("Error: unsupported location storage.\n" ); +return -ENODEV ; + } + +if (ret) +printf ("Error: could not access storage.\n" ); + +return ret; +} + +static int init_storage_device (struct device_location *location) +{ +int ret; + +if (!strcmp ("mmc" , location->name)) { + ret =init_mmc (); + }else if (!strcmp ("sata" , location->name)) { + ret =init_storage_sata (); + }else if (location->ubivol !=NULL ) { + ret =mount_ubifs (location); +#ifndef CONFIG_SPL_BUILD + /* USB build is not supported yet in SPL */ + }else if (!strcmp ("usb" , location->name)) { + ret =init_usb (); +#endif + }else { + printf("Error: no supported storage device isavailable.\n");
common/fs_loader.c new file +12
-0+ ret = -ENODEV ; + } + +return ret; +} + +static void set_storage_devpart (char *name,char *devpart) +{ +size_t i; + +for (i =0 ; i <ARRAY_SIZE (default_locations); i++) { +if (!strcmp (default_locations[i].name, name))
Quoted 9 lines
common/fs_loader.c line 195
Quoted 7 lines
common/fs_loader.c new file +7
-0+ default_locations[i].devpart = devpart; + } +} + +/* +* Prepare firmware struct; +* return -ve if fail. Use kerneldoc and keep it consistent.
kerneldoc doesn't has explanation for this function, and this function is not for user. Or you means i shouldn't put the comment and description to the function here?
Quoted 13 lines
Quoted 13 lines
+ */
common/fs_loader.c new file +11
-0+static int _request_firmware_prepare (struct firmware **firmware_p, + const char *name, void *dbuf, + size_t size, u32 offset) +{ +struct firmware *firmware; +struct firmware_priv *fw_priv; + + *firmware_p =NULL ; + +if (!name || name[0 ] =='\0' ) +return -EINVAL ;
Quoted 9 lines
Quoted 5 lines
common/fs_loader.c new file +4
-0+ + firmware =calloc (1 ,sizeof (*firmware)); +if (!firmware) { + printf("%s: calloc(struct firmware) failed\n",
__func__);If malloc fails, you're screwed anyway and printf will likely fail too,
so drop it.
okay.
Quoted 22 lines
Quoted 21 lines
common/fs_loader.c new file +6
-0+return -ENOMEM ; + } + + fw_priv =calloc (1 ,sizeof (*fw_priv)); +if (!fw_priv) { + printf("%s: calloc(struct fw_priv) failed\n",
__func__);common/fs_loader.c new file +13
-0+free (firmware); +return -ENOMEM ; + } + + fw_priv->name = name; + fw_priv->offset = offset; + firmware->data = dbuf; + firmware->size = size; + firmware->priv = fw_priv; + *firmware_p = firmware; + +return 0 ; +}[...]
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 26 lines · Tien Fong
Quoted 22 lines · Marek Vasut
On 12/27/2017 06:04 AM, tien.fong.chee at intel.com wrote:
Whoa, this improved substantially since last time I checked. Minor nitpicks below.
[...]
Quoted 4 lines
common/fs_loader.c new file +3
-0+/* USB build is not supported yet in SPL */ +#ifndef CONFIG_SPL_BUILD +#ifdef CONFIG_USB_STORAGE common/fs_loader.c line 51
Quoted 10 lines
common/fs_loader.c new file +10
-0+static int init_usb (void ) +{ +int err; + + err =usb_init (); +if (err) +return err; + +#ifndef CONFIG_DM_USB + err =usb_stor_scan (1 ) <0 ? -ENODEV :0 ;if (err)
Quoted 3 lines
return err;?
Quoted 2 lines
This is last line code of the function, so it's always return the result regardless error or not.
You are rewriting the true error code with -ENODEV instead of propagating it.
Quoted 59 lines
Quoted 12 lines
Quoted 10 lines
common/fs_loader.c new file +8
-0+#endif + +return err; +} +#else +static int init_usb (void ) +{ + printf("Error: Cannot load flash image: no USBsupport\n");
debug()? Fix globally ...okay.
Quoted 19 lines
Quoted 19 lines
common/fs_loader.c new file +18
-0+return -ENOSYS ; +} +#endif +#endif + +#ifdef CONFIG_SATA +static int init_storage_sata (void ) +{ +return sata_probe (0 ); +} +#else +static int init_storage_sata (void ) +{ +printf ("Error: Cannot load image: no SATA support\n" ); +return -ENOSYS ; +} +#endif +Quoted 9 lines
common/fs_loader.c line 84
Quoted 7 lines
common/fs_loader.c new file +7
-0+#ifdef CONFIG_CMD_UBIFS +static int mount_ubifs (struct device_location *location) +{ +int ret; +char cmd[32 ]; + +sprintf (cmd,"ubi part %s" , location->mtdpart);
snprintf()...okay.
Quoted 17 lines
Quoted 5 lines
common/fs_loader.c new file +4
-0+ ret =run_command (cmd,0 ); +if (ret) +return ret; +common/fs_loader.c line 99
Quoted 10 lines
common/fs_loader.c new file +10
-0+sprintf (cmd,"ubifsmount %s" , location->ubivol); + + ret =run_command (cmd,0 ); + +return ret; +} + +static int umount_ubifs (void ) +{ +return run_command ("ubifsumount" ,0 );Just call the function directly ?
Quoted 2 lines
There are some checking like
ubifs_initializedin thecmd/ubifs.c. Direct callng the function would bypass those checking.
Then factor those out into a function you can all and call that function.
Quoted 105 lines
Quoted 96 lines
Quoted 96 lines
common/fs_loader.c new file +21
-0+} +#else +static int mount_ubifs (struct device_location *location) +{ +printf ("Error: Cannot load image: no UBIFS support\n" ); +return -ENOSYS ; +} +#endif + +#if defined(CONFIG_SPL_MMC_SUPPORT ) && defined(CONFIG_SPL_BUILD ) +static int init_mmc (void ) +{ +/* Just for the case MMC is not yet initialized */ +struct mmc *mmc =NULL ; +int err; + +spl_mmc_find_device (&mmc,spl_boot_device ()); + + err =mmc_init (mmc); +if (err) { + printf("spl: mmc init failed with error: %d\n",err);
common/fs_loader.c new file +19
-0+ return err; + } + +return err; +} +#else +static int init_mmc (void ) +{ +/* Expect somewhere already initialize MMC */ +return 0 ; +} +#endif + +static int select_fs_dev (struct device_location *location) +{ +int ret; + +if (!strcmp ("mmc" , location->name)) { + ret = fs_set_blk_dev("mmc", location->devpart,
FS_TYPE_ANY);(quoted diff) +2
-0+ } else if (!strcmp("usb", location->name)) { + ret = fs_set_blk_dev("usb", location->devpart,
FS_TYPE_ANY);(quoted diff) +2
-0+ } else if (!strcmp("sata", location->name)) { + ret = fs_set_blk_dev("sata", location->devpart,
FS_TYPE_ANY);common/fs_loader.c new file +3
-0+ }else if (!strcmp ("ubi" , location->name)) { +if (location->ubivol !=NULL ) + ret = fs_set_blk_dev("ubi", NULL,
FS_TYPE_UBIFS);common/fs_loader.c new file +30
-0+else + ret = -ENODEV ; + }else { +printf ("Error: unsupported location storage.\n" ); +return -ENODEV ; + } + +if (ret) +printf ("Error: could not access storage.\n" ); + +return ret; +} + +static int init_storage_device (struct device_location *location) +{ +int ret; + +if (!strcmp ("mmc" , location->name)) { + ret =init_mmc (); + }else if (!strcmp ("sata" , location->name)) { + ret =init_storage_sata (); + }else if (location->ubivol !=NULL ) { + ret =mount_ubifs (location); +#ifndef CONFIG_SPL_BUILD + /* USB build is not supported yet in SPL */ + }else if (!strcmp ("usb" , location->name)) { + ret =init_usb (); +#endif + }else { + printf("Error: no supported storage device isavailable.\n");
common/fs_loader.c new file +12
-0+ ret = -ENODEV ; + } + +return ret; +} + +static void set_storage_devpart (char *name,char *devpart) +{ +size_t i; + +for (i =0 ; i <ARRAY_SIZE (default_locations); i++) { +if (!strcmp (default_locations[i].name, name))Quoted 9 lines
common/fs_loader.c line 195
Quoted 7 lines
common/fs_loader.c new file +7
-0+ default_locations[i].devpart = devpart; + } +} + +/* +* Prepare firmware struct; +* return -ve if fail. Use kerneldoc and keep it consistent.
Quoted 3 lines
kerneldoc doesn't has explanation for this function, and this function is not for user. Or you means i shouldn't put the comment and description to the function here?
Kerneldoc specifies the format of the comment, so that documentation can be generated from it. If you document functions, use that format.
Quoted 45 lines
Quoted 13 lines
Quoted 13 lines
+ */
common/fs_loader.c new file +11
-0+static int _request_firmware_prepare (struct firmware **firmware_p, + const char *name, void *dbuf, + size_t size, u32 offset) +{ +struct firmware *firmware; +struct firmware_priv *fw_priv; + + *firmware_p =NULL ; + +if (!name || name[0 ] =='\0' ) +return -EINVAL ;Quoted 9 lines
Quoted 5 lines
common/fs_loader.c new file +4
-0+ + firmware =calloc (1 ,sizeof (*firmware)); +if (!firmware) { + printf("%s: calloc(struct firmware) failed\n",
__func__);If malloc fails, you're screwed anyway and printf will likely fail too,
so drop it.okay.
Quoted 22 lines
Quoted 21 lines
common/fs_loader.c new file +6
-0+return -ENOMEM ; + } + + fw_priv =calloc (1 ,sizeof (*fw_priv)); +if (!fw_priv) { + printf("%s: calloc(struct fw_priv) failed\n",
__func__);common/fs_loader.c new file +13
-0+free (firmware); +return -ENOMEM ; + } + + fw_priv->name = name; + fw_priv->offset = offset; + firmware->data = dbuf; + firmware->size = size; + firmware->priv = fw_priv; + *firmware_p = firmware; + +return 0 ; +}[...]
Signature · 2 lines
Best regards, Marek Vasut
Chee
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 31 lines · Marek Vasut
Quoted 30 lines · Tien Fong
Quoted 28 lines · Marek Vasut
On 12/27/2017 06:04 AM, tien.fong.chee at intel.com wrote:
Whoa, this improved substantially since last time I checked. Minor
nitpicks below.[...]
Quoted 5 lines
common/fs_loader.c new file +3
-0+/* USB build is not supported yet in SPL */ +#ifndef CONFIG_SPL_BUILD +#ifdef CONFIG_USB_STORAGE common/fs_loader.c line 51
Quoted 10 lines
common/fs_loader.c new file +10
-0+static int init_usb (void ) +{ +int err; + + err =usb_init (); +if (err) +return err; + +#ifndef CONFIG_DM_USB + err =usb_stor_scan (1 ) <0 ? -ENODEV :0 ;if (err)
return err;?
Quoted 5 lines
Quoted 2 lines
This is last line code of the function, so it's always return the result regardless error or not.
You are rewriting the true error code with
-ENODEVinstead of propagating it.
Ohh....are you saying to change the codes as shown in below:
err = usb_stor_scan(1);
if (err)
return err;
Quoted 65 lines
Quoted 65 lines
Quoted 14 lines
Quoted 11 lines
common/fs_loader.c new file +8
-0+#endif + +return err; +} +#else +static int init_usb (void ) +{ + printf("Error: Cannot load flash image: no USBQuoted 1 line
support\n");
debug()? Fix globally ...okay.
Quoted 21 lines
Quoted 21 lines
common/fs_loader.c new file +18
-0+return -ENOSYS ; +} +#endif +#endif + +#ifdef CONFIG_SATA +static int init_storage_sata (void ) +{ +return sata_probe (0 ); +} +#else +static int init_storage_sata (void ) +{ +printf ("Error: Cannot load image: no SATA support\n" ); +return -ENOSYS ; +} +#endif +Quoted 9 lines
common/fs_loader.c line 84
Quoted 7 lines
common/fs_loader.c new file +7
-0+#ifdef CONFIG_CMD_UBIFS +static int mount_ubifs (struct device_location *location) +{ +int ret; +char cmd[32 ]; + +sprintf (cmd,"ubi part %s" , location->mtdpart);
snprintf()...okay.
Quoted 19 lines
Quoted 7 lines
common/fs_loader.c new file +4
-0+ ret =run_command (cmd,0 ); +if (ret) +return ret; +common/fs_loader.c line 99
Quoted 10 lines
common/fs_loader.c new file +10
-0+sprintf (cmd,"ubifsmount %s" , location->ubivol); + + ret =run_command (cmd,0 ); + +return ret; +} + +static int umount_ubifs (void ) +{ +return run_command ("ubifsumount" ,0 );Just call the function directly ?
Quoted 5 lines
Quoted 2 lines
There are some checking like
ubifs_initializedin thecmd/ubifs.c. Direct callng the function would bypass those checking.Then factor those out into a function you can all and call that function.
Just for curious, is it worth to factor those into a function? Does it help to boost the performance or for other purpose?
Quoted 115 lines
Quoted 115 lines
Quoted 115 lines
Quoted 107 lines
common/fs_loader.c new file +5
-0+} +#else +static int mount_ubifs (struct device_location *location) +{ + printf("Error: Cannot load image: no UBIFSsupport\n");
common/fs_loader.c new file +5
-0+return -ENOSYS ; +} +#endif + +#if defined(CONFIG_SPL_MMC_SUPPORT) &&
defined(CONFIG_SPL_BUILD)common/fs_loader.c new file +11
-0+static int init_mmc (void ) +{ +/* Just for the case MMC is not yet initialized */ +struct mmc *mmc =NULL ; +int err; + +spl_mmc_find_device (&mmc,spl_boot_device ()); + + err =mmc_init (mmc); +if (err) { + printf("spl: mmc init failed with error:%d\n",
err);common/fs_loader.c new file +19
-0+ return err; + } + +return err; +} +#else +static int init_mmc (void ) +{ +/* Expect somewhere already initialize MMC */ +return 0 ; +} +#endif + +static int select_fs_dev (struct device_location *location) +{ +int ret; + +if (!strcmp ("mmc" , location->name)) { + ret = fs_set_blk_dev("mmc", location->devpart,
FS_TYPE_ANY);(quoted diff) +2
-0+ } else if (!strcmp("usb", location->name)) { + ret = fs_set_blk_dev("usb", location->devpart,
FS_TYPE_ANY);(quoted diff) +2
-0+ } else if (!strcmp("sata", location->name)) { + ret = fs_set_blk_dev("sata", location-Quoted 1 line
devpart,
FS_TYPE_ANY);common/fs_loader.c new file +3
-0+ }else if (!strcmp ("ubi" , location->name)) { +if (location->ubivol !=NULL ) + ret = fs_set_blk_dev("ubi", NULL,
FS_TYPE_UBIFS);common/fs_loader.c new file +4
-0+else + ret = -ENODEV ; + }else { + printf("Error: unsupported locationstorage.\n");
common/fs_loader.c new file +10
-0+return -ENODEV ; + } + +if (ret) +printf ("Error: could not access storage.\n" ); + +return ret; +} + +static int init_storage_device(struct device_location*location)
common/fs_loader.c new file +16
-0+{ +int ret; + +if (!strcmp ("mmc" , location->name)) { + ret =init_mmc (); + }else if (!strcmp ("sata" , location->name)) { + ret =init_storage_sata (); + }else if (location->ubivol !=NULL ) { + ret =mount_ubifs (location); +#ifndef CONFIG_SPL_BUILD + /* USB build is not supported yet in SPL */ + }else if (!strcmp ("usb" , location->name)) { + ret =init_usb (); +#endif + }else { + printf("Error: no supported storage device isavailable.\n");
common/fs_loader.c new file +13
-0+ ret = -ENODEV ; + } + +return ret; +} + +static void set_storage_devpart (char *name,char *devpart) +{ +size_t i; + +for (i =0 ; i <ARRAY_SIZE (default_locations); i++) { +if (!strcmp (default_locations[i].name, name)) + default_locations[i].devpart =devpart;
common/fs_loader.c line 195
Quoted 6 lines
common/fs_loader.c new file +6
-0+ } +} + +/* +* Prepare firmware struct; +* return -ve if fail. Use kerneldoc and keep it consistent.
Quoted 8 lines
Quoted 4 lines
kerneldoc doesn't has explanation for this function, and this function
is not for user. Or you means i shouldn't put the comment and description to the function here?Kerneldoc specifies the format of the comment, so that documentation can
be generated from it. If you document functions, use that format.
Okay.
Quoted 54 lines
Quoted 53 lines
Quoted 19 lines
Quoted 19 lines
+ */
+static int _request_firmware_prepare(struct firmware **firmware_p,(quoted diff) +1
-0+ const char *name, void*dbuf,
common/fs_loader.c new file +10
-0+ size_t size, u32 offset) +{ +struct firmware *firmware; +struct firmware_priv *fw_priv; + + *firmware_p =NULL ; + +if (!name || name[0 ] =='\0' ) +return -EINVAL ; +Quoted 9 lines
Quoted 4 lines
common/fs_loader.c new file +3
-0+ firmware =calloc (1 ,sizeof (*firmware)); +if (!firmware) { + printf("%s: calloc(struct firmware) failed\n",
__func__);If malloc fails, you're screwed anyway and printf will likely fail
too,
so drop it.okay.
Quoted 24 lines
Quoted 23 lines
common/fs_loader.c new file +6
-0+return -ENOMEM ; + } + + fw_priv =calloc (1 ,sizeof (*fw_priv)); +if (!fw_priv) { + printf("%s: calloc(struct fw_priv) failed\n",
__func__);common/fs_loader.c new file +13
-0+free (firmware); +return -ENOMEM ; + } + + fw_priv->name = name; + fw_priv->offset = offset; + firmware->data = dbuf; + firmware->size = size; + firmware->priv = fw_priv; + *firmware_p = firmware; + +return 0 ; +}[...]
PATCH v6 2/2 common: Generic firmware loader for file system
Hi,
Quoted 34 lines · Tien Fong
Quoted 33 lines · Marek Vasut
Quoted 32 lines · Tien Fong
Quoted 25 lines · Marek Vasut
On 12/27/2017 06:04 AM, tien.fong.chee at intel.com wrote:
Whoa, this improved substantially since last time I checked. Minor
nitpicks below.[...]
Quoted 5 lines
common/fs_loader.c new file +3
-0+/* USB build is not supported yet in SPL */ +#ifndef CONFIG_SPL_BUILD +#ifdef CONFIG_USB_STORAGE common/fs_loader.c line 51
Quoted 10 lines
common/fs_loader.c new file +10
-0+static int init_usb (void ) +{ +int err; + + err =usb_init (); +if (err) +return err; + +#ifndef CONFIG_DM_USB + err =usb_stor_scan (1 ) <0 ? -ENODEV :0 ;if (err)
Quoted 3 lines
return err;?
This is last line code of the function, so it's always return the result regardless error or not.
Quoted 9 lines
Quoted 3 lines
You are rewriting the true error code with
-ENODEVinstead of propagating it.Ohh....are you saying to change the codes as shown in below:
err =
usb_stor_scan(1);
if (err)
return err;
usb_stor_scan() does not return a sensible error code, but '-1' if no device was found. This should be changed to -ENODEV then!
Lothar Waßmann
Chee
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 46 lines · Lothar Waßmann
Hi,
Quoted 43 lines · Tien Fong
Quoted 41 lines · Marek Vasut
Quoted 33 lines · Tien Fong
Quoted 27 lines · Marek Vasut
On 12/27/2017 06:04 AM, tien.fong.chee at intel.com wrote:
Whoa, this improved substantially since last time I checked. Minor
nitpicks below.[...]
Quoted 6 lines
common/fs_loader.c new file +3
-0+/* USB build is not supported yet in SPL */ +#ifndef CONFIG_SPL_BUILD +#ifdef CONFIG_USB_STORAGE common/fs_loader.c line 51
Quoted 10 lines
common/fs_loader.c new file +10
-0+static int init_usb (void ) +{ +int err; + + err =usb_init (); +if (err) +return err; + +#ifndef CONFIG_DM_USB + err =usb_stor_scan (1 ) <0 ? -ENODEV :0 ;if (err)
Quoted 3 lines
return err;?
Quoted 3 lines
This is last line code of the function, so it's always return the
result regardless error or not.You are rewriting the true error code with
-ENODEVinstead of propagating it.
Quoted 9 lines
Quoted 6 lines
Ohh....are you saying to change the codes as shown in below:
err =
usb_stor_scan(1);
if (err)
return err;
usb_stor_scan()does not return a sensible error code, but '-1' if no device was found. This should be changed to-ENODEVthen!
Okay, so this should be fixed in usb_stor_scan() function.
Quoted 2 lines
Lothar Waßmann
PATCH v6 2/2 common: Generic firmware loader for file system
In reply to CheeOn 01/22/2018 08:11 AM, Chee, Tien Fong wrote:
[...]
Quoted 10 lines
Quoted 5 lines
Quoted 2 lines
This is last line code of the function, so it's always return the result regardless error or not.
You are rewriting the true error code with
-ENODEVinstead of propagating it.Ohh....are you saying to change the codes as shown in below:
err =
usb_stor_scan(1);
if (err)
return err;
Right
[...]
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
common/fs_loader.c line 99
Quoted 3 lines
common/fs_loader.c new file +3
-0+static int umount_ubifs (void ) +{ +return run_command ("ubifsumount" ,0 );Just call the function directly ?
Quoted 7 lines
Quoted 5 lines
Quoted 2 lines
There are some checking like
ubifs_initializedin thecmd/ubifs.c. Direct callng the function would bypass those checking.Then factor those out into a function you can all and call that function.
Just for curious, is it worth to factor those into a function? Does it help to boost the performance or for other purpose?
It just makes no sense to involve the whole command machinery if you can call a function which does exactly the same.
[...]
Signature · 2 lines
Best regards, Marek Vasut
PATCH v6 2/2 common: Generic firmware loader for file system
In reply to tien.fong.chee at intel.comQuoted 17 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever, ie. the FPGA device.
Signed-off-by Tien Fong Chee <[email protected]>--- common/Makefile | 1 + common/fs_loader.c | 309 +++++++++++++++++++++++++++++++++++++++++++++ doc/README.firmware_loader | 76 +++++++++++ include/fs_loader.h | 28 ++++ 4 files changed, 414 insertions(+)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader
create mode 100644include/fs_loader.h
<snip>
Quoted 7 lines
common/fs_loader.c new file +7
-0+#if defined(CONFIG_SPL_MMC_SUPPORT ) && defined(CONFIG_SPL_BUILD ) +static int init_mmc (void ) +{ +/* Just for the case MMC is not yet initialized */ +struct mmc *mmc =NULL ; +int err; +
common/fs_loader.c line 125
Quoted 10 lines
common/fs_loader.c new file +10
-0+spl_mmc_find_device (&mmc,spl_boot_device ()); + + err =mmc_init (mmc); +if (err) { +printf ("spl: mmc init failed with error: %d\n" , err); +return err; + } + +return err; +}
I see two problems here: First, you're ignoring the return value of spl_mmc_find_device() and initialize 'mmc' to NULL instead. Wouldn't it be better to let 'mmc' be uninitialized and return the error code returned by spl_mmc_find_device() if there is one?
Second, using spl_boot_device() would prevent making the loader work on mach-socfpga when spl is not loaded from mmc, right?
E.g. for the case I'm currently trying to fix (boot from qspi), this loader would not work although there's technically no reason since the platform only has one mmc. The call to spl_boot_device() could be replaced by the exact value here for platforms that only have one mmc. I don't know how to fix that, though.
Regards,
Simon
Chee
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 38 lines · Simon Goldschmidt
Quoted 19 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever, ie. the FPGA device.
Signed-off-by Tien Fong Chee <[email protected]>---
common/Makefile | 1 +
common/fs_loader.c | 309
+++++++++++++++++++++++++++++++++++++++++++++
doc/README.firmware_loader | 76 +++++++++++
include/fs_loader.h | 28 ++++4 files changed, 414 insertions(+)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader
create mode 100644include/fs_loader.h<snip>
Quoted 16 lines
common/fs_loader.c new file +12
-0+#if defined(CONFIG_SPL_MMC_SUPPORT ) && defined(CONFIG_SPL_BUILD ) +static int init_mmc (void ) +{ +/* Just for the case MMC is not yet initialized */ +struct mmc *mmc =NULL ; +int err; + +spl_mmc_find_device (&mmc,spl_boot_device ()); + + err =mmc_init (mmc); +if (err) { + printf("spl: mmc init failed with error: %d\n",err);
(quoted diff) +2
-0+ return err; + }
Quoted 9 lines
common/fs_loader.c line 55
Quoted 3 lines
common/fs_loader.c new file +3
-0+ +return err; +}I see two problems here: First, you're ignoring the return value of
spl_mmc_find_device()and initialize 'mmc' to NULL instead. Wouldn't it
be better to let 'mmc' be uninitialized and return the error code returned byspl_mmc_find_device()if there is one?
Yeah, you are right, i should add the check on the return value. I think that would better to initialize NULL to mmc, because there is no checking on the mmc in spl_mmc_find_device(), so that is possible memory access violation/abort can be happended if unknown value in mmc pointer.
Quoted 4 lines
Second, using
spl_boot_device()would prevent making the loader work on
mach-socfpga when spl is not loaded from mmc, right?
Quoted 8 lines
E.g. for the case I'm currently trying to fix (boot from qspi), this loader would not work although there's technically no reason since the
platform only has one mmc. The call tospl_boot_device()could be replaced by the exact value here for platforms that only have one mmc. I
don't know how to fix that, though.
The main purpose here is to initialize the mmc driver. So which storage user wants to load the file is totally depend what storage such as mmc user defines in location->name. Loader would init the storage based on the storage defined in location->name before accessing it. Since the loader only support file system at this moment, i would suggest FAT fs for mmc and ubi fs for qspi.
Quoted 3 lines
Regards,
Simon
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 64 lines · Tien Fong
Quoted 36 lines · Simon Goldschmidt
Quoted 18 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever, ie. the FPGA device.
Signed-off-by Tien Fong Chee <[email protected]>--- common/Makefile | 1 + common/fs_loader.c | 309 +++++++++++++++++++++++++++++++++++++++++++++ doc/README.firmware_loader | 76 +++++++++++ include/fs_loader.h | 28 ++++ 4 files changed, 414 insertions(+)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader
create mode 100644include/fs_loader.h<snip>
Quoted 15 lines
common/fs_loader.c new file +12
-0+#if defined(CONFIG_SPL_MMC_SUPPORT ) && defined(CONFIG_SPL_BUILD ) +static int init_mmc (void ) +{ +/* Just for the case MMC is not yet initialized */ +struct mmc *mmc =NULL ; +int err; + +spl_mmc_find_device (&mmc,spl_boot_device ()); + + err =mmc_init (mmc); +if (err) { + printf("spl: mmc init failed with error: %d\n",err);
(quoted diff) +2
-0+ return err; + }Quoted 9 lines
common/fs_loader.c line 55
Quoted 3 lines
common/fs_loader.c new file +3
-0+ +return err; +}I see two problems here: First, you're ignoring the return value of
spl_mmc_find_device()and initialize 'mmc' to NULL instead. Wouldn't it
be better to let 'mmc' be uninitialized and return the error code returned byspl_mmc_find_device()if there is one?Yeah, you are right, i should add the check on the return value. I think that would better to initialize NULL to mmc, because there is no checking on the mmc in
spl_mmc_find_device(), so that is possible memory access violation/abort can be happended if unknown value in mmc pointer.Quoted 4 lines
Second, using
spl_boot_device()would prevent making the loader work on
mach-socfpga when spl is not loaded from mmc, right?Quoted 8 lines
E.g. for the case I'm currently trying to fix (boot from qspi), this loader would not work although there's technically no reason since the
platform only has one mmc. The call tospl_boot_device()could be replaced by the exact value here for platforms that only have one mmc. I
don't know how to fix that, though.
Quoted 6 lines
The main purpose here is to initialize the mmc driver. So which storage user wants to load the file is totally depend what storage such as mmc user defines in
location->name. Loader would init the storage based on the storage defined inlocation->namebefore accessing it. Since the loader only support file system at this moment, i would suggest FAT fs for mmc and ubi fs for qspi.
What I meant to say is this: at least on mach-socfpga, from reading the code, I cannot load a file from mmc when booting from qspi, as 'spl_boot_device' returns 'BOOT_DEVICE_SPI' in that case, although I need to pass 'BOOT_DEVICE_MMC1' to 'spl_mmc_find_device'. Or am I wrong here?
Regards,
Simon
Chee
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 91 lines · Simon Goldschmidt
Quoted 79 lines · Tien Fong
Quoted 44 lines · Simon Goldschmidt
Quoted 20 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever,
ie. the FPGA device.Signed-off-by Tien Fong Chee <[email protected]>---
common/Makefile | 1 +
common/fs_loader.c | 309
+++++++++++++++++++++++++++++++++++++++++++++
doc/README.firmware_loader | 76 +++++++++++
include/fs_loader.h | 28 ++++4 files changed, 414 insertions(+)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader
create mode 100644include/fs_loader.h<snip>
Quoted 20 lines
+#if
defined(CONFIG_SPL_MMC_SUPPORT)&&defined(CONFIG_SPL_BUILD)common/fs_loader.c new file +11
-0+static int init_mmc (void ) +{ +/* Just for the case MMC is not yet initialized */ +struct mmc *mmc =NULL ; +int err; + +spl_mmc_find_device (&mmc,spl_boot_device ()); + + err =mmc_init (mmc); +if (err) { + printf("spl: mmc init failed with error:%d\n",
err);common/fs_loader.c new file +4
-0+return err; + } + +return err;Quoted 9 lines
Quoted 1 line
+}
I see two problems here: First, you're ignoring the return value of
spl_mmc_find_device()and initialize 'mmc' to NULL instead. Wouldn't
it
be better to let 'mmc' be uninitialized and return the error code returned byspl_mmc_find_device()if there is one?Yeah, you are right, i should add the check on the return value. I think that would better to initialize NULL to mmc, because there is no
checking on the mmc inspl_mmc_find_device(), so that is possible memory access violation/abort can be happended if unknown value in mmc
pointer.Quoted 6 lines
Second, using
spl_boot_device()would prevent making the loader work
on
mach-socfpga when spl is not loaded from mmc, right?Quoted 10 lines
E.g. for the case I'm currently trying to fix (boot from qspi), this
loader would not work although there's technically no reason since
the
platform only has one mmc. The call tospl_boot_device()could be replaced by the exact value here for platforms that only have one mmc. I
don't know how to fix that, though.Quoted 11 lines
The main purpose here is to initialize the mmc driver. So which storage
user wants to load the file is totally depend what storage such as mmc
user defines inlocation->name. Loader would init the storage based on
the storage defined inlocation->namebefore accessing it. Since the
loader only support file system at this moment, i would suggest FAT fs
for mmc and ubi fs for qspi.
Quoted 8 lines
What I meant to say is this: at least on mach-socfpga, from reading the
code, I cannot load a file from mmc when booting from qspi, as 'spl_boot_device' returns 'BOOT_DEVICE_SPI' in that case, although I need to pass 'BOOT_DEVICE_MMC1' to 'spl_mmc_find_device'. Or am I wrong
here?
Okay, i got you.
Yeah, you are right for use case if you need to load the file from mmc during SPL boot and SPL is not loaded from mmc.
Since the spl_boot_device is platform dependent, you may try to add some state machine so that this function can return correct device type.
Secondly, you can use this function in U-Boot instead of SPL.
Lastly, i can declare __Weak to init_mmc, so that user can define their own implementation.
Quoted 2 lines
Regards,
Simon
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 97 lines · Tien Fong
Quoted 86 lines · Simon Goldschmidt
Quoted 74 lines · Tien Fong
Quoted 41 lines · Simon Goldschmidt
Quoted 19 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever,
ie. the FPGA device.Signed-off-by Tien Fong Chee <[email protected]>--- common/Makefile | 1 + common/fs_loader.c | 309 +++++++++++++++++++++++++++++++++++++++++++++ doc/README.firmware_loader | 76 +++++++++++ include/fs_loader.h | 28 ++++ 4 files changed, 414 insertions(+)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader
create mode 100644include/fs_loader.h<snip>
Quoted 19 lines
+#if
defined(CONFIG_SPL_MMC_SUPPORT)&&defined(CONFIG_SPL_BUILD)common/fs_loader.c new file +11
-0+static int init_mmc (void ) +{ +/* Just for the case MMC is not yet initialized */ +struct mmc *mmc =NULL ; +int err; + +spl_mmc_find_device (&mmc,spl_boot_device ()); + + err =mmc_init (mmc); +if (err) { + printf("spl: mmc init failed with error:%d\n",
err);common/fs_loader.c new file +4
-0+return err; + } + +return err;Quoted 9 lines
Quoted 1 line
+}
I see two problems here: First, you're ignoring the return value of
spl_mmc_find_device()and initialize 'mmc' to NULL instead. Wouldn't
it
be better to let 'mmc' be uninitialized and return the error code returned byspl_mmc_find_device()if there is one?Yeah, you are right, i should add the check on the return value. I think that would better to initialize NULL to mmc, because there is no
checking on the mmc inspl_mmc_find_device(), so that is possible memory access violation/abort can be happended if unknown value in mmc
pointer.Quoted 5 lines
Second, using
spl_boot_device()would prevent making the loader work
on
mach-socfpga when spl is not loaded from mmc, right?Quoted 10 lines
E.g. for the case I'm currently trying to fix (boot from qspi), this
loader would not work although there's technically no reason since
the
platform only has one mmc. The call tospl_boot_device()could be replaced by the exact value here for platforms that only have one mmc. I
don't know how to fix that, though.Quoted 11 lines
The main purpose here is to initialize the mmc driver. So which storage
user wants to load the file is totally depend what storage such as mmc
user defines inlocation->name. Loader would init the storage based on
the storage defined inlocation->namebefore accessing it. Since the
loader only support file system at this moment, i would suggest FAT fs
for mmc and ubi fs for qspi.Quoted 8 lines
What I meant to say is this: at least on mach-socfpga, from reading the
code, I cannot load a file from mmc when booting from qspi, as 'spl_boot_device' returns 'BOOT_DEVICE_SPI' in that case, although I need to pass 'BOOT_DEVICE_MMC1' to 'spl_mmc_find_device'. Or am I wrong
here?Okay, i got you.
Quoted 8 lines
Yeah, you are right for use case if you need to load the file from mmc during SPL boot and SPL is not loaded from mmc.
Since the
spl_boot_deviceis platform dependent, you may try to add some state machine so that this function can return correct device type.Secondly, you can use this function in U-Boot instead of SPL.
You're right on that. Thinking about it, I would probably use it from U-Boot, not from SPL...
Quoted 2 lines
Lastly, i can declare
__Weaktoinit_mmc, so that user can define their own implementation.
At least somehow allowing to override which device is passed to 'spl_mmc_find_device' might be good, instead of hardcoding it to 'spl_boot_device'...
Regards,
Simon
PATCH v6 2/2 common: Generic firmware loader for file system
In reply to tien.fong.chee at intel.comQuoted 23 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever, ie. the FPGA device.
Signed-off-by Tien Fong Chee <[email protected]>--- common/Makefile | 1 + common/fs_loader.c | 309 +++++++++++++++++++++++++++++++++++++++++++++ doc/README.firmware_loader | 76 +++++++++++ include/fs_loader.h | 28 ++++ 4 files changed, 414 insertions(+)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader
create mode 100644include/fs_loader.hcommon/Makefile +0
-0@@ -130,3 +130,4 @@ obj-$(CONFIG_CMD_DFU) += dfu.o
<snip>
Quoted 14 lines
include/fs_loader.h new file +8
-0@@ -0,0 +1,28 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/ +#ifndef _FS_LOADER_H_ +#define _FS_LOADER_H_ +
include/fs_loader.h line 18
Quoted 10 lines
include/fs_loader.h new file +10
-0+#include <linux/types.h> + +struct firmware { +size_t size;/* Size of a file */ +const u8 *data;/* Buffer for file */ +void *priv;/* Firmware loader private fields */ +}; + +struct device_location { +char *name;/* Such as mmc, usb,and sata. */
Would it make sense to use 'enum if_type' from blk.h here instead of a "magic" name? Or are the constants passed here "well-known" enough to hide them?
Regards,
Simon
Quoted 10 lines
include/fs_loader.h new file +10
-0+char *devpart;/* Use the load command dev:part conventions */ +char *mtdpart;/* MTD partition for ubi part */ + char *ubivol; /* UBI volume-name for ubifsmount */ +}; + +int request_firmware_into_buf (struct firmware **firmware_p, +const char *name, +struct device_location *location, +void *buf,size_t size,u32 offset); +#endif
Chee
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 51 lines · Simon Goldschmidt
Quoted 25 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever, ie. the FPGA device.
Signed-off-by Tien Fong Chee <[email protected]>---
common/Makefile | 1 +
common/fs_loader.c | 309
+++++++++++++++++++++++++++++++++++++++++++++
doc/README.firmware_loader | 76 +++++++++++
include/fs_loader.h | 28 ++++4 files changed, 414 insertions(+)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader
create mode 100644include/fs_loader.hcommon/Makefile +0
-0@@ -130,3 +130,4 @@ obj-$(CONFIG_CMD_DFU) += dfu.o<snip>
Quoted 23 lines
include/fs_loader.h new file +14
-0@@ -0,0 +1,28 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/ +#ifndef _FS_LOADER_H_ +#define _FS_LOADER_H_ + +#include <linux/types.h> + +struct firmware { + size_t size; /* Size of a file */ + const u8 *data; /* Buffer for file */ + void *priv; /* Firmware loader privatefields */
+};
Quoted 9 lines
include/fs_loader.h line 18
Quoted 3 lines
include/fs_loader.h new file +3
-0+ +struct device_location { +char *name;/* Such as mmc, usb,and sata. */ Would it make sense to use 'enum
if_type' fromblk.hhere instead of a
"magic" name? Or are the constants passed here "well-known" enough to
hide them?
This structure is declared such way so that it can be compatible with common/splash.c. It also much more easy to port fs_loader into common/splash_source.c in later.
Quoted 15 lines
Regards,
SimonQuoted 12 lines
include/fs_loader.h new file +1
-0+ char *devpart; /* Use the load command dev:partconventions */
include/fs_loader.h new file +9
-0+char *mtdpart;/* MTD partition for ubi part */ +char *ubivol;/* UBI volume-name for ubifsmount */ +}; + +int request_firmware_into_buf (struct firmware **firmware_p, + const char *name, + struct device_location *location, + void *buf, size_t size, u32 offset); +#endif
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 59 lines · Tien Fong
Quoted 49 lines · Simon Goldschmidt
Quoted 24 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever, ie. the FPGA device.
Signed-off-by Tien Fong Chee <[email protected]>--- common/Makefile | 1 + common/fs_loader.c | 309 +++++++++++++++++++++++++++++++++++++++++++++ doc/README.firmware_loader | 76 +++++++++++ include/fs_loader.h | 28 ++++ 4 files changed, 414 insertions(+)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader
create mode 100644include/fs_loader.hcommon/Makefile +0
-0@@ -130,3 +130,4 @@ obj-$(CONFIG_CMD_DFU) += dfu.o<snip>
Quoted 22 lines
include/fs_loader.h new file +14
-0@@ -0,0 +1,28 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/ +#ifndef _FS_LOADER_H_ +#define _FS_LOADER_H_ + +#include <linux/types.h> + +struct firmware { + size_t size; /* Size of a file */ + const u8 *data; /* Buffer for file */ + void *priv; /* Firmware loader privatefields */
+};Quoted 9 lines
include/fs_loader.h line 18
Quoted 3 lines
include/fs_loader.h new file +3
-0+ +struct device_location { +char *name;/* Such as mmc, usb,and sata. */ Would it make sense to use 'enum
if_type' fromblk.hhere instead of a
"magic" name? Or are the constants passed here "well-known" enough to
hide them?
Quoted 3 lines
This structure is declared such way so that it can be compatible with
common/splash.c. It also much more easy to portfs_loaderintocommon/splash_source.cin later.
OK, but reading splash_source.c, it seems to me that 'enum splash_storage' is used to detect the device to load from, not 'char *name'.
However, since these constant strings already seem to be "common knowledge" for callers of fs.h functions, it might be OK to use them in the firmware loader, too. I just wanted to point this out while this is in the reviewing process.
Quoted 14 lines
Quoted 14 lines
Regards,
SimonQuoted 11 lines
include/fs_loader.h new file +1
-0+ char *devpart; /* Use the load command dev:partconventions */
include/fs_loader.h new file +9
-0+char *mtdpart;/* MTD partition for ubi part */ +char *ubivol;/* UBI volume-name for ubifsmount */ +}; + +int request_firmware_into_buf (struct firmware **firmware_p, + const char *name, + struct device_location *location, + void *buf, size_t size, u32 offset); +#endif
Chee
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 75 lines · Simon Goldschmidt
Quoted 66 lines · Tien Fong
Quoted 55 lines · Simon Goldschmidt
Quoted 26 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever,
ie. the FPGA device.Signed-off-by Tien Fong Chee <[email protected]>---
common/Makefile | 1 +
common/fs_loader.c | 309
+++++++++++++++++++++++++++++++++++++++++++++
doc/README.firmware_loader | 76 +++++++++++
include/fs_loader.h | 28 ++++4 files changed, 414 insertions(+)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader create mode 100644include/fs_loader.hcommon/Makefile +0
-0@@ -130,3 +130,4 @@ obj-$(CONFIG_CMD_DFU) += dfu.o<snip>
Quoted 25 lines
include/fs_loader.h new file +14
-0@@ -0,0 +1,28 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/ +#ifndef _FS_LOADER_H_ +#define _FS_LOADER_H_ + +#include <linux/types.h> + +struct firmware { + size_t size; /* Size of a file */ + const u8 *data; /* Buffer for file */ + void *priv; /* Firmware loader privatefields */
include/fs_loader.h new file +3
-0+}; + +struct device_location {Quoted 9 lines
include/fs_loader.h line 18
Quoted 1 line
include/fs_loader.h new file +1
-0+char *name;/* Such as mmc, usb,and sata. */ Would it make sense to use 'enum
if_type' fromblk.hhere instead of
a
"magic" name? Or are the constants passed here "well-known" enough
to
hide them?Quoted 4 lines
This structure is declared such way so that it can be compatible with
common/splash.c. It also much more easy to portfs_loaderintocommon/splash_source.cin later.OK, but reading
splash_source.c, it seems to me that 'enumsplash_storage' is used to detect the device to load from, not 'char *name'.
Quoted 7 lines
However, since these constant strings already seem to be "common knowledge" for callers of
fs.hfunctions, it might be OK to use them in
the firmware loader, too. I just wanted to point this out while this is
in the reviewing process.
Actually this is common interface name used in any fs related. You can refer more details regarding @ifname in include/fs.h and include part.h .
So, why this interface name must be in characters string? It's actually serving in 2 main purposes, and 1 minor purpose:
1. console environment, most commands using those interface name as their arguments in characters string format such as FPGA loadfs command.
2. These command interface name is one of the characters string argument of fs_set_blk_dev too.
3. As identity of default location and its dev_part configuration.
Quoted 20 lines
Quoted 20 lines
Quoted 20 lines
Regards,
SimonQuoted 15 lines
include/fs_loader.h new file +1
-0+ char *devpart; /* Use the load command dev:partconventions */
include/fs_loader.h new file +2
-0+char *mtdpart;/* MTD partition for ubi part */ +char *ubivol;/* UBI volume-name for ubifsmount */
include/fs_loader.h new file +5
-0+}; + +int request_firmware_into_buf (struct firmware **firmware_p, + const char *name, + struct device_location*location,
include/fs_loader.h new file +1
-0+ void *buf, size_t size, u32offset);
+#endif
PATCH v6 2/2 common: Generic firmware loader for file system
Quoted 89 lines · Tien Fong
Quoted 71 lines · Simon Goldschmidt
Quoted 62 lines · Tien Fong
Quoted 52 lines · Simon Goldschmidt
Quoted 25 lines · tien.fong.chee at intel.com
From: Tien Fong Chee <[email protected]>
This is file system generic loader which can be used to load the file image from the storage into target such as memory. The consumer driver would then use this loader to program whatever,
ie. the FPGA device.Signed-off-by Tien Fong Chee <[email protected]>--- common/Makefile | 1 + common/fs_loader.c | 309 +++++++++++++++++++++++++++++++++++++++++++++ doc/README.firmware_loader | 76 +++++++++++ include/fs_loader.h | 28 ++++ 4 files changed, 414 insertions(+)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader create mode 100644include/fs_loader.hcommon/Makefile +0
-0@@ -130,3 +130,4 @@ obj-$(CONFIG_CMD_DFU) += dfu.o<snip>
Quoted 24 lines
include/fs_loader.h new file +14
-0@@ -0,0 +1,28 @@ +/* +* Copyright (C) 2017 Intel Corporation <www.intel.com> +* +* SPDX-License-Identifier: GPL-2.0 +*/ +#ifndef _FS_LOADER_H_ +#define _FS_LOADER_H_ + +#include <linux/types.h> + +struct firmware { + size_t size; /* Size of a file */ + const u8 *data; /* Buffer for file */ + void *priv; /* Firmware loader privatefields */
include/fs_loader.h new file +3
-0+}; + +struct device_location {Quoted 9 lines
include/fs_loader.h line 18
Quoted 1 line
include/fs_loader.h new file +1
-0+char *name;/* Such as mmc, usb,and sata. */ Would it make sense to use 'enum
if_type' fromblk.hhere instead of
a
"magic" name? Or are the constants passed here "well-known" enough
to
hide them?Quoted 4 lines
This structure is declared such way so that it can be compatible with
common/splash.c. It also much more easy to portfs_loaderintocommon/splash_source.cin later.OK, but reading
splash_source.c, it seems to me that 'enumsplash_storage' is used to detect the device to load from, not 'char *name'.Quoted 7 lines
However, since these constant strings already seem to be "common knowledge" for callers of
fs.hfunctions, it might be OK to use them in
the firmware loader, too. I just wanted to point this out while this is
in the reviewing process.Actually this is common interface name used in any fs related. You can refer more details regarding @ifname in
include/fs.hand includepart.h.So, why this interface name must be in characters string? It's actually serving in 2 main purposes, and 1 minor purpose:
1. console environment, most commands using those interface name as their arguments in characters string format such as FPGA loadfs command.
Quoted 4 lines
2. These command interface name is one of the characters string argument of
fs_set_blk_devtoo.3. As identity of default location and its
dev_partconfiguration.
Right. I see that there does not seem to be a way to provide the interface type to fs.h without using a string. In most cases, this string is provided by the environment or via console, so I see where that comes from. It's probably not up to this patch to change it.
Quoted 17 lines
Quoted 17 lines
Quoted 17 lines
Quoted 17 lines
Regards,
SimonQuoted 14 lines
include/fs_loader.h new file +1
-0+ char *devpart; /* Use the load command dev:partconventions */
include/fs_loader.h new file +2
-0+char *mtdpart;/* MTD partition for ubi part */ +char *ubivol;/* UBI volume-name for ubifsmount */
include/fs_loader.h new file +5
-0+}; + +int request_firmware_into_buf (struct firmware **firmware_p, + const char *name, + struct device_location*location,
include/fs_loader.h new file +1
-0+ void *buf, size_t size, u32offset);
+#endif
Chee
v6 cover Generic firmware loader
In reply to tien.fong.chee at intel.comOn Rab, 2017-12-27 at 13:04 +0800, tien.fong.chee at intel.com wrote:
Hi Lothar Waßmann,
Quoted 12 lines
From: Tien Fong Chee <[email protected]>
This patchset contains generic firmware loader which is very close to Linux
firmware loader but for U-Boot framework. Generic firmware loader can be used
load whatever into target location, and then consumer driver would use it to
program whatever, ie. the FPGA. This version mainly resolved comments from
Lothar Waßmann in [v5].
Are you OK with the patches?
Quoted 38 lines
This series is working on top of u-boot.git -
http://git.denx.de/u-boot.git .[v5]: https://www.mail-archive.com/u-boot at lists.denx.de/msg272771.htm l
v5 -> v6 changes:
-----------------
- Return error code whenfs_readis fail.
- Return actual read size whenfs_readis success.Patchset history
----------------
[v1]: https://www.mail-archive.com/u-boot at lists.denx.de/msg271905.htm l
[v2]: https://www.mail-archive.com/u-boot at lists.denx.de/msg271979.htm l
[v3]: https://www.mail-archive.com/u-boot at lists.denx.de/msg272039.htm l
[v4]: https://www.mail-archive.com/u-boot at lists.denx.de/msg272432.htm lTien Fong Chee (2):
spl: Remove static declaration onspl_mmc_find_devicefunction
common: Generic firmware loader for file systemcommon/Makefile | 1 +
common/fs_loader.c | 309
+++++++++++++++++++++++++++++++++++++++++++++
common/spl/spl_mmc.c | 2 +-
doc/README.firmware_loader | 76 +++++++++++
include/fs_loader.h | 28 ++++
include/spl.h | 2 +6 files changed, 417 insertions(+), 1 deletion(-)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader
create mode 100644include/fs_loader.h
v6 cover Generic firmware loader
Hi,
Quoted 14 lines · Tien Fong
On Rab, 2017-12-27 at 13:04 +0800, tien.fong.chee at intel.com wrote:
Hi Lothar Waßmann,Quoted 12 lines
From: Tien Fong Chee <[email protected]>
This patchset contains generic firmware loader which is very close to Linux
firmware loader but for U-Boot framework. Generic firmware loader can be used
load whatever into target location, and then consumer driver would use it to
program whatever, ie. the FPGA. This version mainly resolved comments from
Lothar Waßmann in [v5].
Quoted 2 lines
Are you OK with the patches?
Sorry for the delay. I have been on vacation until now. The patch series Looks good to me now.
Lothar Waßmann
Chee
v6 cover Generic firmware loader
Quoted 23 lines · Lothar Waßmann
Hi,
Quoted 20 lines · Tien Fong
On Rab, 2017-12-27 at 13:04 +0800, tien.fong.chee at intel.com wrote:
Hi Lothar Waßmann,Quoted 17 lines
From: Tien Fong Chee <[email protected]>
This patchset contains generic firmware loader which is very close to
Linux
firmware loader but for U-Boot framework. Generic firmware loader can
be used
load whatever into target location, and then consumer driver would
use it to
program whatever, ie. the FPGA. This version mainly resolved comments
from
Lothar Waßmann in [v5].
Quoted 7 lines
Quoted 2 lines
Are you OK with the patches?
Sorry for the delay. I have been on vacation until now. The patch series Looks good to me now.
Reviewed-by Lothar Waßmann <[email protected]>
Great, thanks for helping to review the codes.
Quoted 2 lines
Lothar Waßmann
Chee
v6 cover Generic firmware loader
In reply to Lothar WaßmannOn Mon, 2018-01-08 at 09:07 +0100, Lothar Waßmann wrote:
Hi Tom Rini,
Quoted 24 lines
Hi,
Quoted 21 lines · Tien Fong
On Rab, 2017-12-27 at 13:04 +0800, tien.fong.chee at intel.com wrote:
Hi Lothar Waßmann,Quoted 17 lines
From: Tien Fong Chee <[email protected]>
This patchset contains generic firmware loader which is very close to
Linux
firmware loader but for U-Boot framework. Generic firmware loader can
be used
load whatever into target location, and then consumer driver would
use it to
program whatever, ie. the FPGA. This version mainly resolved comments
from
Lothar Waßmann in [v5].Are you OK with the patches?
Inlcude Tom Rini for reviewing this patch.
Quoted 8 lines
Quoted 1 line
Sorry for the delay. I have been on vacation until now. The patch series Looks good to me now.
Reviewed-by Lothar Waßmann <[email protected]>Lothar Waßmann
Chee
v6 cover Generic firmware loader
In reply to tien.fong.chee at intel.comOn Wed, 2017-12-27 at 13:04 +0800, tien.fong.chee at intel.com wrote:
Hi Tom Rini,
Quoted 12 lines
From: Tien Fong Chee <[email protected]>
This patchset contains generic firmware loader which is very close to Linux
firmware loader but for U-Boot framework. Generic firmware loader can be used
load whatever into target location, and then consumer driver would use it to
program whatever, ie. the FPGA. This version mainly resolved comments from
Lothar Waßmann in [v5].
Quoted 3 lines
This series is working on top of u-boot.git -
http://git.denx.de/u-boot.git .
Do you ok with this patchset?
Best regards,
TF
Quoted 35 lines
[v5]: https://www.mail-archive.com/u-
boot at lists.denx.de/msg272771.htmlv5 -> v6 changes:
-----------------
- Return error code whenfs_readis fail.
- Return actual read size whenfs_readis success.Patchset history
----------------
[v1]: https://www.mail-archive.com/u-boot at lists.denx.de/msg271905.htm l
[v2]: https://www.mail-archive.com/u-boot at lists.denx.de/msg271979.htm l
[v3]: https://www.mail-archive.com/u-boot at lists.denx.de/msg272039.htm l
[v4]: https://www.mail-archive.com/u-boot at lists.denx.de/msg272432.htm lTien Fong Chee (2):
spl: Remove static declaration onspl_mmc_find_devicefunction
common: Generic firmware loader for file systemcommon/Makefile | 1 +
common/fs_loader.c | 309
+++++++++++++++++++++++++++++++++++++++++++++
common/spl/spl_mmc.c | 2 +-
doc/README.firmware_loader | 76 +++++++++++
include/fs_loader.h | 28 ++++
include/spl.h | 2 +6 files changed, 417 insertions(+), 1 deletion(-)create mode 100644
common/fs_loader.c
create mode 100644 doc/README.firmware_loader
create mode 100644include/fs_loader.h