xref: /rk3399_ARM-atf/plat/arm/common/arm_bl1_setup.c (revision 4adb10c1ede9773ce018ddb3b56f5eb900f220f8)
1b4315306SDan Handley /*
2bf75a371SAntonio Nino Diaz  * Copyright (c) 2015-2017, 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>
10b4315306SDan Handley #include <bl_common.h>
11b4315306SDan Handley #include <console.h>
12b4315306SDan Handley #include <plat_arm.h>
13*4adb10c1SIsla Mitchell #include <platform_def.h>
147b4c1405SJuan Castillo #include <sp805.h>
15af419dd6SSandrine Bailleux #include <utils.h>
163ae8a360SSandrine Bailleux #include "../../../bl1/bl1_private.h"
17b4315306SDan Handley 
18b4315306SDan Handley /* Weak definitions may be overridden in specific ARM standard platform */
19b4315306SDan Handley #pragma weak bl1_early_platform_setup
20b4315306SDan Handley #pragma weak bl1_plat_arch_setup
21b4315306SDan Handley #pragma weak bl1_platform_setup
22b4315306SDan Handley #pragma weak bl1_plat_sec_mem_layout
2307570d59SYatharth Kochar #pragma weak bl1_plat_prepare_exit
24b4315306SDan Handley 
25b4315306SDan Handley 
26b4315306SDan Handley /* Data structure which holds the extents of the trusted SRAM for BL1*/
27b4315306SDan Handley static meminfo_t bl1_tzram_layout;
28b4315306SDan Handley 
29b4315306SDan Handley meminfo_t *bl1_plat_sec_mem_layout(void)
30b4315306SDan Handley {
31b4315306SDan Handley 	return &bl1_tzram_layout;
32b4315306SDan Handley }
33b4315306SDan Handley 
34b4315306SDan Handley /*******************************************************************************
35b4315306SDan Handley  * BL1 specific platform actions shared between ARM standard platforms.
36b4315306SDan Handley  ******************************************************************************/
37b4315306SDan Handley void arm_bl1_early_platform_setup(void)
38b4315306SDan Handley {
39b4315306SDan Handley 
407b4c1405SJuan Castillo #if !ARM_DISABLE_TRUSTED_WDOG
417b4c1405SJuan Castillo 	/* Enable watchdog */
427b4c1405SJuan Castillo 	sp805_start(ARM_SP805_TWDG_BASE, ARM_TWDG_LOAD_VAL);
437b4c1405SJuan Castillo #endif
447b4c1405SJuan Castillo 
45b4315306SDan Handley 	/* Initialize the console to provide early debug support */
46b4315306SDan Handley 	console_init(PLAT_ARM_BOOT_UART_BASE, PLAT_ARM_BOOT_UART_CLK_IN_HZ,
47b4315306SDan Handley 			ARM_CONSOLE_BAUDRATE);
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();
118b4315306SDan Handley }
119b4315306SDan Handley 
120b4315306SDan Handley void bl1_platform_setup(void)
121b4315306SDan Handley {
122b4315306SDan Handley 	arm_bl1_platform_setup();
123b4315306SDan Handley }
124b4315306SDan Handley 
1254c117f6cSSandrine Bailleux void bl1_plat_prepare_exit(entry_point_info_t *ep_info)
1264c117f6cSSandrine Bailleux {
1277b4c1405SJuan Castillo #if !ARM_DISABLE_TRUSTED_WDOG
1287b4c1405SJuan Castillo 	/* Disable watchdog before leaving BL1 */
1297b4c1405SJuan Castillo 	sp805_stop(ARM_SP805_TWDG_BASE);
1307b4c1405SJuan Castillo #endif
1317b4c1405SJuan Castillo 
1324c117f6cSSandrine Bailleux #ifdef EL3_PAYLOAD_BASE
1334c117f6cSSandrine Bailleux 	/*
1344c117f6cSSandrine Bailleux 	 * Program the EL3 payload's entry point address into the CPUs mailbox
1354c117f6cSSandrine Bailleux 	 * in order to release secondary CPUs from their holding pen and make
1364c117f6cSSandrine Bailleux 	 * them jump there.
1374c117f6cSSandrine Bailleux 	 */
1384c117f6cSSandrine Bailleux 	arm_program_trusted_mailbox(ep_info->pc);
1394c117f6cSSandrine Bailleux 	dsbsy();
1404c117f6cSSandrine Bailleux 	sev();
1414c117f6cSSandrine Bailleux #endif
1424c117f6cSSandrine Bailleux }
143