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 <arch_helpers.h> 84353bb20SYann Gautier #include <assert.h> 94353bb20SYann Gautier #include <bl_common.h> 104353bb20SYann Gautier #include <boot_api.h> 114353bb20SYann Gautier #include <console.h> 124353bb20SYann Gautier #include <debug.h> 134353bb20SYann Gautier #include <delay_timer.h> 144353bb20SYann Gautier #include <desc_image_load.h> 154353bb20SYann Gautier #include <generic_delay_timer.h> 164353bb20SYann Gautier #include <mmio.h> 174353bb20SYann Gautier #include <platform.h> 184353bb20SYann Gautier #include <platform_def.h> 197839a050SYann Gautier #include <stm32mp1_clk.h> 207839a050SYann Gautier #include <stm32mp1_dt.h> 214353bb20SYann Gautier #include <stm32mp1_private.h> 22*e58a53fbSYann Gautier #include <stm32mp1_context.h> 234353bb20SYann Gautier #include <stm32mp1_pwr.h> 244353bb20SYann Gautier #include <stm32mp1_rcc.h> 254353bb20SYann Gautier #include <string.h> 264353bb20SYann Gautier #include <xlat_tables_v2.h> 274353bb20SYann Gautier 284353bb20SYann Gautier void bl2_el3_early_platform_setup(u_register_t arg0, u_register_t arg1, 294353bb20SYann Gautier u_register_t arg2, u_register_t arg3) 304353bb20SYann Gautier { 314353bb20SYann Gautier stm32mp1_save_boot_ctx_address(arg0); 324353bb20SYann Gautier } 334353bb20SYann Gautier 344353bb20SYann Gautier void bl2_platform_setup(void) 354353bb20SYann Gautier { 364353bb20SYann Gautier INFO("BL2 runs SP_MIN setup\n"); 374353bb20SYann Gautier } 384353bb20SYann Gautier 394353bb20SYann Gautier void bl2_el3_plat_arch_setup(void) 404353bb20SYann Gautier { 41*e58a53fbSYann Gautier boot_api_context_t *boot_context = 42*e58a53fbSYann Gautier (boot_api_context_t *)stm32mp1_get_boot_ctx_address(); 43*e58a53fbSYann Gautier 444353bb20SYann Gautier /* 454353bb20SYann Gautier * Disable the backup domain write protection. 464353bb20SYann Gautier * The protection is enable at each reset by hardware 474353bb20SYann Gautier * and must be disabled by software. 484353bb20SYann Gautier */ 494353bb20SYann Gautier mmio_setbits_32(PWR_BASE + PWR_CR1, PWR_CR1_DBP); 504353bb20SYann Gautier 514353bb20SYann Gautier while ((mmio_read_32(PWR_BASE + PWR_CR1) & PWR_CR1_DBP) == 0U) { 524353bb20SYann Gautier ; 534353bb20SYann Gautier } 544353bb20SYann Gautier 554353bb20SYann Gautier /* Reset backup domain on cold boot cases */ 564353bb20SYann Gautier if ((mmio_read_32(RCC_BASE + RCC_BDCR) & RCC_BDCR_RTCSRC_MASK) == 0U) { 574353bb20SYann Gautier mmio_setbits_32(RCC_BASE + RCC_BDCR, RCC_BDCR_VSWRST); 584353bb20SYann Gautier 594353bb20SYann Gautier while ((mmio_read_32(RCC_BASE + RCC_BDCR) & RCC_BDCR_VSWRST) == 604353bb20SYann Gautier 0U) { 614353bb20SYann Gautier ; 624353bb20SYann Gautier } 634353bb20SYann Gautier 644353bb20SYann Gautier mmio_clrbits_32(RCC_BASE + RCC_BDCR, RCC_BDCR_VSWRST); 654353bb20SYann Gautier } 664353bb20SYann Gautier 674353bb20SYann Gautier mmap_add_region(BL_CODE_BASE, BL_CODE_BASE, 684353bb20SYann Gautier BL_CODE_END - BL_CODE_BASE, 694353bb20SYann Gautier MT_CODE | MT_SECURE); 704353bb20SYann Gautier 714353bb20SYann Gautier /* Prevent corruption of preloaded BL32 */ 724353bb20SYann Gautier mmap_add_region(BL32_BASE, BL32_BASE, 734353bb20SYann Gautier BL32_LIMIT - BL32_BASE, 744353bb20SYann Gautier MT_MEMORY | MT_RO | MT_SECURE); 754353bb20SYann Gautier 764353bb20SYann Gautier /* Prevent corruption of preloaded Device Tree */ 774353bb20SYann Gautier mmap_add_region(DTB_BASE, DTB_BASE, 784353bb20SYann Gautier DTB_LIMIT - DTB_BASE, 794353bb20SYann Gautier MT_MEMORY | MT_RO | MT_SECURE); 804353bb20SYann Gautier 814353bb20SYann Gautier configure_mmu(); 824353bb20SYann Gautier 834353bb20SYann Gautier generic_delay_timer_init(); 844353bb20SYann Gautier 857839a050SYann Gautier if (dt_open_and_check() < 0) { 867839a050SYann Gautier panic(); 877839a050SYann Gautier } 887839a050SYann Gautier 897839a050SYann Gautier if (stm32mp1_clk_probe() < 0) { 907839a050SYann Gautier panic(); 917839a050SYann Gautier } 927839a050SYann Gautier 937839a050SYann Gautier if (stm32mp1_clk_init() < 0) { 947839a050SYann Gautier panic(); 957839a050SYann Gautier } 967839a050SYann Gautier 97*e58a53fbSYann Gautier if (stm32_save_boot_interface(boot_context->boot_interface_selected, 98*e58a53fbSYann Gautier boot_context->boot_interface_instance) != 99*e58a53fbSYann Gautier 0) { 100*e58a53fbSYann Gautier ERROR("Cannot save boot interface\n"); 101*e58a53fbSYann Gautier } 102*e58a53fbSYann Gautier 1034353bb20SYann Gautier stm32mp1_io_setup(); 1044353bb20SYann Gautier } 105