From: Michal Simek Date: Thu, 27 Nov 2025 08:28:46 +0000 (+0100) Subject: arm64: versal2: Read and show multiboot value X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=29427fdf7198953f361ce6535b67272e3645d53b;p=thirdparty%2Fu-boot.git arm64: versal2: Read and show multiboot value 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 Link: https://lore.kernel.org/r/fd7564ce2f51d965c273e939e98de01beb92e6f5.1764232124.git.michal.simek@amd.com --- diff --git a/arch/arm/mach-versal2/include/mach/hardware.h b/arch/arm/mach-versal2/include/mach/hardware.h index 7ca2bbb7550..81a0df89357 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 7d91d288d2e..1fd05a1157a 100644 --- a/board/amd/versal2/board.c +++ b/board/amd/versal2/board.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "../../xilinx/common/board.h" #include @@ -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 2ef499bf408..f8a9945c1da 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) {