diff --git a/plat/st/stm32mp1/bl2_io_storage.c b/plat/st/stm32mp1/bl2_io_storage.c index 45a352e..8ccbc24 100644 --- a/plat/st/stm32mp1/bl2_io_storage.c +++ b/plat/st/stm32mp1/bl2_io_storage.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -58,13 +58,26 @@ static uintptr_t storage_dev_handle; static const io_dev_connector_t *mmc_dev_con; -#define IMG_IDX_BL33 0 +static const io_block_spec_t bl32_block_spec = { + .offset = BL32_BASE, + .length = STM32MP1_BL32_SIZE +}; + +static const io_block_spec_t bl2_block_spec = { + .offset = BL2_BASE, + .length = STM32MP1_BL2_SIZE, +}; static const struct stm32image_part_info bl33_partition_spec = { .name = BL33_IMAGE_NAME, .binary_type = BL33_BINARY_TYPE, }; +enum { + IMG_IDX_BL33, + IMG_IDX_NUM +}; + static struct stm32image_device_info stm32image_dev_info_spec = { .lba_size = MMC_BLOCK_SIZE, .part_info[IMG_IDX_BL33] = { @@ -73,20 +86,13 @@ }, }; -static io_block_spec_t stm32image_block_spec; +static io_block_spec_t stm32image_block_spec = { + .offset = 0, + .length = 0, +}; static const io_dev_connector_t *stm32image_dev_con; -static const io_block_spec_t bl32_block_spec = { - .offset = BL32_BASE, - .length = STM32MP1_BL32_SIZE -}; - -static const io_block_spec_t bl2_block_spec = { - .offset = BL2_BASE, - .length = STM32MP1_BL2_SIZE, -}; - static int open_dummy(const uintptr_t spec); static int open_image(const uintptr_t spec); static int open_storage(const uintptr_t spec); @@ -160,83 +166,18 @@ } } -static void print_reset_reason(void) -{ - uint32_t rstsr = mmio_read_32(RCC_BASE + RCC_MP_RSTSCLRR); - - if (rstsr == 0U) { - WARN("Reset reason unknown\n"); - return; - } - - INFO("Reset reason (0x%x):\n", rstsr); - - if ((rstsr & RCC_MP_RSTSCLRR_PADRSTF) == 0U) { - if ((rstsr & RCC_MP_RSTSCLRR_STDBYRSTF) != 0U) { - INFO("System exits from STANDBY\n"); - return; - } - - if ((rstsr & RCC_MP_RSTSCLRR_CSTDBYRSTF) != 0U) { - INFO("MPU exits from CSTANDBY\n"); - return; - } - } - - if ((rstsr & RCC_MP_RSTSCLRR_PORRSTF) != 0U) { - INFO(" Power-on Reset (rst_por)\n"); - return; - } - - if ((rstsr & RCC_MP_RSTSCLRR_BORRSTF) != 0U) { - INFO(" Brownout Reset (rst_bor)\n"); - return; - } - - if ((rstsr & RCC_MP_RSTSCLRR_MPSYSRSTF) != 0U) { - INFO(" System reset generated by MPU (MPSYSRST)\n"); - return; - } - - if ((rstsr & RCC_MP_RSTSCLRR_HCSSRSTF) != 0U) { - INFO(" Reset due to a clock failure on HSE\n"); - return; - } - - if ((rstsr & RCC_MP_RSTSCLRR_IWDG1RSTF) != 0U) { - INFO(" IWDG1 Reset (rst_iwdg1)\n"); - return; - } - - if ((rstsr & RCC_MP_RSTSCLRR_IWDG2RSTF) != 0U) { - INFO(" IWDG2 Reset (rst_iwdg2)\n"); - return; - } - - if ((rstsr & RCC_MP_RSTSCLRR_PADRSTF) != 0U) { - INFO(" Pad Reset from NRST\n"); - return; - } - - if ((rstsr & RCC_MP_RSTSCLRR_VCORERSTF) != 0U) { - INFO(" Reset due to a failure of VDD_CORE\n"); - return; - } - - ERROR(" Unidentified reset reason\n"); -} - void stm32mp1_io_setup(void) { int io_result __unused; + uint8_t idx; + struct stm32image_part_info *part; struct stm32_sdmmc2_params params; struct mmc_device_info device_info; uintptr_t mmc_default_instance; + const partition_entry_t *entry; boot_api_context_t *boot_context = (boot_api_context_t *)stm32mp1_get_boot_ctx_address(); - print_reset_reason(); - print_boot_device(boot_context); if ((boot_context->boot_partition_used_toboot == 1U) || @@ -255,7 +196,7 @@ switch (boot_context->boot_interface_selected) { case BOOT_API_CTX_BOOT_INTERFACE_SEL_FLASH_SD: case BOOT_API_CTX_BOOT_INTERFACE_SEL_FLASH_EMMC: - dmb(); + dmbsy(); memset(¶ms, 0, sizeof(struct stm32_sdmmc2_params)); @@ -309,14 +250,19 @@ stm32image_dev_info_spec.device_size = stm32_sdmmc2_mmc_get_device_size(); - stm32image_dev_info_spec.part_info[IMG_IDX_BL33].part_offset = - get_partition_entry(BL33_IMAGE_NAME)->start; - stm32image_dev_info_spec.part_info[IMG_IDX_BL33].bkp_offset = - get_partition_entry(BL33_IMAGE_NAME)->length; - stm32image_block_spec.offset = 0; - stm32image_block_spec.length = - get_partition_entry(BL33_IMAGE_NAME)->length; + for (idx = 0U; idx < IMG_IDX_NUM; idx++) { + part = &stm32image_dev_info_spec.part_info[idx]; + entry = get_partition_entry(part->name); + if (entry == NULL) { + ERROR("Partition %s not found\n", + part->name); + panic(); + } + + part->part_offset = entry->start; + part->bkp_offset = 0U; + } /* * Re-open MMC with io_mmc, for better perfs compared to diff --git a/plat/st/stm32mp1/bl2_plat_setup.c b/plat/st/stm32mp1/bl2_plat_setup.c index 4a41901..a1ffd5a 100644 --- a/plat/st/stm32mp1/bl2_plat_setup.c +++ b/plat/st/stm32mp1/bl2_plat_setup.c @@ -33,8 +33,95 @@ static struct console_stm32 console; -void bl2_el3_early_platform_setup(u_register_t arg0, u_register_t arg1, - u_register_t arg2, u_register_t arg3) +static void print_reset_reason(void) +{ + uint32_t rstsr = mmio_read_32(RCC_BASE + RCC_MP_RSTSCLRR); + + if (rstsr == 0U) { + WARN("Reset reason unknown\n"); + return; + } + + INFO("Reset reason (0x%x):\n", rstsr); + + if ((rstsr & RCC_MP_RSTSCLRR_PADRSTF) == 0U) { + if ((rstsr & RCC_MP_RSTSCLRR_STDBYRSTF) != 0U) { + INFO("System exits from STANDBY\n"); + return; + } + + if ((rstsr & RCC_MP_RSTSCLRR_CSTDBYRSTF) != 0U) { + INFO("MPU exits from CSTANDBY\n"); + return; + } + } + + if ((rstsr & RCC_MP_RSTSCLRR_PORRSTF) != 0U) { + INFO(" Power-on Reset (rst_por)\n"); + return; + } + + if ((rstsr & RCC_MP_RSTSCLRR_BORRSTF) != 0U) { + INFO(" Brownout Reset (rst_bor)\n"); + return; + } + + if ((rstsr & RCC_MP_RSTSCLRR_MCSYSRSTF) != 0U) { + if ((rstsr & RCC_MP_RSTSCLRR_PADRSTF) != 0U) { + INFO(" System reset generated by MCU (MCSYSRST)\n"); + } else { + INFO(" Local reset generated by MCU (MCSYSRST)\n"); + } + return; + } + + if ((rstsr & RCC_MP_RSTSCLRR_MPSYSRSTF) != 0U) { + INFO(" System reset generated by MPU (MPSYSRST)\n"); + return; + } + + if ((rstsr & RCC_MP_RSTSCLRR_HCSSRSTF) != 0U) { + INFO(" Reset due to a clock failure on HSE\n"); + return; + } + + if ((rstsr & RCC_MP_RSTSCLRR_IWDG1RSTF) != 0U) { + INFO(" IWDG1 Reset (rst_iwdg1)\n"); + return; + } + + if ((rstsr & RCC_MP_RSTSCLRR_IWDG2RSTF) != 0U) { + INFO(" IWDG2 Reset (rst_iwdg2)\n"); + return; + } + + if ((rstsr & RCC_MP_RSTSCLRR_MPUP0RSTF) != 0U) { + INFO(" MPU Processor 0 Reset\n"); + return; + } + + if ((rstsr & RCC_MP_RSTSCLRR_MPUP1RSTF) != 0U) { + INFO(" MPU Processor 1 Reset\n"); + return; + } + + if ((rstsr & RCC_MP_RSTSCLRR_PADRSTF) != 0U) { + INFO(" Pad Reset from NRST\n"); + return; + } + + if ((rstsr & RCC_MP_RSTSCLRR_VCORERSTF) != 0U) { + INFO(" Reset due to a failure of VDD_CORE\n"); + return; + } + + ERROR(" Unidentified reset reason\n"); +} + +void bl2_el3_early_platform_setup(u_register_t arg0, + u_register_t arg1 __unused, + u_register_t arg2 __unused, + u_register_t arg3 __unused) { stm32mp1_save_boot_ctx_address(arg0); } @@ -59,12 +146,38 @@ void bl2_el3_plat_arch_setup(void) { int32_t result; - struct dt_node_info dt_dev_info; + struct dt_node_info dt_uart_info; const char *board_model; boot_api_context_t *boot_context = (boot_api_context_t *)stm32mp1_get_boot_ctx_address(); uint32_t clk_rate; + mmap_add_region(BL_CODE_BASE, BL_CODE_BASE, + BL_CODE_END - BL_CODE_BASE, + MT_CODE | MT_SECURE); + + /* Prevent corruption of preloaded BL32 */ + mmap_add_region(BL32_BASE, BL32_BASE, + BL32_LIMIT - BL32_BASE, + MT_MEMORY | MT_RO | MT_SECURE); + + /* Map non secure DDR for BL33 load and DDR training area restore */ + mmap_add_region(STM32MP1_DDR_BASE, + STM32MP1_DDR_BASE, + STM32MP1_DDR_MAX_SIZE, + MT_MEMORY | MT_RW | MT_NS); + + /* Prevent corruption of preloaded Device Tree */ + mmap_add_region(DTB_BASE, DTB_BASE, + DTB_LIMIT - DTB_BASE, + MT_MEMORY | MT_RO | MT_SECURE); + + configure_mmu(); + + if (dt_open_and_check() < 0) { + panic(); + } + /* * Disable the backup domain write protection. * The protection is enable at each reset by hardware @@ -88,28 +201,8 @@ mmio_clrbits_32(RCC_BASE + RCC_BDCR, RCC_BDCR_VSWRST); } - mmap_add_region(BL_CODE_BASE, BL_CODE_BASE, - BL_CODE_END - BL_CODE_BASE, - MT_CODE | MT_SECURE); - - /* Prevent corruption of preloaded BL32 */ - mmap_add_region(BL32_BASE, BL32_BASE, - BL32_LIMIT - BL32_BASE, - MT_MEMORY | MT_RO | MT_SECURE); - - /* Prevent corruption of preloaded Device Tree */ - mmap_add_region(DTB_BASE, DTB_BASE, - DTB_LIMIT - DTB_BASE, - MT_MEMORY | MT_RO | MT_SECURE); - - configure_mmu(); - generic_delay_timer_init(); - if (dt_open_and_check() < 0) { - panic(); - } - if (stm32mp1_clk_probe() < 0) { panic(); } @@ -118,12 +211,12 @@ panic(); } - result = dt_get_stdout_uart_info(&dt_dev_info); + result = dt_get_stdout_uart_info(&dt_uart_info); if ((result <= 0) || - (dt_dev_info.status == 0U) || - (dt_dev_info.clock < 0) || - (dt_dev_info.reset < 0)) { + (dt_uart_info.status == 0U) || + (dt_uart_info.clock < 0) || + (dt_uart_info.reset < 0)) { goto skip_console_init; } @@ -131,25 +224,25 @@ goto skip_console_init; } - if (stm32mp1_clk_enable((unsigned long)dt_dev_info.clock) != 0) { + if (stm32mp1_clk_enable((unsigned long)dt_uart_info.clock) != 0) { goto skip_console_init; } - stm32mp1_reset_assert((uint32_t)dt_dev_info.reset); + stm32mp1_reset_assert((uint32_t)dt_uart_info.reset); udelay(2); - stm32mp1_reset_deassert((uint32_t)dt_dev_info.reset); + stm32mp1_reset_deassert((uint32_t)dt_uart_info.reset); mdelay(1); - clk_rate = stm32mp1_clk_get_rate((unsigned long)dt_dev_info.clock); + clk_rate = stm32mp1_clk_get_rate((unsigned long)dt_uart_info.clock); - if (console_stm32_register(dt_dev_info.base, clk_rate, + if (console_stm32_register(dt_uart_info.base, clk_rate, STM32MP1_UART_BAUDRATE, &console) == 0) { panic(); } board_model = dt_get_board_model(); if (board_model != NULL) { - NOTICE("%s\n", board_model); + NOTICE("Model: %s\n", board_model); } skip_console_init: @@ -162,5 +255,7 @@ stm32mp1_arch_security_setup(); + print_reset_reason(); + stm32mp1_io_setup(); } diff --git a/plat/st/stm32mp1/include/platform_def.h b/plat/st/stm32mp1/include/platform_def.h index 1b4df16..6d3d36d 100644 --- a/plat/st/stm32mp1/include/platform_def.h +++ b/plat/st/stm32mp1/include/platform_def.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -30,8 +30,8 @@ #define BL33_BINARY_TYPE U(0x0) #define STM32MP1_PRIMARY_CPU U(0x0) +#define STM32MP1_SECONDARY_CPU U(0x1) -#define PLATFORM_CACHE_LINE_SIZE 64 #define PLATFORM_CLUSTER_COUNT ULL(1) #define PLATFORM_CLUSTER0_CORE_COUNT U(2) #define PLATFORM_CLUSTER1_CORE_COUNT U(0) @@ -39,9 +39,9 @@ PLATFORM_CLUSTER0_CORE_COUNT) #define PLATFORM_MAX_CPUS_PER_CLUSTER 2 -#define MAX_IO_DEVICES 4 -#define MAX_IO_HANDLES 4 -#define MAX_IO_BLOCK_DEVICES 1 +#define MAX_IO_DEVICES U(4) +#define MAX_IO_HANDLES U(4) +#define MAX_IO_BLOCK_DEVICES U(1) /******************************************************************************* * BL2 specific defines. @@ -81,8 +81,8 @@ /******************************************************************************* * Platform specific page table and MMU setup constants ******************************************************************************/ -#define PLAT_PHY_ADDR_SPACE_SIZE (1ULL << 32) -#define PLAT_VIRT_ADDR_SPACE_SIZE (1ULL << 32) +#define PLAT_PHY_ADDR_SPACE_SIZE (ULL(1) << 32) +#define PLAT_VIRT_ADDR_SPACE_SIZE (ULL(1) << 32) /******************************************************************************* * Declarations and constants to access the mailboxes safely. Each mailbox is @@ -123,9 +123,6 @@ INTR_PROP_DESC(ARM_IRQ_SEC_PHY_TIMER, \ GIC_HIGHEST_SEC_PRIORITY, \ grp, GIC_INTR_CFG_LEVEL), \ - INTR_PROP_DESC(STM32MP1_IRQ_TAMPSERRS, \ - GIC_HIGHEST_SEC_PRIORITY, \ - grp, GIC_INTR_CFG_LEVEL), \ INTR_PROP_DESC(STM32MP1_IRQ_AXIERRIRQ, \ GIC_HIGHEST_SEC_PRIORITY, \ grp, GIC_INTR_CFG_LEVEL), \ diff --git a/plat/st/stm32mp1/platform.mk b/plat/st/stm32mp1/platform.mk index 22c0c8a..b5a7a79 100644 --- a/plat/st/stm32mp1/platform.mk +++ b/plat/st/stm32mp1/platform.mk @@ -24,8 +24,8 @@ PLAT_INCLUDES := -Iplat/st/stm32mp1/include/ # Device tree -STM32_DTB_FILE_NAME ?= stm32mp157c-ev1.dtb -FDT_SOURCES := $(addprefix fdts/, $(patsubst %.dtb,%.dts,$(STM32_DTB_FILE_NAME))) +DTB_FILE_NAME ?= stm32mp157c-ev1.dtb +FDT_SOURCES := $(addprefix fdts/, $(patsubst %.dtb,%.dts,$(DTB_FILE_NAME))) DTC_FLAGS += -Wno-unit_address_vs_reg include lib/libfdt/libfdt.mk @@ -82,13 +82,13 @@ # Macros and rules to build TF binary STM32_TF_ELF_LDFLAGS := --hash-style=gnu --as-needed -STM32_DT_BASENAME := $(STM32_DTB_FILE_NAME:.dtb=) +STM32_DT_BASENAME := $(DTB_FILE_NAME:.dtb=) STM32_TF_STM32 := ${BUILD_PLAT}/tf-a-${STM32_DT_BASENAME}.stm32 STM32_TF_BINARY := $(STM32_TF_STM32:.stm32=.bin) STM32_TF_MAPFILE := $(STM32_TF_STM32:.stm32=.map) STM32_TF_LINKERFILE := $(STM32_TF_STM32:.stm32=.ld) STM32_TF_ELF := $(STM32_TF_STM32:.stm32=.elf) -STM32_TF_DTBFILE := ${BUILD_PLAT}/fdts/${STM32_DTB_FILE_NAME} +STM32_TF_DTBFILE := ${BUILD_PLAT}/fdts/${DTB_FILE_NAME} STM32_TF_OBJS := ${BUILD_PLAT}/stm32mp1.o # Variables for use with stm32image @@ -131,7 +131,7 @@ -DDTB_BIN_PATH=\"${STM32_TF_DTBFILE}\" \ -c plat/st/stm32mp1/stm32mp1.S -o $@ -${STM32_TF_LINKERFILE}: plat/st/stm32mp1/stm32mp1.ld.S +${STM32_TF_LINKERFILE}: plat/st/stm32mp1/stm32mp1.ld.S ${BUILD_PLAT} @echo " LDS $<" ${Q}${AS} ${ASFLAGS} ${TF_CFLAGS} -P -E $< -o $@ diff --git a/plat/st/stm32mp1/sp_min/sp_min_setup.c b/plat/st/stm32mp1/sp_min/sp_min_setup.c index f541379..bff45f6 100644 --- a/plat/st/stm32mp1/sp_min/sp_min_setup.c +++ b/plat/st/stm32mp1/sp_min/sp_min_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -40,7 +41,7 @@ ******************************************************************************/ void sp_min_plat_fiq_handler(uint32_t id) { - switch (id) { + switch (id & INT_ID_MASK) { case STM32MP1_IRQ_TZC400: ERROR("STM32MP1_IRQ_TZC400 generated\n"); panic(); @@ -50,7 +51,7 @@ panic(); break; default: - ERROR("SECURE IT handler not define for it : %i", id); + ERROR("SECURE IT handler not define for it : %u", id); break; } } @@ -80,7 +81,7 @@ void sp_min_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) { - struct dt_node_info dt_dev_info; + struct dt_node_info dt_uart_info; int result; bl_params_t *params_from_bl2 = (bl_params_t *)arg0; @@ -114,10 +115,10 @@ panic(); } - result = dt_get_stdout_uart_info(&dt_dev_info); + result = dt_get_stdout_uart_info(&dt_uart_info); - if ((result > 0) && dt_dev_info.status) { - if (console_stm32_register(dt_dev_info.base, 0, + if ((result > 0) && dt_uart_info.status) { + if (console_stm32_register(dt_uart_info.base, 0, STM32MP1_UART_BAUDRATE, &console) == 0) { panic(); diff --git a/plat/st/stm32mp1/stm32mp1_common.c b/plat/st/stm32mp1/stm32mp1_common.c index b54f313..de8cc78 100644 --- a/plat/st/stm32mp1/stm32mp1_common.c +++ b/plat/st/stm32mp1/stm32mp1_common.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -39,26 +39,11 @@ MT_SECURE | \ MT_EXECUTE_NEVER) -#define MAP_DDR MAP_REGION_FLAT(STM32MP1_DDR_BASE, \ - STM32MP1_DDR_MAX_SIZE, \ - MT_MEMORY | \ - MT_RW | \ - MT_SECURE | \ - MT_EXECUTE_NEVER) - -#define MAP_DDR_NS MAP_REGION_FLAT(STM32MP1_DDR_BASE, \ - STM32MP1_DDR_MAX_SIZE, \ - MT_MEMORY | \ - MT_RW | \ - MT_NS | \ - MT_EXECUTE_NEVER) - #if defined(IMAGE_BL2) static const mmap_region_t stm32mp1_mmap[] = { MAP_SRAM, MAP_DEVICE1, MAP_DEVICE2, - MAP_DDR, {0} }; #endif @@ -67,7 +52,6 @@ MAP_SRAM, MAP_DEVICE1, MAP_DEVICE2, - MAP_DDR_NS, {0} }; #endif diff --git a/plat/st/stm32mp1/stm32mp1_def.h b/plat/st/stm32mp1/stm32mp1_def.h index 15f0432..25a953d 100644 --- a/plat/st/stm32mp1/stm32mp1_def.h +++ b/plat/st/stm32mp1/stm32mp1_def.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -126,14 +126,6 @@ #define STM32MP1_UART_BAUDRATE 115200 /******************************************************************************* - * STM32MP1 GIC-400 - ******************************************************************************/ -#define STM32MP1_GICD_BASE U(0xA0021000) -#define STM32MP1_GICC_BASE U(0xA0022000) -#define STM32MP1_GICH_BASE U(0xA0024000) -#define STM32MP1_GICV_BASE U(0xA0026000) - -/******************************************************************************* * STM32MP1 TZC (TZ400) ******************************************************************************/ #define STM32MP1_TZC_BASE U(0x5C006000) @@ -149,10 +141,7 @@ #define STM32MP1_TZC_ETH_ID U(10) #define STM32MP1_TZC_DAP_ID U(15) -#define STM32MP1_MEMORY_NS 0 -#define STM32MP1_MEMORY_SECURE 1 - -#define STM32MP1_FILTER_BIT_ALL 3 +#define STM32MP1_FILTER_BIT_ALL U(3) /******************************************************************************* * STM32MP1 SDMMC diff --git a/plat/st/stm32mp1/stm32mp1_gic.c b/plat/st/stm32mp1/stm32mp1_gic.c index fabed37..becb925 100644 --- a/plat/st/stm32mp1/stm32mp1_gic.c +++ b/plat/st/stm32mp1/stm32mp1_gic.c @@ -1,18 +1,28 @@ /* - * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2016-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ +#include + #include #include +#include #include +#include #include #include +#include #include +struct stm32_gic_instance { + uint32_t cells; + uint32_t phandle_node; +}; + /****************************************************************************** * On a GICv2 system, the Group 1 secure interrupts are treated as Group 0 * interrupts. @@ -22,19 +32,55 @@ PLATFORM_G0_PROPS(GICV2_INTR_GROUP0) }; -static unsigned int target_mask_array[PLATFORM_CORE_COUNT]; +/* Fix target_mask_array as secondary core is not able to initialize it */ +static unsigned int target_mask_array[PLATFORM_CORE_COUNT] = {1, 2}; -static const gicv2_driver_data_t platform_gic_data = { - .gicd_base = STM32MP1_GICD_BASE, - .gicc_base = STM32MP1_GICC_BASE, +static gicv2_driver_data_t platform_gic_data = { .interrupt_props = stm32mp1_interrupt_props, .interrupt_props_num = ARRAY_SIZE(stm32mp1_interrupt_props), .target_masks = target_mask_array, .target_masks_num = ARRAY_SIZE(target_mask_array), }; +static struct stm32_gic_instance stm32_gic; + void stm32mp1_gic_init(void) { + int node; + void *fdt; + const fdt32_t *cuint; + struct dt_node_info dt_gic; + + if (fdt_get_address(&fdt) == 0) { + panic(); + } + + node = dt_get_node(&dt_gic, -1, "arm,cortex-a7-gic"); + if (node < 0) { + panic(); + } + + platform_gic_data.gicd_base = dt_gic.base; + + cuint = fdt_getprop(fdt, node, "reg", NULL); + if (cuint == NULL) { + panic(); + } + + platform_gic_data.gicc_base = fdt32_to_cpu(*(cuint + 2)); + + cuint = fdt_getprop(fdt, node, "#interrupt-cells", NULL); + if (cuint == NULL) { + panic(); + } + + stm32_gic.cells = fdt32_to_cpu(*cuint); + + stm32_gic.phandle_node = fdt_get_phandle(fdt, node); + if (stm32_gic.phandle_node == 0U) { + panic(); + } + gicv2_driver_init(&platform_gic_data); gicv2_distif_init(); diff --git a/plat/st/stm32mp1/stm32mp1_pm.c b/plat/st/stm32mp1/stm32mp1_pm.c index 85189ff..c0e9c4e 100644 --- a/plat/st/stm32mp1/stm32mp1_pm.c +++ b/plat/st/stm32mp1/stm32mp1_pm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -23,11 +23,9 @@ #include #include -static uint32_t stm32_sec_entrypoint; +static uintptr_t stm32_sec_entrypoint; static uint32_t cntfrq_core0; -#define SEND_SECURE_IT_TO_CORE_1 0x20000U - /******************************************************************************* * STM32MP1 handler called when a CPU is about to enter standby. * call by core 1 to enter in wfi @@ -42,6 +40,7 @@ * Enter standby state * dsb is good practice before using wfi to enter low power states */ + isb(); dsb(); while (interrupt == GIC_SPURIOUS_INTERRUPT) { wfi(); @@ -59,7 +58,7 @@ /******************************************************************************* * STM32MP1 handler called when a power domain is about to be turned on. The * mpidr determines the CPU to be turned on. - * call by core 0 to activate core 1 + * call by core 0 to activate core 1 ******************************************************************************/ static int stm32_pwr_domain_on(u_register_t mpidr) { @@ -102,8 +101,7 @@ } /* Generate an IT to core 1 */ - mmio_write_32(STM32MP1_GICD_BASE + GICD_SGIR, - SEND_SECURE_IT_TO_CORE_1 | ARM_IRQ_SEC_SGI_0); + gicv2_raise_sgi(ARM_IRQ_SEC_SGI_0, STM32MP1_SECONDARY_CPU); return PSCI_E_SUCCESS; } diff --git a/plat/st/stm32mp1/stm32mp1_security.c b/plat/st/stm32mp1/stm32mp1_security.c index 3992704..cfdbf31 100644 --- a/plat/st/stm32mp1/stm32mp1_security.c +++ b/plat/st/stm32mp1/stm32mp1_security.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -65,22 +65,6 @@ ******************************************************************************/ static void early_init_tzc400(void) { - uint32_t rstsr, rst_standby; - - rstsr = mmio_read_32(RCC_BASE + RCC_MP_RSTSCLRR); - - /* No warning if return from (C)STANDBY */ - rst_standby = rstsr & - (RCC_MP_RSTSCLRR_STDBYRSTF | RCC_MP_RSTSCLRR_CSTDBYRSTF); - - if (stm32mp1_clk_is_enabled(TZC1) && (rst_standby == 0U)) { - WARN("TZC400 port 1 clock already enable\n"); - } - - if (stm32mp1_clk_is_enabled(TZC2) && (rst_standby == 0U)) { - WARN("TZC400 port 2 clock already enable\n"); - } - if (stm32mp1_clk_enable(TZC1) != 0) { ERROR("Cannot enable TZC1 clock\n"); panic(); @@ -103,6 +87,7 @@ STM32MP1_DDR_BASE + (STM32MP1_DDR_MAX_SIZE - 1U), TZC_REGION_S_RDWR, + TZC_REGION_ACCESS_RDWR(STM32MP1_TZC_A7_ID) | TZC_REGION_ACCESS_RDWR(STM32MP1_TZC_SDMMC_ID)); /* Raise an exception if a NS device tries to access secure memory */