xref: /rk3399_ARM-atf/plat/arm/common/arm_bl1_setup.c (revision 6c77e7491563979a3a0ba5eb8b8c6a073cb5c2cb)
1b4315306SDan Handley /*
2c228956aSSoby Mathew  * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
3b4315306SDan Handley  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
5b4315306SDan Handley  */
6b4315306SDan Handley 
7b4315306SDan Handley #include <arch.h>
8b4315306SDan Handley #include <arm_def.h>
93b211ff5SAntonio Nino Diaz #include <arm_xlat_tables.h>
101af540efSRoberto Vargas #include <bl1.h>
11b4315306SDan Handley #include <bl_common.h>
12b4315306SDan Handley #include <plat_arm.h>
131af540efSRoberto Vargas #include <platform.h>
144adb10c1SIsla Mitchell #include <platform_def.h>
157b4c1405SJuan Castillo #include <sp805.h>
16af419dd6SSandrine Bailleux #include <utils.h>
173ae8a360SSandrine Bailleux #include "../../../bl1/bl1_private.h"
18b4315306SDan Handley 
19b4315306SDan Handley /* Weak definitions may be overridden in specific ARM standard platform */
20b4315306SDan Handley #pragma weak bl1_early_platform_setup
21b4315306SDan Handley #pragma weak bl1_plat_arch_setup
22b4315306SDan Handley #pragma weak bl1_platform_setup
23b4315306SDan Handley #pragma weak bl1_plat_sec_mem_layout
2407570d59SYatharth Kochar #pragma weak bl1_plat_prepare_exit
25b4315306SDan Handley 
26b4315306SDan Handley 
27b4315306SDan Handley /* Data structure which holds the extents of the trusted SRAM for BL1*/
28b4315306SDan Handley static meminfo_t bl1_tzram_layout;
29b4315306SDan Handley 
30*6c77e749SSandrine Bailleux struct meminfo *bl1_plat_sec_mem_layout(void)
31b4315306SDan Handley {
32b4315306SDan Handley 	return &bl1_tzram_layout;
33b4315306SDan Handley }
34b4315306SDan Handley 
35b4315306SDan Handley /*******************************************************************************
36b4315306SDan Handley  * BL1 specific platform actions shared between ARM standard platforms.
37b4315306SDan Handley  ******************************************************************************/
38b4315306SDan Handley void arm_bl1_early_platform_setup(void)
39b4315306SDan Handley {
40b4315306SDan Handley 
417b4c1405SJuan Castillo #if !ARM_DISABLE_TRUSTED_WDOG
427b4c1405SJuan Castillo 	/* Enable watchdog */
437b4c1405SJuan Castillo 	sp805_start(ARM_SP805_TWDG_BASE, ARM_TWDG_LOAD_VAL);
447b4c1405SJuan Castillo #endif
457b4c1405SJuan Castillo 
46b4315306SDan Handley 	/* Initialize the console to provide early debug support */
4788a0523eSAntonio Nino Diaz 	arm_console_boot_init();
48b4315306SDan Handley 
49b4315306SDan Handley 	/* Allow BL1 to see the whole Trusted RAM */
50b4315306SDan Handley 	bl1_tzram_layout.total_base = ARM_BL_RAM_BASE;
51b4315306SDan Handley 	bl1_tzram_layout.total_size = ARM_BL_RAM_SIZE;
52b4315306SDan Handley 
53a8aa7fecSYatharth Kochar #if !LOAD_IMAGE_V2
54b4315306SDan Handley 	/* Calculate how much RAM BL1 is using and how much remains free */
55b4315306SDan Handley 	bl1_tzram_layout.free_base = ARM_BL_RAM_BASE;
56b4315306SDan Handley 	bl1_tzram_layout.free_size = ARM_BL_RAM_SIZE;
57b4315306SDan Handley 	reserve_mem(&bl1_tzram_layout.free_base,
58b4315306SDan Handley 		    &bl1_tzram_layout.free_size,
59b4315306SDan Handley 		    BL1_RAM_BASE,
60a8aa7fecSYatharth Kochar 		    BL1_RAM_LIMIT - BL1_RAM_BASE);
61a8aa7fecSYatharth Kochar #endif /* LOAD_IMAGE_V2 */
62b4315306SDan Handley }
63b4315306SDan Handley 
64b4315306SDan Handley void bl1_early_platform_setup(void)
65b4315306SDan Handley {
66b4315306SDan Handley 	arm_bl1_early_platform_setup();
67b4315306SDan Handley 
68b4315306SDan Handley 	/*
696355f234SVikram Kanigiri 	 * Initialize Interconnect for this cluster during cold boot.
70b4315306SDan Handley 	 * No need for locks as no other CPU is active.
71b4315306SDan Handley 	 */
726355f234SVikram Kanigiri 	plat_arm_interconnect_init();
73b4315306SDan Handley 	/*
746355f234SVikram Kanigiri 	 * Enable Interconnect coherency for the primary CPU's cluster.
75b4315306SDan Handley 	 */
766355f234SVikram Kanigiri 	plat_arm_interconnect_enter_coherency();
77b4315306SDan Handley }
78b4315306SDan Handley 
79b4315306SDan Handley /******************************************************************************
80b4315306SDan Handley  * Perform the very early platform specific architecture setup shared between
81b4315306SDan Handley  * ARM standard platforms. This only does basic initialization. Later
82b4315306SDan Handley  * architectural setup (bl1_arch_setup()) does not do anything platform
83b4315306SDan Handley  * specific.
84b4315306SDan Handley  *****************************************************************************/
85b4315306SDan Handley void arm_bl1_plat_arch_setup(void)
86b4315306SDan Handley {
87b5fa6563SSandrine Bailleux 	arm_setup_page_tables(bl1_tzram_layout.total_base,
88b4315306SDan Handley 			      bl1_tzram_layout.total_size,
890af559a8SSandrine Bailleux 			      BL_CODE_BASE,
90ecdc898dSMasahiro Yamada 			      BL1_CODE_END,
910af559a8SSandrine Bailleux 			      BL1_RO_DATA_BASE,
92ecdc898dSMasahiro Yamada 			      BL1_RO_DATA_END
93b4315306SDan Handley #if USE_COHERENT_MEM
9447497053SMasahiro Yamada 			      , BL_COHERENT_RAM_BASE,
9547497053SMasahiro Yamada 			      BL_COHERENT_RAM_END
96b4315306SDan Handley #endif
97b4315306SDan Handley 			     );
9883fc4a93SYatharth Kochar #ifdef AARCH32
9983fc4a93SYatharth Kochar 	enable_mmu_secure(0);
10083fc4a93SYatharth Kochar #else
101b5fa6563SSandrine Bailleux 	enable_mmu_el3(0);
10283fc4a93SYatharth Kochar #endif /* AARCH32 */
103b4315306SDan Handley }
104b4315306SDan Handley 
105b4315306SDan Handley void bl1_plat_arch_setup(void)
106b4315306SDan Handley {
107b4315306SDan Handley 	arm_bl1_plat_arch_setup();
108b4315306SDan Handley }
109b4315306SDan Handley 
110b4315306SDan Handley /*
111b4315306SDan Handley  * Perform the platform specific architecture setup shared between
112b4315306SDan Handley  * ARM standard platforms.
113b4315306SDan Handley  */
114b4315306SDan Handley void arm_bl1_platform_setup(void)
115b4315306SDan Handley {
116b4315306SDan Handley 	/* Initialise the IO layer and register platform IO devices */
117b4315306SDan Handley 	plat_arm_io_setup();
118c228956aSSoby Mathew #if LOAD_IMAGE_V2
119c228956aSSoby Mathew 	arm_load_tb_fw_config();
120c228956aSSoby Mathew #endif
1213208edcdSSoby Mathew 	/*
1223208edcdSSoby Mathew 	 * Allow access to the System counter timer module and program
1233208edcdSSoby Mathew 	 * counter frequency for non secure images during FWU
1243208edcdSSoby Mathew 	 */
1253208edcdSSoby Mathew 	arm_configure_sys_timer();
1263208edcdSSoby Mathew 	write_cntfrq_el0(plat_get_syscnt_freq2());
127b4315306SDan Handley }
128b4315306SDan Handley 
129b4315306SDan Handley void bl1_platform_setup(void)
130b4315306SDan Handley {
131b4315306SDan Handley 	arm_bl1_platform_setup();
132b4315306SDan Handley }
133b4315306SDan Handley 
1344c117f6cSSandrine Bailleux void bl1_plat_prepare_exit(entry_point_info_t *ep_info)
1354c117f6cSSandrine Bailleux {
1367b4c1405SJuan Castillo #if !ARM_DISABLE_TRUSTED_WDOG
1377b4c1405SJuan Castillo 	/* Disable watchdog before leaving BL1 */
1387b4c1405SJuan Castillo 	sp805_stop(ARM_SP805_TWDG_BASE);
1397b4c1405SJuan Castillo #endif
1407b4c1405SJuan Castillo 
1414c117f6cSSandrine Bailleux #ifdef EL3_PAYLOAD_BASE
1424c117f6cSSandrine Bailleux 	/*
1434c117f6cSSandrine Bailleux 	 * Program the EL3 payload's entry point address into the CPUs mailbox
1444c117f6cSSandrine Bailleux 	 * in order to release secondary CPUs from their holding pen and make
1454c117f6cSSandrine Bailleux 	 * them jump there.
1464c117f6cSSandrine Bailleux 	 */
1474c117f6cSSandrine Bailleux 	arm_program_trusted_mailbox(ep_info->pc);
1484c117f6cSSandrine Bailleux 	dsbsy();
1494c117f6cSSandrine Bailleux 	sev();
1504c117f6cSSandrine Bailleux #endif
1514c117f6cSSandrine Bailleux }
1527b56928aSSoby Mathew 
1537b56928aSSoby Mathew /*******************************************************************************
1547b56928aSSoby Mathew  * The following function checks if Firmware update is needed,
1557b56928aSSoby Mathew  * by checking if TOC in FIP image is valid or not.
1567b56928aSSoby Mathew  ******************************************************************************/
1577b56928aSSoby Mathew unsigned int bl1_plat_get_next_image_id(void)
1587b56928aSSoby Mathew {
1597b56928aSSoby Mathew 	if (!arm_io_is_toc_valid())
1607b56928aSSoby Mathew 		return NS_BL1U_IMAGE_ID;
1617b56928aSSoby Mathew 
1627b56928aSSoby Mathew 	return BL2_IMAGE_ID;
1637b56928aSSoby Mathew }
164