[PATCH] arm64: versal2: Read and show multiboot value
Michal Simek
michal.simek at amd.com
Wed Dec 10 08:37:01 CET 2025
On 11/27/25 09:28, Michal Simek wrote:
> SOC can boot from different boot medias and also different offsets that's
> why by default show multiboot value to be aware which image system is
> booting out of. It is especially useful for systems with A/B update
> enabled.
> Also limit zynqmp_pm_get_pmc_multi_boot_reg() usage only for Versal and
> Versal Gen 2.
>
> Signed-off-by: Michal Simek <michal.simek at amd.com>
> ---
>
> arch/arm/mach-versal2/include/mach/hardware.h | 4 +++-
> board/amd/versal2/board.c | 22 +++++++++++++++++++
> drivers/firmware/firmware-zynqmp.c | 2 ++
> 3 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/mach-versal2/include/mach/hardware.h b/arch/arm/mach-versal2/include/mach/hardware.h
> index 7ca2bbb7550f..81a0df893574 100644
> --- a/arch/arm/mach-versal2/include/mach/hardware.h
> +++ b/arch/arm/mach-versal2/include/mach/hardware.h
> @@ -1,7 +1,7 @@
> /* SPDX-License-Identifier: GPL-2.0 */
> /*
> * Copyright (C) 2016 - 2022, Xilinx, Inc.
> - * Copyright (C) 2022 - 2024, Advanced Micro Devices, Inc.
> + * Copyright (C) 2022 - 2025, Advanced Micro Devices, Inc.
> */
>
> #ifndef __ASSEMBLY__
> @@ -73,6 +73,8 @@ struct crp_regs {
> #define JTAG_MODE 0x00000000
> #define BOOT_MODE_USE_ALT 0x100
> #define BOOT_MODE_ALT_SHIFT 12
> +#define PMC_MULTI_BOOT_REG 0xF1110004
> +#define PMC_MULTI_BOOT_MASK 0x1FFF
>
> enum versal2_platform {
> VERSAL2_SILICON = 0,
> diff --git a/board/amd/versal2/board.c b/board/amd/versal2/board.c
> index 7d91d288d2ed..1fd05a1157ab 100644
> --- a/board/amd/versal2/board.c
> +++ b/board/amd/versal2/board.c
> @@ -21,6 +21,7 @@
> #include <dm/device.h>
> #include <dm/uclass.h>
> #include <versalpl.h>
> +#include <zynqmp_firmware.h>
> #include "../../xilinx/common/board.h"
>
> #include <linux/bitfield.h>
> @@ -180,6 +181,23 @@ static u8 versal2_get_bootmode(void)
> return bootmode;
> }
>
> +static u32 versal2_multi_boot(void)
> +{
> + u8 bootmode = versal2_get_bootmode();
> + u32 reg = 0;
> +
> + /* Mostly workaround for QEMU CI pipeline */
> + if (bootmode == JTAG_MODE)
> + return 0;
> +
> + if (IS_ENABLED(CONFIG_ZYNQMP_FIRMWARE) && current_el() != 3)
> + reg = zynqmp_pm_get_pmc_multi_boot_reg();
> + else
> + reg = readl(PMC_MULTI_BOOT_REG);
> +
> + return reg & PMC_MULTI_BOOT_MASK;
> +}
> +
> static int boot_targets_setup(void)
> {
> u8 bootmode;
> @@ -319,6 +337,7 @@ static int boot_targets_setup(void)
> int board_late_init(void)
> {
> int ret;
> + u32 multiboot;
>
> if (!(gd->flags & GD_FLG_ENV_DEFAULT)) {
> debug("Saved variables - Skipping\n");
> @@ -328,6 +347,9 @@ int board_late_init(void)
> if (!IS_ENABLED(CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG))
> return 0;
>
> + multiboot = versal2_multi_boot();
> + env_set_hex("multiboot", multiboot);
> +
> if (IS_ENABLED(CONFIG_DISTRO_DEFAULTS)) {
> ret = boot_targets_setup();
> if (ret)
> diff --git a/drivers/firmware/firmware-zynqmp.c b/drivers/firmware/firmware-zynqmp.c
> index 2ef499bf4084..f8a9945c1daa 100644
> --- a/drivers/firmware/firmware-zynqmp.c
> +++ b/drivers/firmware/firmware-zynqmp.c
> @@ -248,6 +248,7 @@ u32 zynqmp_pm_get_bootmode_reg(void)
> return ret_payload[1];
> }
>
> +#if defined(CONFIG_ARCH_VERSAL) || defined(CONFIG_ARCH_VERSAL2)
> u32 zynqmp_pm_get_pmc_multi_boot_reg(void)
> {
> int ret;
> @@ -271,6 +272,7 @@ u32 zynqmp_pm_get_pmc_multi_boot_reg(void)
>
> return ret_payload[1];
> }
> +#endif
>
> int zynqmp_pm_feature(const u32 api_id)
> {
Applied.
M
More information about the U-Boot
mailing list