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)24 void 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)42 void 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)47 void plat_arm_secure_wdt_stop(void)
48 {
49 	sp805_stop(ARM_SP805_TWDG_BASE);
50 }
51 
bl1_platform_setup(void)52 void 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)83 bool 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