From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: u-boot@lists.denx.de
Subject: [PATCH v4 03/16] common: update: add a generic interface for FIT image
Date: Wed, 29 Jul 2020 14:33:22 +0900 [thread overview]
Message-ID: <20200729053322.GA6234@laputa> (raw)
In-Reply-To: <79dac1ea-bb07-3de4-0a26-b4709501549c@gmx.de>
Heinrich,
On Wed, Jul 22, 2020 at 03:07:51PM +0200, Heinrich Schuchardt wrote:
> On 22.07.20 08:05, AKASHI Takahiro wrote:
> > The main purpose of this patch is to separate a generic interface for
> > updating firmware using DFU drivers from "auto-update" via tftp.
> >
> > This function will also be used in implementing UEFI capsule update
> > in a later commit.
> >
> > Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> > ---
> > common/Kconfig | 14 +++++++++
> > common/Makefile | 3 +-
> > common/update.c | 71 +++++++++++++++++++++++++++++++++++++++++++++
> > drivers/dfu/Kconfig | 1 +
> > include/image.h | 12 ++++++++
> > 5 files changed, 99 insertions(+), 2 deletions(-)
> >
> > diff --git a/common/Kconfig b/common/Kconfig
> > index ca42ba37b726..86568dec2e25 100644
> > --- a/common/Kconfig
> > +++ b/common/Kconfig
> > @@ -1014,6 +1014,20 @@ endmenu
> >
> > menu "Update support"
> >
> > +config UPDATE_COMMON
> > + bool
> > + default n
> > + select DFU_ALT
>
> Why do we need separate symbols DFU_ALT and DFU_COMMON?
Because we have different compile targets.
I believe that 'update.c' should still stay in common (or preferably lib/)
because it is a kind of 'high-level' helper functions for a specific use/
subsystem, tftp update or UEFI capsule in this case, while drivers/dfu is
a low-level/generic drivers for multiple uses.
> > +
> > +config UPDATE_FIT
> > + bool "Firmware update using fitImage"
> > + depends on FIT
> > + depends on DFU
> > + select UPDATE_COMMON
> > + help
> > + This option allows performing update of DFU-capable storage with
> > + data in fitImage.
> > +
> > config ANDROID_AB
> > bool "Android A/B updates"
> > default n
> > diff --git a/common/Makefile b/common/Makefile
> > index 2e7a090588d9..bcf352d01652 100644
> > --- a/common/Makefile
> > +++ b/common/Makefile
> > @@ -53,8 +53,7 @@ obj-$(CONFIG_LCD_ROTATION) += lcd_console_rotation.o
> > obj-$(CONFIG_LCD_DT_SIMPLEFB) += lcd_simplefb.o
> > obj-$(CONFIG_LYNXKDI) += lynxkdi.o
> > obj-$(CONFIG_MENU) += menu.o
> > -obj-$(CONFIG_UPDATE_TFTP) += update.o
> > -obj-$(CONFIG_DFU_TFTP) += update.o
> > +obj-$(CONFIG_UPDATE_COMMON) += update.o
> > obj-$(CONFIG_USB_KEYBOARD) += usb_kbd.o
> > obj-$(CONFIG_CMDLINE) += cli_readline.o cli_simple.o
> >
> > diff --git a/common/update.c b/common/update.c
> > index f82d77cc0be9..2c75b37f19e6 100644
> > --- a/common/update.c
> > +++ b/common/update.c
> > @@ -23,6 +23,7 @@
> > #include <dfu.h>
> > #include <errno.h>
> >
> > +#ifdef CONFIG_DFU_TFTP
> > /* env variable holding the location of the update file */
> > #define UPDATE_FILE_ENV "updatefile"
> >
> > @@ -89,6 +90,7 @@ static int update_load(char *filename, ulong msec_max, int cnt_max, ulong addr)
> >
> > return rv;
> > }
> > +#endif /* CONFIG_DFU_TFTP */
> >
> > static int update_fit_getparams(const void *fit, int noffset, ulong *addr,
> > ulong *fladdr, ulong *size)
> > @@ -106,6 +108,7 @@ static int update_fit_getparams(const void *fit, int noffset, ulong *addr,
> > return 0;
> > }
> >
> > +#ifdef CONFIG_DFU_TFTP
> > int update_tftp(ulong addr, char *interface, char *devstring)
> > {
> > char *filename, *env_addr, *fit_image_name;
> > @@ -194,3 +197,71 @@ next_node:
> >
> > return ret;
> > }
> > +#endif /* CONFIG_DFU_UPDATE */
>
> Why do we need all those #ifdef? The linker removes all unused functions.
I think this kind of use of #ifdef is quite common across
u-boot source code.
If you want to prohibit such usages, we should have
a written document/guideline.
> We should move update_tftp() to drivers/dfu/dfu_tftp.c
I can't agree. See the above.
-Takahiro Akashi
> Best regards
>
> Heinrich
>
> > +
> > +#ifdef CONFIG_UPDATE_FIT
> > +/**
> > + * fit_update - update storage with FIT image
> > + * @fit: Pointer to FIT image
> > + *
> > + * Update firmware on storage using FIT image as input.
> > + * The storage area to be update will be identified by the name
> > + * in FIT and matching it to "dfu_alt_info" variable.
> > + *
> > + * Return: 0 - on success, non-zero - otherwise
> > + */
> > +int fit_update(const void *fit)
> > +{
> > + char *fit_image_name;
> > + ulong update_addr, update_fladdr, update_size;
> > + int images_noffset, ndepth, noffset;
> > + int ret = 0;
> > +
> > + if (!fit)
> > + return -EINVAL;
> > +
> > + if (!fit_check_format((void *)fit)) {
> > + printf("Bad FIT format of the update file, aborting auto-update\n");
> > + return -EINVAL;
> > + }
> > +
> > + /* process updates */
> > + images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH);
> > +
> > + ndepth = 0;
> > + noffset = fdt_next_node(fit, images_noffset, &ndepth);
> > + while (noffset >= 0 && ndepth > 0) {
> > + if (ndepth != 1)
> > + goto next_node;
> > +
> > + fit_image_name = (char *)fit_get_name(fit, noffset, NULL);
> > + printf("Processing update '%s' :", fit_image_name);
> > +
> > + if (!fit_image_verify(fit, noffset)) {
> > + printf("Error: invalid update hash, aborting\n");
> > + ret = 1;
> > + goto next_node;
> > + }
> > +
> > + printf("\n");
> > + if (update_fit_getparams(fit, noffset, &update_addr,
> > + &update_fladdr, &update_size)) {
> > + printf("Error: can't get update parameters, aborting\n");
> > + ret = 1;
> > + goto next_node;
> > + }
> > +
> > + if (fit_image_check_type(fit, noffset, IH_TYPE_FIRMWARE)) {
> > + ret = dfu_write_by_name(fit_image_name,
> > + (void *)update_addr,
> > + update_size, NULL, NULL);
> > + if (ret)
> > + return ret;
> > + }
> > +next_node:
> > + noffset = fdt_next_node(fit, noffset, &ndepth);
> > + }
> > +
> > + return ret;
> > +}
> > +#endif /* CONFIG_UPDATE_FIT */
> > diff --git a/drivers/dfu/Kconfig b/drivers/dfu/Kconfig
> > index d680b28ecf51..df0585c4fc83 100644
> > --- a/drivers/dfu/Kconfig
> > +++ b/drivers/dfu/Kconfig
> > @@ -22,6 +22,7 @@ config DFU_TFTP
> > bool "DFU via TFTP"
> > select DFU_ALT
> > select DFU_OVER_TFTP
> > + select UPDATE_COMMON
> > help
> > This option allows performing update of DFU-managed medium with data
> > sent via TFTP boot.
> > diff --git a/include/image.h b/include/image.h
> > index 9a5a87dbf870..dce2997f9a6a 100644
> > --- a/include/image.h
> > +++ b/include/image.h
> > @@ -1592,4 +1592,16 @@ struct fit_loadable_tbl {
> > .handler = _handler, \
> > }
> >
> > +/**
> > + * fit_update - update storage with FIT image
> > + * @fit: Pointer to FIT image
> > + *
> > + * Update firmware on storage using FIT image as input.
> > + * The storage area to be update will be indentified by the name
> > + * in FIT and matching it to "dfu_alt_info" variable.
> > + *
> > + * Return: 0 on success, non-zero otherwise
> > + */
> > +int fit_update(const void *fit);
> > +
> > #endif /* __IMAGE_H__ */
> >
>
next prev parent reply other threads:[~2020-07-29 5:33 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-22 6:05 [PATCH v4 00/16] efi_loader: add capsule update support AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 01/16] dfu: rename dfu_tftp_write() to dfu_write_by_name() AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 02/16] dfu: modify an argument type for an address AKASHI Takahiro
2020-07-22 12:43 ` Heinrich Schuchardt
2020-07-22 15:50 ` Heinrich Schuchardt
2020-07-22 6:05 ` [PATCH v4 03/16] common: update: add a generic interface for FIT image AKASHI Takahiro
2020-07-22 13:07 ` Heinrich Schuchardt
2020-07-29 5:33 ` AKASHI Takahiro [this message]
2020-07-22 6:05 ` [PATCH v4 04/16] dfu: export dfu_list AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 05/16] efi_loader: add option to initialise EFI subsystem early AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 06/16] efi_loader: define UpdateCapsule api AKASHI Takahiro
2020-07-23 15:54 ` Heinrich Schuchardt
2020-07-29 6:19 ` AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 07/16] efi_loader: capsule: add capsule_on_disk support AKASHI Takahiro
2020-07-23 15:50 ` Heinrich Schuchardt
2020-07-30 2:13 ` AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 08/16] efi_loader: capsule: add memory range capsule definitions AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 09/16] efi_loader: capsule: support firmware update AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 10/16] efi_loader: add firmware management protocol for FIT image AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 11/16] dfu: add dfu_write_by_alt() AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 12/16] efi_loader: add firmware management protocol for raw image AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 13/16] cmd: add "efidebug capsule" command AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 14/16] tools: add mkeficapsule command for UEFI capsule update AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 15/16] test/py: add a test for uefi firmware update capsule of FIT image AKASHI Takahiro
2020-07-22 6:05 ` [PATCH v4 16/16] test/py: add a test for uefi firmware update capsule of raw image AKASHI Takahiro
2020-07-29 7:06 ` [PATCH v4 00/16] efi_loader: add capsule update support Heinrich Schuchardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200729053322.GA6234@laputa \
--to=takahiro.akashi@linaro.org \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.