diff options
author | Michael Tretter <m.tretter@pengutronix.de> | 2021-06-24 17:00:51 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2021-06-25 09:39:19 +0200 |
commit | 68f866d4e4867ef97f25049cea6900630386da14 (patch) | |
tree | 296216592f9720dcaf979bf62fd2efb1f6d0bed4 /arch/arm | |
parent | 304210b79ba4a85b0c4ee2a1b594e4bc5cf073e7 (diff) | |
download | barebox-68f866d4e4867ef97f25049cea6900630386da14.tar.gz barebox-68f866d4e4867ef97f25049cea6900630386da14.tar.xz |
ARM: zynqmp: add update handler
The ZynqMP boots from an SDHCI device by reading a boot.bin file from
the FAT16/32 partition, which is the first partition in the MBR.
The update handler copies a boot.bin image to this partition, which
might be board specific.
Signed-off-by: Michael Tretter <m.tretter@pengutronix.de>
Link: https://lore.barebox.org/20210624150054.1205422-5-m.tretter@pengutronix.de
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-zynqmp/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-zynqmp/include/mach/zynqmp-bbu.h | 21 | ||||
-rw-r--r-- | arch/arm/mach-zynqmp/zynqmp-bbu.c | 48 |
3 files changed, 70 insertions, 0 deletions
diff --git a/arch/arm/mach-zynqmp/Makefile b/arch/arm/mach-zynqmp/Makefile index 14b8a4e46b..e24a43c0d5 100644 --- a/arch/arm/mach-zynqmp/Makefile +++ b/arch/arm/mach-zynqmp/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-or-later obj-y += firmware-zynqmp.o obj-y += zynqmp.o +obj-$(CONFIG_BAREBOX_UPDATE) += zynqmp-bbu.o diff --git a/arch/arm/mach-zynqmp/include/mach/zynqmp-bbu.h b/arch/arm/mach-zynqmp/include/mach/zynqmp-bbu.h new file mode 100644 index 0000000000..8502791ee0 --- /dev/null +++ b/arch/arm/mach-zynqmp/include/mach/zynqmp-bbu.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2020 Michael Tretter <m.tretter@pengutronix.de> + */ +#ifndef __MACH_ZYNQMP_BBU_H +#define __MACH_ZYNQMP_BBU_H + +#include <bbu.h> + +#ifdef CONFIG_BAREBOX_UPDATE +int zynqmp_bbu_register_handler(const char *name, char *devicefile, + unsigned long flags); +#else +static int zynqmp_bbu_register_handler(const char *name, char *devicefile, + unsigned long flags) +{ + return 0; +}; +#endif + +#endif /* __MACH_ZYNQMP_BBU_H */ diff --git a/arch/arm/mach-zynqmp/zynqmp-bbu.c b/arch/arm/mach-zynqmp/zynqmp-bbu.c new file mode 100644 index 0000000000..d1197c01dc --- /dev/null +++ b/arch/arm/mach-zynqmp/zynqmp-bbu.c @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2020 Michael Tretter <m.tretter@pengutronix.de> + */ + +#include <common.h> +#include <libfile.h> +#include <mach/zynqmp-bbu.h> + +static int zynqmp_bbu_handler(struct bbu_handler *handler, + struct bbu_data *data) +{ + int ret = 0; + + ret = bbu_confirm(data); + if (ret) + return ret; + + ret = copy_file(data->imagefile, data->devicefile, 1); + if (ret < 0) { + pr_err("update failed: %s", strerror(-ret)); + return ret; + } + + return ret; +} + +int zynqmp_bbu_register_handler(const char *name, char *devicefile, + unsigned long flags) +{ + struct bbu_handler *handler; + int ret = 0; + + if (!name || !devicefile) + return -EINVAL; + + handler = xzalloc(sizeof(*handler)); + handler->name = name; + handler->devicefile = devicefile; + handler->flags = flags; + handler->handler = zynqmp_bbu_handler; + + ret = bbu_register_handler(handler); + if (ret) + free(handler); + + return ret; +} |