[PATCH v4 2/6] FWU: mtd: Add helper functions for accessing FWU metadata
Michal Simek
michal.simek at amd.com
Wed Mar 29 13:55:37 CEST 2023
On 3/27/23 23:16, jassisinghbrar at gmail.com wrote:
> From: Masami Hiramatsu <masami.hiramatsu at linaro.org>
>
> Add helper functions needed for accessing the FWU metadata which
> contains information on the updatable images.
>
> Signed-off-by: Masami Hiramatsu <masami.hiramatsu at linaro.org>
> Signed-off-by: Jassi Brar <jaswinder.singh at linaro.org>
> ---
> include/fwu.h | 34 ++++++++
> lib/fwu_updates/Makefile | 1 +
> lib/fwu_updates/fwu_mtd.c | 164 ++++++++++++++++++++++++++++++++++++++
> 3 files changed, 199 insertions(+)
> create mode 100644 lib/fwu_updates/fwu_mtd.c
>
> diff --git a/include/fwu.h b/include/fwu.h
> index 33b4d0b3db..117f51c4f5 100644
> --- a/include/fwu.h
> +++ b/include/fwu.h
> @@ -8,6 +8,8 @@
>
> #include <blk.h>
> #include <efi.h>
> +#include <mtd.h>
> +#include <uuid.h>
>
> #include <linux/types.h>
>
> @@ -18,6 +20,12 @@ struct fwu_mdata_gpt_blk_priv {
> struct udevice *blk_dev;
> };
>
> +struct fwu_mtd_image_info {
> + u32 start, size;
> + int bank_num, image_num;
> + char uuidbuf[UUID_STR_LEN + 1];
> +};
> +
> struct fwu_mdata_ops {
> /**
> * read_mdata() - Populate the asked FWU metadata copy
> @@ -251,4 +259,30 @@ u8 fwu_empty_capsule_checks_pass(void);
> */
> int fwu_trial_state_ctr_start(void);
>
> +/**
> + * fwu_gen_alt_info_from_mtd() - Parse dfu_alt_info from metadata in mtd
> + * @buf: Buffer into which the dfu_alt_info is filled
> + * @len: Maximum characters that can be written in buf
> + * @mtd: Pointer to underlying MTD device
> + *
> + * Parse dfu_alt_info from metadata in mtd. Used for setting the env.
> + *
> + * Return: 0 if OK, -ve on error
> + *
nit: remove this line above.
> + */
> +int fwu_gen_alt_info_from_mtd(char *buf, size_t len, struct mtd_info *mtd);
> +
> +/**
> + * fwu_mtd_get_alt_num() - Mapping of fwu_plat_get_alt_num for MTD device
> + * @image_guid: Image GUID for which DFU alt number needs to be retrieved
it doesn't match with parameter below.
> + * @alt_num: Pointer to the alt_num
> + * @mtd_dev: Name of mtd device instance
> + *
> + * To map fwu_plat_get_alt_num onto mtd based metadata implementation.
> + *
> + * Return: 0 if OK, -ve on error
> + *
nit: remove this line above
> + */
> +int fwu_mtd_get_alt_num(efi_guid_t *image_id, u8 *alt_num, const char *mtd_dev);
./scripts/kernel-doc -v -man include/fwu.h 1>/dev/null
include/fwu.h:276: info: Scanning doc for fwu_mtd_get_alt_num
include/fwu.h:286: warning: Function parameter or member 'image_id' not
described in 'fwu_mtd_get_alt_num'
include/fwu.h:286: warning: Excess function parameter 'image_guid' description
in 'fwu_mtd_get_alt_num'
(In general this file has other kernel-doc issues which should be fixed too)
> +
> #endif /* _FWU_H_ */
> diff --git a/lib/fwu_updates/Makefile b/lib/fwu_updates/Makefile
> index 1993088e5b..c9e3c06b48 100644
> --- a/lib/fwu_updates/Makefile
> +++ b/lib/fwu_updates/Makefile
> @@ -5,3 +5,4 @@
>
> obj-$(CONFIG_FWU_MULTI_BANK_UPDATE) += fwu.o
> obj-$(CONFIG_FWU_MDATA_GPT_BLK) += fwu_gpt.o
> +obj-$(CONFIG_FWU_MDATA_MTD) += fwu_mtd.o
> diff --git a/lib/fwu_updates/fwu_mtd.c b/lib/fwu_updates/fwu_mtd.c
> new file mode 100644
> index 0000000000..c1d04e574b
> --- /dev/null
> +++ b/lib/fwu_updates/fwu_mtd.c
> @@ -0,0 +1,164 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2023, Linaro Limited
> + */
> +
> +#include <dm.h>
> +#include <dfu.h>
> +#include <fwu.h>
> +#include <fwu_mdata.h>
> +#include <log.h>
> +#include <malloc.h>
> +#include <mtd.h>
> +#include <uuid.h>
> +#include <vsprintf.h>
> +
> +#include <dm/ofnode.h>
> +
> +struct fwu_mtd_image_info
> +fwu_mtd_images[CONFIG_FWU_NUM_BANKS * CONFIG_FWU_NUM_IMAGES_PER_BANK];
> +
> +static struct fwu_mtd_image_info *mtd_img_by_uuid(const char *uuidbuf)
> +{
> + int num_images = sizeof(fwu_mtd_images) / sizeof(struct fwu_mtd_image_info);
include/linux/kernel.h:55:#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
> +
> + for (int i = 0; i < num_images; i++)
> + if (!strcmp(uuidbuf, fwu_mtd_images[i].uuidbuf))
> + return &fwu_mtd_images[i];
> +
> + return NULL;
> +}
> +
> +int fwu_mtd_get_alt_num(efi_guid_t *image_id, u8 *alt_num,
> + const char *mtd_dev)
> +{
> + int i, nalt;
> + int ret = -1;
nit: can be on the same line.
> + struct mtd_info *mtd;
> + struct dfu_entity *dfu;
> + fdt_addr_t offset, size = 0;
> + char uuidbuf[UUID_STR_LEN + 1];
> + struct fwu_mtd_image_info *mtd_img_info;
nit: reverse christmas tree order
> +
> + mtd_probe_devices();
> + mtd = get_mtd_device_nm(mtd_dev);
you are getting link but you are not using it anywhere.
You should check return value or remove this call completely.
> +
> + uuid_bin_to_str(image_id->b, uuidbuf, UUID_STR_FORMAT_STD);
> +
> + mtd_img_info = mtd_img_by_uuid(uuidbuf);
> + if (!mtd_img_info) {
> + log_err("%s: Not found partition for image %s\n", __func__, uuidbuf);
> + return -ENOENT;
> + }
nit: newline
> + offset = mtd_img_info->start;
> + size = mtd_img_info->size;
> +
> + dfu_init_env_entities(NULL, NULL);
worth to check return value here.
M
More information about the U-Boot
mailing list