14353bb20SYann Gautier /* 24353bb20SYann Gautier * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. 34353bb20SYann Gautier * 44353bb20SYann Gautier * SPDX-License-Identifier: BSD-3-Clause 54353bb20SYann Gautier */ 64353bb20SYann Gautier 74353bb20SYann Gautier #include <assert.h> 8*09d40e0eSAntonio Nino Diaz #include <string.h> 9*09d40e0eSAntonio Nino Diaz 104353bb20SYann Gautier #include <platform_def.h> 11*09d40e0eSAntonio Nino Diaz 12*09d40e0eSAntonio Nino Diaz #include <arch_helpers.h> 13*09d40e0eSAntonio Nino Diaz #include <common/bl_common.h> 14*09d40e0eSAntonio Nino Diaz #include <common/debug.h> 15*09d40e0eSAntonio Nino Diaz #include <common/desc_image_load.h> 16*09d40e0eSAntonio Nino Diaz #include <drivers/delay_timer.h> 17*09d40e0eSAntonio Nino Diaz #include <drivers/generic_delay_timer.h> 18*09d40e0eSAntonio Nino Diaz #include <drivers/st/stm32_console.h> 19*09d40e0eSAntonio Nino Diaz #include <drivers/st/stm32mp1_clk.h> 20*09d40e0eSAntonio Nino Diaz #include <drivers/st/stm32mp1_pmic.h> 21*09d40e0eSAntonio Nino Diaz #include <drivers/st/stm32mp1_pwr.h> 22*09d40e0eSAntonio Nino Diaz #include <drivers/st/stm32mp1_ram.h> 23*09d40e0eSAntonio Nino Diaz #include <drivers/st/stm32mp1_rcc.h> 24*09d40e0eSAntonio Nino Diaz #include <drivers/st/stm32mp1_reset.h> 25*09d40e0eSAntonio Nino Diaz #include <lib/mmio.h> 26*09d40e0eSAntonio Nino Diaz #include <lib/xlat_tables/xlat_tables_v2.h> 27*09d40e0eSAntonio Nino Diaz #include <plat/common/platform.h> 28*09d40e0eSAntonio Nino Diaz 29*09d40e0eSAntonio Nino Diaz #include <boot_api.h> 30cce37d44SYann Gautier #include <stm32mp1_context.h> 317839a050SYann Gautier #include <stm32mp1_dt.h> 324353bb20SYann Gautier #include <stm32mp1_private.h> 334353bb20SYann Gautier 34cce37d44SYann Gautier static struct console_stm32 console; 35cce37d44SYann Gautier 364353bb20SYann Gautier void bl2_el3_early_platform_setup(u_register_t arg0, u_register_t arg1, 374353bb20SYann Gautier u_register_t arg2, u_register_t arg3) 384353bb20SYann Gautier { 394353bb20SYann Gautier stm32mp1_save_boot_ctx_address(arg0); 404353bb20SYann Gautier } 414353bb20SYann Gautier 424353bb20SYann Gautier void bl2_platform_setup(void) 434353bb20SYann Gautier { 4410a511ceSYann Gautier int ret; 4510a511ceSYann Gautier 46e4f559ffSYann Gautier if (dt_check_pmic()) { 47e4f559ffSYann Gautier initialize_pmic(); 48e4f559ffSYann Gautier } 49e4f559ffSYann Gautier 5010a511ceSYann Gautier ret = stm32mp1_ddr_probe(); 5110a511ceSYann Gautier if (ret < 0) { 5210a511ceSYann Gautier ERROR("Invalid DDR init: error %d\n", ret); 5310a511ceSYann Gautier panic(); 5410a511ceSYann Gautier } 5510a511ceSYann Gautier 564353bb20SYann Gautier INFO("BL2 runs SP_MIN setup\n"); 574353bb20SYann Gautier } 584353bb20SYann Gautier 594353bb20SYann Gautier void bl2_el3_plat_arch_setup(void) 604353bb20SYann Gautier { 61278c34dfSYann Gautier int32_t result; 62278c34dfSYann Gautier struct dt_node_info dt_dev_info; 63278c34dfSYann Gautier const char *board_model; 64e58a53fbSYann Gautier boot_api_context_t *boot_context = 65e58a53fbSYann Gautier (boot_api_context_t *)stm32mp1_get_boot_ctx_address(); 66278c34dfSYann Gautier uint32_t clk_rate; 67e58a53fbSYann Gautier 684353bb20SYann Gautier /* 694353bb20SYann Gautier * Disable the backup domain write protection. 704353bb20SYann Gautier * The protection is enable at each reset by hardware 714353bb20SYann Gautier * and must be disabled by software. 724353bb20SYann Gautier */ 734353bb20SYann Gautier mmio_setbits_32(PWR_BASE + PWR_CR1, PWR_CR1_DBP); 744353bb20SYann Gautier 754353bb20SYann Gautier while ((mmio_read_32(PWR_BASE + PWR_CR1) & PWR_CR1_DBP) == 0U) { 764353bb20SYann Gautier ; 774353bb20SYann Gautier } 784353bb20SYann Gautier 794353bb20SYann Gautier /* Reset backup domain on cold boot cases */ 804353bb20SYann Gautier if ((mmio_read_32(RCC_BASE + RCC_BDCR) & RCC_BDCR_RTCSRC_MASK) == 0U) { 814353bb20SYann Gautier mmio_setbits_32(RCC_BASE + RCC_BDCR, RCC_BDCR_VSWRST); 824353bb20SYann Gautier 834353bb20SYann Gautier while ((mmio_read_32(RCC_BASE + RCC_BDCR) & RCC_BDCR_VSWRST) == 844353bb20SYann Gautier 0U) { 854353bb20SYann Gautier ; 864353bb20SYann Gautier } 874353bb20SYann Gautier 884353bb20SYann Gautier mmio_clrbits_32(RCC_BASE + RCC_BDCR, RCC_BDCR_VSWRST); 894353bb20SYann Gautier } 904353bb20SYann Gautier 914353bb20SYann Gautier mmap_add_region(BL_CODE_BASE, BL_CODE_BASE, 924353bb20SYann Gautier BL_CODE_END - BL_CODE_BASE, 934353bb20SYann Gautier MT_CODE | MT_SECURE); 944353bb20SYann Gautier 954353bb20SYann Gautier /* Prevent corruption of preloaded BL32 */ 964353bb20SYann Gautier mmap_add_region(BL32_BASE, BL32_BASE, 974353bb20SYann Gautier BL32_LIMIT - BL32_BASE, 984353bb20SYann Gautier MT_MEMORY | MT_RO | MT_SECURE); 994353bb20SYann Gautier 1004353bb20SYann Gautier /* Prevent corruption of preloaded Device Tree */ 1014353bb20SYann Gautier mmap_add_region(DTB_BASE, DTB_BASE, 1024353bb20SYann Gautier DTB_LIMIT - DTB_BASE, 1034353bb20SYann Gautier MT_MEMORY | MT_RO | MT_SECURE); 1044353bb20SYann Gautier 1054353bb20SYann Gautier configure_mmu(); 1064353bb20SYann Gautier 1074353bb20SYann Gautier generic_delay_timer_init(); 1084353bb20SYann Gautier 1097839a050SYann Gautier if (dt_open_and_check() < 0) { 1107839a050SYann Gautier panic(); 1117839a050SYann Gautier } 1127839a050SYann Gautier 1137839a050SYann Gautier if (stm32mp1_clk_probe() < 0) { 1147839a050SYann Gautier panic(); 1157839a050SYann Gautier } 1167839a050SYann Gautier 1177839a050SYann Gautier if (stm32mp1_clk_init() < 0) { 1187839a050SYann Gautier panic(); 1197839a050SYann Gautier } 1207839a050SYann Gautier 121278c34dfSYann Gautier result = dt_get_stdout_uart_info(&dt_dev_info); 122278c34dfSYann Gautier 123278c34dfSYann Gautier if ((result <= 0) || 124278c34dfSYann Gautier (dt_dev_info.status == 0U) || 125278c34dfSYann Gautier (dt_dev_info.clock < 0) || 126278c34dfSYann Gautier (dt_dev_info.reset < 0)) { 127278c34dfSYann Gautier goto skip_console_init; 128278c34dfSYann Gautier } 129278c34dfSYann Gautier 130278c34dfSYann Gautier if (dt_set_stdout_pinctrl() != 0) { 131278c34dfSYann Gautier goto skip_console_init; 132278c34dfSYann Gautier } 133278c34dfSYann Gautier 134278c34dfSYann Gautier if (stm32mp1_clk_enable((unsigned long)dt_dev_info.clock) != 0) { 135278c34dfSYann Gautier goto skip_console_init; 136278c34dfSYann Gautier } 137278c34dfSYann Gautier 138278c34dfSYann Gautier stm32mp1_reset_assert((uint32_t)dt_dev_info.reset); 139278c34dfSYann Gautier udelay(2); 140278c34dfSYann Gautier stm32mp1_reset_deassert((uint32_t)dt_dev_info.reset); 141278c34dfSYann Gautier mdelay(1); 142278c34dfSYann Gautier 143278c34dfSYann Gautier clk_rate = stm32mp1_clk_get_rate((unsigned long)dt_dev_info.clock); 144278c34dfSYann Gautier 145cce37d44SYann Gautier if (console_stm32_register(dt_dev_info.base, clk_rate, 146cce37d44SYann Gautier STM32MP1_UART_BAUDRATE, &console) == 0) { 147278c34dfSYann Gautier panic(); 148278c34dfSYann Gautier } 149278c34dfSYann Gautier 150278c34dfSYann Gautier board_model = dt_get_board_model(); 151278c34dfSYann Gautier if (board_model != NULL) { 152278c34dfSYann Gautier NOTICE("%s\n", board_model); 153278c34dfSYann Gautier } 154278c34dfSYann Gautier 155278c34dfSYann Gautier skip_console_init: 156278c34dfSYann Gautier 157e58a53fbSYann Gautier if (stm32_save_boot_interface(boot_context->boot_interface_selected, 158e58a53fbSYann Gautier boot_context->boot_interface_instance) != 159e58a53fbSYann Gautier 0) { 160e58a53fbSYann Gautier ERROR("Cannot save boot interface\n"); 161e58a53fbSYann Gautier } 162e58a53fbSYann Gautier 16310a511ceSYann Gautier stm32mp1_arch_security_setup(); 16410a511ceSYann Gautier 1654353bb20SYann Gautier stm32mp1_io_setup(); 1664353bb20SYann Gautier } 167