1 /* 2 * Copyright (c) 2013-2021, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <assert.h> 8 #include <errno.h> 9 10 #include <bl1/bl1.h> 11 #include <common/tbbr/tbbr_img_def.h> 12 #include <drivers/arm/smmu_v3.h> 13 #include <drivers/arm/sp805.h> 14 #include <lib/mmio.h> 15 #include <plat/arm/common/arm_config.h> 16 #include <plat/arm/common/plat_arm.h> 17 #include <plat/arm/common/arm_def.h> 18 #include <plat/common/platform.h> 19 #include "fvp_private.h" 20 21 /******************************************************************************* 22 * Perform any BL1 specific platform actions. 23 ******************************************************************************/ bl1_early_platform_setup(void)24void bl1_early_platform_setup(void) 25 { 26 arm_bl1_early_platform_setup(); 27 28 /* Initialize the platform config for future decision making */ 29 fvp_config_setup(); 30 31 /* 32 * Initialize Interconnect for this cluster during cold boot. 33 * No need for locks as no other CPU is active. 34 */ 35 fvp_interconnect_init(); 36 /* 37 * Enable coherency in Interconnect for the primary CPU's cluster. 38 */ 39 fvp_interconnect_enable(); 40 } 41 plat_arm_secure_wdt_start(void)42void plat_arm_secure_wdt_start(void) 43 { 44 sp805_start(ARM_SP805_TWDG_BASE, ARM_TWDG_LOAD_VAL); 45 } 46 plat_arm_secure_wdt_stop(void)47void plat_arm_secure_wdt_stop(void) 48 { 49 sp805_stop(ARM_SP805_TWDG_BASE); 50 } 51 bl1_platform_setup(void)52void bl1_platform_setup(void) 53 { 54 arm_bl1_platform_setup(); 55 56 /* Initialize System level generic or SP804 timer */ 57 fvp_timer_init(); 58 59 /* On FVP RevC, initialize SMMUv3 */ 60 if ((arm_config.flags & ARM_CONFIG_FVP_HAS_SMMUV3) != 0U) 61 smmuv3_security_init(PLAT_FVP_SMMUV3_BASE); 62 } 63 bl1_plat_fwu_done(void * client_cookie,void * reserved)64__dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved) 65 { 66 uint32_t nv_flags = mmio_read_32(V2M_SYS_NVFLAGS_ADDR); 67 68 /* Clear the NV flags register. */ 69 mmio_write_32((V2M_SYSREGS_BASE + V2M_SYS_NVFLAGSCLR), 70 nv_flags); 71 72 /* Setup the watchdog to reset the system as soon as possible */ 73 sp805_refresh(ARM_SP805_TWDG_BASE, 1U); 74 75 while (true) 76 wfi(); 77 } 78 79 /******************************************************************************* 80 * The following function checks if Firmware update is needed by checking error 81 * reported in NV flag. 82 ******************************************************************************/ plat_arm_bl1_fwu_needed(void)83bool plat_arm_bl1_fwu_needed(void) 84 { 85 int32_t nv_flags = (int32_t)mmio_read_32(V2M_SYS_NVFLAGS_ADDR); 86 87 /* if image load/authentication failed */ 88 return ((nv_flags == -EAUTH) || (nv_flags == -ENOENT)); 89 } 90