From 74847ab203ca1801b450d32a61f3a3cb98adf83b Mon Sep 17 00:00:00 2001 From: Soby Mathew Date: Tue, 6 Mar 2018 15:22:55 +0000 Subject: [PATCH 1/2] BL2U: Fix ARM platform timer initilization This issue was detected when testing FWU on Juno. The Timer `timer_ops` was not being initialized before being used by the SDS driver on Juno. This patch adds the call to `generic_delay_timer_init()` during bl2u_early_platform_setup(). This is done generically for all ARM platforms because the cost involved is minimal. Change-Id: I349cf0bd1db68406eb2298b65f9c729f792cabdc Signed-off-by: Soby Mathew --- plat/arm/common/arm_bl2u_setup.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plat/arm/common/arm_bl2u_setup.c b/plat/arm/common/arm_bl2u_setup.c index cc291fc90..3b8e4aa46 100644 --- a/plat/arm/common/arm_bl2u_setup.c +++ b/plat/arm/common/arm_bl2u_setup.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,7 @@ void arm_bl2u_early_platform_setup(meminfo_t *mem_layout, void *plat_info) /* Initialize the console to provide early debug support */ console_init(PLAT_ARM_BOOT_UART_BASE, PLAT_ARM_BOOT_UART_CLK_IN_HZ, ARM_CONSOLE_BAUDRATE); + generic_delay_timer_init(); } /******************************************************************************* From 7b56928a122f4ba19b5f3d6b834590de2e82a978 Mon Sep 17 00:00:00 2001 From: Soby Mathew Date: Wed, 7 Mar 2018 11:32:04 +0000 Subject: [PATCH 2/2] Juno: Change the Firmware update detect mechanism Previously, Juno used to depend on the SSC_GPRETN register to inform about the reset syndrome. This method was removed when SCP migrated to the SDS framework. But even the SDS framework doesn't report the reset syndrome correctly and hence Juno failed to enter Firmware update mode if BL2 authentication failed. In addition to that, the error code populated in V2M_SYS_NVFLAGS register does not seem to be retained any more on Juno across resets. This could be down to the motherboard firmware not doing the necessary to preserve the value. Hence this patch modifies the Juno platform to use the same mechanism to trigger firmware update as FVP which is to corrupt the FIP TOC on authentication failure. The implementation in `fvp_err.c` is made common for ARM platforms and is moved to the new `arm_err.c` file in plat/arm/common folder. The BL1 and BL2 mmap table entries for Juno are modified to allow write to the Flash memory address. Change-Id: Ica7d49a3e8a46a90efd4cf340f19fda3b549e945 Signed-off-by: Soby Mathew --- plat/arm/board/common/board_css_common.c | 4 +-- plat/arm/board/fvp/fvp_bl1_setup.c | 13 --------- plat/arm/board/fvp/platform.mk | 2 -- plat/arm/board/juno/juno_bl1_setup.c | 23 ---------------- plat/arm/board/juno/juno_err.c | 27 ------------------- plat/arm/board/juno/platform.mk | 4 +-- plat/arm/common/arm_bl1_setup.c | 12 +++++++++ plat/arm/common/arm_common.mk | 2 ++ .../{board/fvp/fvp_err.c => common/arm_err.c} | 7 +++-- 9 files changed, 22 insertions(+), 72 deletions(-) delete mode 100644 plat/arm/board/juno/juno_err.c rename plat/arm/{board/fvp/fvp_err.c => common/arm_err.c} (87%) diff --git a/plat/arm/board/common/board_css_common.c b/plat/arm/board/common/board_css_common.c index 032ebdf7e..c1c3e66a6 100644 --- a/plat/arm/board/common/board_css_common.c +++ b/plat/arm/board/common/board_css_common.c @@ -14,7 +14,7 @@ #ifdef IMAGE_BL1 const mmap_region_t plat_arm_mmap[] = { ARM_MAP_SHARED_RAM, - V2M_MAP_FLASH0_RO, + V2M_MAP_FLASH0_RW, V2M_MAP_IOFPGA, CSS_MAP_DEVICE, SOC_CSS_MAP_DEVICE, @@ -28,7 +28,7 @@ const mmap_region_t plat_arm_mmap[] = { #ifdef IMAGE_BL2 const mmap_region_t plat_arm_mmap[] = { ARM_MAP_SHARED_RAM, - V2M_MAP_FLASH0_RO, + V2M_MAP_FLASH0_RW, #ifdef PLAT_ARM_MEM_PROT_ADDR ARM_V2M_MAP_MEM_PROTECT, #endif diff --git a/plat/arm/board/fvp/fvp_bl1_setup.c b/plat/arm/board/fvp/fvp_bl1_setup.c index d50c20a1d..4b2a340b0 100644 --- a/plat/arm/board/fvp/fvp_bl1_setup.c +++ b/plat/arm/board/fvp/fvp_bl1_setup.c @@ -30,16 +30,3 @@ void bl1_early_platform_setup(void) */ fvp_interconnect_enable(); } - -/******************************************************************************* - * The following function checks if Firmware update is needed, - * by checking if TOC in FIP image is valid or not. - ******************************************************************************/ -unsigned int bl1_plat_get_next_image_id(void) -{ - if (!arm_io_is_toc_valid()) - return NS_BL1U_IMAGE_ID; - - return BL2_IMAGE_ID; -} - diff --git a/plat/arm/board/fvp/platform.mk b/plat/arm/board/fvp/platform.mk index 3dca4c2ac..bb7753822 100644 --- a/plat/arm/board/fvp/platform.mk +++ b/plat/arm/board/fvp/platform.mk @@ -124,7 +124,6 @@ BL1_SOURCES += drivers/io/io_semihosting.c \ lib/semihosting/${ARCH}/semihosting_call.S \ plat/arm/board/fvp/${ARCH}/fvp_helpers.S \ plat/arm/board/fvp/fvp_bl1_setup.c \ - plat/arm/board/fvp/fvp_err.c \ plat/arm/board/fvp/fvp_io_storage.c \ plat/arm/board/fvp/fvp_trusted_boot.c \ ${FVP_CPU_LIBS} \ @@ -135,7 +134,6 @@ BL2_SOURCES += drivers/io/io_semihosting.c \ lib/semihosting/semihosting.c \ lib/semihosting/${ARCH}/semihosting_call.S \ plat/arm/board/fvp/fvp_bl2_setup.c \ - plat/arm/board/fvp/fvp_err.c \ plat/arm/board/fvp/fvp_io_storage.c \ plat/arm/board/fvp/fvp_trusted_boot.c \ ${FVP_SECURITY_SOURCES} diff --git a/plat/arm/board/juno/juno_bl1_setup.c b/plat/arm/board/juno/juno_bl1_setup.c index 7c026bcb7..836a67255 100644 --- a/plat/arm/board/juno/juno_bl1_setup.c +++ b/plat/arm/board/juno/juno_bl1_setup.c @@ -12,31 +12,8 @@ #include #include -#define RESET_REASON_WDOG_RESET (0x2) - void juno_reset_to_aarch32_state(void); - -/******************************************************************************* - * The following function checks if Firmware update is needed, - * by checking if TOC in FIP image is valid or watchdog reset happened. - ******************************************************************************/ -unsigned int bl1_plat_get_next_image_id(void) -{ - unsigned int *reset_flags_ptr = (unsigned int *)SSC_GPRETN; - unsigned int *nv_flags_ptr = (unsigned int *) - (V2M_SYSREGS_BASE + V2M_SYS_NVFLAGS); - /* - * Check if TOC is invalid or watchdog reset happened. - */ - if ((arm_io_is_toc_valid() != 1) || - ((*reset_flags_ptr & RESET_REASON_WDOG_RESET) && - ((*nv_flags_ptr == -EAUTH) || (*nv_flags_ptr == -ENOENT)))) - return NS_BL1U_IMAGE_ID; - - return BL2_IMAGE_ID; -} - /******************************************************************************* * On JUNO update the arg2 with address of SCP_BL2U image info. ******************************************************************************/ diff --git a/plat/arm/board/juno/juno_err.c b/plat/arm/board/juno/juno_err.c deleted file mode 100644 index 0fe701675..000000000 --- a/plat/arm/board/juno/juno_err.c +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include -#include - -#define V2M_SYS_NVFLAGS_ADDR (V2M_SYSREGS_BASE + V2M_SYS_NVFLAGS) - -/* - * Juno error handler - */ -void plat_error_handler(int err) -{ - uint32_t *flags_ptr = (uint32_t *)V2M_SYS_NVFLAGS_ADDR; - - /* Propagate the err code in the NV-flags register */ - *flags_ptr = err; - - /* Loop until the watchdog resets the system */ - for (;;) - wfi(); -} diff --git a/plat/arm/board/juno/platform.mk b/plat/arm/board/juno/platform.mk index 70d690922..656fc14c7 100644 --- a/plat/arm/board/juno/platform.mk +++ b/plat/arm/board/juno/platform.mk @@ -49,12 +49,10 @@ BL1_SOURCES += lib/cpus/aarch64/cortex_a53.S \ lib/cpus/aarch64/cortex_a57.S \ lib/cpus/aarch64/cortex_a72.S \ plat/arm/board/juno/juno_bl1_setup.c \ - plat/arm/board/juno/juno_err.c \ ${JUNO_INTERCONNECT_SOURCES} \ ${JUNO_SECURITY_SOURCES} -BL2_SOURCES += plat/arm/board/juno/juno_err.c \ - plat/arm/board/juno/juno_bl2_setup.c \ +BL2_SOURCES += plat/arm/board/juno/juno_bl2_setup.c \ ${JUNO_SECURITY_SOURCES} BL2U_SOURCES += ${JUNO_SECURITY_SOURCES} diff --git a/plat/arm/common/arm_bl1_setup.c b/plat/arm/common/arm_bl1_setup.c index 3a30eca67..379e87df2 100644 --- a/plat/arm/common/arm_bl1_setup.c +++ b/plat/arm/common/arm_bl1_setup.c @@ -145,3 +145,15 @@ void bl1_plat_prepare_exit(entry_point_info_t *ep_info) sev(); #endif } + +/******************************************************************************* + * The following function checks if Firmware update is needed, + * by checking if TOC in FIP image is valid or not. + ******************************************************************************/ +unsigned int bl1_plat_get_next_image_id(void) +{ + if (!arm_io_is_toc_valid()) + return NS_BL1U_IMAGE_ID; + + return BL2_IMAGE_ID; +} diff --git a/plat/arm/common/arm_common.mk b/plat/arm/common/arm_common.mk index b3462ab8a..015e454a1 100644 --- a/plat/arm/common/arm_common.mk +++ b/plat/arm/common/arm_common.mk @@ -137,6 +137,7 @@ BL1_SOURCES += drivers/arm/sp805/sp805.c \ drivers/io/io_storage.c \ plat/arm/common/arm_bl1_setup.c \ plat/arm/common/arm_dyn_cfg.c \ + plat/arm/common/arm_err.c \ plat/arm/common/arm_io_storage.c ifdef EL3_PAYLOAD_BASE # Need the arm_program_trusted_mailbox() function to release secondary CPUs from @@ -150,6 +151,7 @@ BL2_SOURCES += drivers/delay_timer/delay_timer.c \ drivers/io/io_memmap.c \ drivers/io/io_storage.c \ plat/arm/common/arm_bl2_setup.c \ + plat/arm/common/arm_err.c \ plat/arm/common/arm_io_storage.c # Add `libfdt` and Arm common helpers required for Dynamic Config diff --git a/plat/arm/board/fvp/fvp_err.c b/plat/arm/common/arm_err.c similarity index 87% rename from plat/arm/board/fvp/fvp_err.c rename to plat/arm/common/arm_err.c index d9ad5175b..59c586181 100644 --- a/plat/arm/board/fvp/fvp_err.c +++ b/plat/arm/common/arm_err.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -13,7 +14,7 @@ #include /* - * FVP error handler + * ARM common implementation for error handler */ void plat_error_handler(int err) { @@ -26,7 +27,7 @@ void plat_error_handler(int err) INFO("Erasing FIP ToC from flash...\n"); nor_unlock(PLAT_ARM_FIP_BASE); ret = nor_word_program(PLAT_ARM_FIP_BASE, 0); - if (ret) { + if (ret != 0) { ERROR("Cannot erase ToC\n"); } else { INFO("Done\n"); @@ -37,6 +38,8 @@ void plat_error_handler(int err) break; } + (void)console_flush(); + /* Loop until the watchdog resets the system */ for (;;) wfi();