d85ae96efd0c334c8cda369c03f09659f56f1729
2 * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
7 #include <arch_helpers.h>
12 #include <delay_timer.h>
13 #include <desc_image_load.h>
14 #include <generic_delay_timer.h>
17 #include <platform_def.h>
18 #include <stm32_console.h>
19 #include <stm32mp1_clk.h>
20 #include <stm32mp1_context.h>
21 #include <stm32mp1_dt.h>
22 #include <stm32mp1_pmic.h>
23 #include <stm32mp1_private.h>
24 #include <stm32mp1_pwr.h>
25 #include <stm32mp1_ram.h>
26 #include <stm32mp1_rcc.h>
27 #include <stm32mp1_reset.h>
29 #include <xlat_tables_v2.h>
31 static struct console_stm32 console
;
33 void bl2_el3_early_platform_setup(u_register_t arg0
, u_register_t arg1
,
34 u_register_t arg2
, u_register_t arg3
)
36 stm32mp1_save_boot_ctx_address(arg0
);
39 void bl2_platform_setup(void)
43 if (dt_check_pmic()) {
47 ret
= stm32mp1_ddr_probe();
49 ERROR("Invalid DDR init: error %d\n", ret
);
53 INFO("BL2 runs SP_MIN setup\n");
56 void bl2_el3_plat_arch_setup(void)
59 struct dt_node_info dt_dev_info
;
60 const char *board_model
;
61 boot_api_context_t
*boot_context
=
62 (boot_api_context_t
*)stm32mp1_get_boot_ctx_address();
66 * Disable the backup domain write protection.
67 * The protection is enable at each reset by hardware
68 * and must be disabled by software.
70 mmio_setbits_32(PWR_BASE
+ PWR_CR1
, PWR_CR1_DBP
);
72 while ((mmio_read_32(PWR_BASE
+ PWR_CR1
) & PWR_CR1_DBP
) == 0U) {
76 /* Reset backup domain on cold boot cases */
77 if ((mmio_read_32(RCC_BASE
+ RCC_BDCR
) & RCC_BDCR_RTCSRC_MASK
) == 0U) {
78 mmio_setbits_32(RCC_BASE
+ RCC_BDCR
, RCC_BDCR_VSWRST
);
80 while ((mmio_read_32(RCC_BASE
+ RCC_BDCR
) & RCC_BDCR_VSWRST
) ==
85 mmio_clrbits_32(RCC_BASE
+ RCC_BDCR
, RCC_BDCR_VSWRST
);
88 mmap_add_region(BL_CODE_BASE
, BL_CODE_BASE
,
89 BL_CODE_END
- BL_CODE_BASE
,
92 /* Prevent corruption of preloaded BL32 */
93 mmap_add_region(BL32_BASE
, BL32_BASE
,
94 BL32_LIMIT
- BL32_BASE
,
95 MT_MEMORY
| MT_RO
| MT_SECURE
);
97 /* Prevent corruption of preloaded Device Tree */
98 mmap_add_region(DTB_BASE
, DTB_BASE
,
100 MT_MEMORY
| MT_RO
| MT_SECURE
);
104 generic_delay_timer_init();
106 if (dt_open_and_check() < 0) {
110 if (stm32mp1_clk_probe() < 0) {
114 if (stm32mp1_clk_init() < 0) {
118 result
= dt_get_stdout_uart_info(&dt_dev_info
);
121 (dt_dev_info
.status
== 0U) ||
122 (dt_dev_info
.clock
< 0) ||
123 (dt_dev_info
.reset
< 0)) {
124 goto skip_console_init
;
127 if (dt_set_stdout_pinctrl() != 0) {
128 goto skip_console_init
;
131 if (stm32mp1_clk_enable((unsigned long)dt_dev_info
.clock
) != 0) {
132 goto skip_console_init
;
135 stm32mp1_reset_assert((uint32_t)dt_dev_info
.reset
);
137 stm32mp1_reset_deassert((uint32_t)dt_dev_info
.reset
);
140 clk_rate
= stm32mp1_clk_get_rate((unsigned long)dt_dev_info
.clock
);
142 if (console_stm32_register(dt_dev_info
.base
, clk_rate
,
143 STM32MP1_UART_BAUDRATE
, &console
) == 0) {
147 board_model
= dt_get_board_model();
148 if (board_model
!= NULL
) {
149 NOTICE("%s\n", board_model
);
154 if (stm32_save_boot_interface(boot_context
->boot_interface_selected
,
155 boot_context
->boot_interface_instance
) !=
157 ERROR("Cannot save boot interface\n");
160 stm32mp1_arch_security_setup();