[PATCH 1/2] FWU: Add platform hook support for fwu metadata
Sughosh Ganu
sughosh.ganu at linaro.org
Thu Jul 3 09:57:45 CEST 2025
On Mon, 16 Jun 2025 at 15:15, Padmarao Begari <padmarao.begari at amd.com> wrote:
>
> FWU metadata information is unavailable for platform-specific
> operations since FWU initialization has not yet occurred.
> The initialization function is invoked as part of the main
> loop event. To address this, the FWU platform hook function
> is introduced during FWU initialization, allowing metadata
> processing with platform-specific operations.
>
> Signed-off-by: Padmarao Begari <padmarao.begari at amd.com>
> ---
> drivers/fwu-mdata/fwu-mdata-uclass.c | 17 +++++++++++++++
> drivers/fwu-mdata/raw_mtd.c | 6 ++++++
> include/fwu.h | 32 ++++++++++++++++++++++++++++
> lib/fwu_updates/fwu.c | 8 +++++++
> 4 files changed, 63 insertions(+)
>
> diff --git a/drivers/fwu-mdata/fwu-mdata-uclass.c b/drivers/fwu-mdata/fwu-mdata-uclass.c
> index 92abb94dcc9..f63ee234c87 100644
> --- a/drivers/fwu-mdata/fwu-mdata-uclass.c
> +++ b/drivers/fwu-mdata/fwu-mdata-uclass.c
> @@ -50,6 +50,23 @@ int fwu_write_mdata(struct udevice *dev, struct fwu_mdata *mdata, bool primary,
> return ops->write_mdata(dev, mdata, primary, size);
> }
>
> +/**
> + * fwu_platform_hook() - Wrapper around fwu_mdata_ops.platform_hook()
> + *
> + * Return: 0 if OK, -ve on error
> + */
> +int fwu_platform_hook(struct udevice *dev, struct fwu_data *data)
> +{
> + const struct fwu_mdata_ops *ops = device_get_ops(dev);
> +
> + if (!ops->platform_hook) {
> + log_debug("platform_hook() method not defined\n");
> + return -ENOSYS;
> + }
> +
> + return ops->platform_hook(dev, data);
> +}
> +
> UCLASS_DRIVER(fwu_mdata) = {
> .id = UCLASS_FWU_MDATA,
> .name = "fwu-mdata",
> diff --git a/drivers/fwu-mdata/raw_mtd.c b/drivers/fwu-mdata/raw_mtd.c
> index 78a709f766c..f7542474632 100644
> --- a/drivers/fwu-mdata/raw_mtd.c
> +++ b/drivers/fwu-mdata/raw_mtd.c
> @@ -106,6 +106,11 @@ static int fwu_mtd_write_mdata(struct udevice *dev, struct fwu_mdata *mdata,
> return mtd_io_data(mtd, offs, size, mdata, FWU_MTD_WRITE);
> }
>
> +__weak int fwu_mtd_platform_hook(struct udevice *dev, struct fwu_data *data)
> +{
> + return 0;
> +}
> +
> static int flash_partition_offset(struct udevice *dev, const char *part_name, fdt_addr_t *offset)
> {
> ofnode node, parts_node;
> @@ -272,6 +277,7 @@ static int fwu_mdata_mtd_probe(struct udevice *dev)
> static struct fwu_mdata_ops fwu_mtd_ops = {
> .read_mdata = fwu_mtd_read_mdata,
> .write_mdata = fwu_mtd_write_mdata,
> + .platform_hook = fwu_mtd_platform_hook,
> };
Instead of doing this through the driver, it would be much easier to
just defined a weak platform hook function, and then have the actual
one in the platform specific code. We are not adding any value by
going through the driver, as this is not a generic function.
-sughosh
>
> static const struct udevice_id fwu_mdata_ids[] = {
> diff --git a/include/fwu.h b/include/fwu.h
> index 6441de370c9..65797190f3e 100644
> --- a/include/fwu.h
> +++ b/include/fwu.h
> @@ -77,6 +77,15 @@ struct fwu_mdata_ops {
> */
> int (*write_mdata)(struct udevice *dev, struct fwu_mdata *mdata,
> bool primary, uint32_t size);
> +
> + /**
> + * platform_hook() - Hook the given FWU data copy
> + * @dev: FWU metadata device
> + * @data: Copy of the FWU metadata to hook
> + *
> + * Return: 0 if OK, -ve on error
> + */
> + int (*platform_hook)(struct udevice *dev, struct fwu_data *data);
> };
>
> #define FWU_IMAGE_ACCEPTED 0x1
> @@ -129,6 +138,29 @@ int fwu_read_mdata(struct udevice *dev, struct fwu_mdata *mdata,
> int fwu_write_mdata(struct udevice *dev, struct fwu_mdata *mdata,
> bool primary, uint32_t size);
>
> +/**
> + * fwu_platform_hook() - Wrapper around fwu_mdata_ops.platform_hook()
> + * @dev: FWU metadata device
> + * @data: FWU metadata
> + *
> + * It is a platform-specific function that processes fwu metadata.
> + *
> + * Return: 0 if OK, -ve on error
> + */
> +int fwu_platform_hook(struct udevice *dev, struct fwu_data *data);
> +
> +/**
> + * fwu_mtd_platform_hook() - Hook the given FWU data copy
> + * @dev: FWU metadata device
> + * @data: FWU metadata
> +
> + * This function extracts the FWU metadata and prepares it for processing.
> + *
> + * Return: 0 if OK, -ve on error
> + *
> + */
> +int fwu_mtd_platform_hook(struct udevice *dev, struct fwu_data *data);
> +
> /**
> * fwu_get_mdata() - Read, verify and return the FWU metadata
> *
> diff --git a/lib/fwu_updates/fwu.c b/lib/fwu_updates/fwu.c
> index 7f085a0211f..47aa6fad1ab 100644
> --- a/lib/fwu_updates/fwu.c
> +++ b/lib/fwu_updates/fwu.c
> @@ -712,6 +712,7 @@ static int fwu_boottime_checks(void)
> {
> int ret;
> u32 boot_idx, active_idx;
> + struct fwu_data *data;
>
> ret = uclass_first_device_err(UCLASS_FWU_MDATA, &g_dev);
> if (ret) {
> @@ -770,6 +771,13 @@ static int fwu_boottime_checks(void)
> if (!ret)
> boottime_check = 1;
>
> + data = fwu_get_data();
> + ret = fwu_platform_hook(g_dev, data);
> + if (ret && ret != -ENOSYS) {
> + log_err("fwu_platform_hook() failed\n");
> + return ret;
> + }
> +
> return 0;
> }
> EVENT_SPY_SIMPLE(EVT_MAIN_LOOP, fwu_boottime_checks);
> --
> 2.25.1
>
More information about the U-Boot
mailing list