From f7a4819c34b811206e389ad3c50b6b9b18652f32 Mon Sep 17 00:00:00 2001 From: Yann Gautier <yann.gautier@st.com> Date: Thu, 20 Aug 2020 09:43:34 +0200 Subject: [PATCH] stm32mp1: use FCONF to configure product mapping Add FW_CONFIG device tree files for all boards. The file content is for the moment common to all boards. It describes where the different images will be loaded. Change-Id: Id957b49b0117864136250bfc416664f815043ada Signed-off-by: Yann Gautier <yann.gautier@st.com> --- fdts/stm32mp15-ddr-1g-fw-config.dts | 47 +++++ fdts/stm32mp15-ddr-512m-fw-config.dts | 47 +++++ fdts/stm32mp157a-avenger96-fw-config.dts | 6 + fdts/stm32mp157a-dk1-fw-config.dts | 6 + fdts/stm32mp157a-ed1-fw-config.dts | 6 + fdts/stm32mp157a-ev1-fw-config.dts | 6 + fdts/stm32mp157c-dk2-fw-config.dts | 6 + fdts/stm32mp157c-ed1-fw-config.dts | 6 + fdts/stm32mp157c-ev1-fw-config.dts | 6 + fdts/stm32mp157d-dk1-fw-config.dts | 6 + fdts/stm32mp157d-ed1-fw-config.dts | 6 + fdts/stm32mp157d-ev1-fw-config.dts | 6 + fdts/stm32mp157f-dk2-fw-config.dts | 6 + fdts/stm32mp157f-ed1-fw-config.dts | 6 + fdts/stm32mp157f-ev1-fw-config.dts | 6 + plat/st/common/bl2_io_storage.c | 9 + plat/st/stm32mp1/bl2_plat_setup.c | 188 ++++++++++++++------ plat/st/stm32mp1/plat_bl2_mem_params_desc.c | 40 ++--- plat/st/stm32mp1/plat_image_load.c | 23 ++- plat/st/stm32mp1/platform.mk | 8 + plat/st/stm32mp1/sp_min/sp_min_setup.c | 46 +++-- plat/st/stm32mp1/stm32mp1_def.h | 16 +- 22 files changed, 398 insertions(+), 104 deletions(-) create mode 100644 fdts/stm32mp15-ddr-1g-fw-config.dts create mode 100644 fdts/stm32mp15-ddr-512m-fw-config.dts create mode 100644 fdts/stm32mp157a-avenger96-fw-config.dts create mode 100644 fdts/stm32mp157a-dk1-fw-config.dts create mode 100644 fdts/stm32mp157a-ed1-fw-config.dts create mode 100644 fdts/stm32mp157a-ev1-fw-config.dts create mode 100644 fdts/stm32mp157c-dk2-fw-config.dts create mode 100644 fdts/stm32mp157c-ed1-fw-config.dts create mode 100644 fdts/stm32mp157c-ev1-fw-config.dts create mode 100644 fdts/stm32mp157d-dk1-fw-config.dts create mode 100644 fdts/stm32mp157d-ed1-fw-config.dts create mode 100644 fdts/stm32mp157d-ev1-fw-config.dts create mode 100644 fdts/stm32mp157f-dk2-fw-config.dts create mode 100644 fdts/stm32mp157f-ed1-fw-config.dts create mode 100644 fdts/stm32mp157f-ev1-fw-config.dts diff --git a/fdts/stm32mp15-ddr-1g-fw-config.dts b/fdts/stm32mp15-ddr-1g-fw-config.dts new file mode 100644 index 000000000..822f55e12 --- /dev/null +++ b/fdts/stm32mp15-ddr-1g-fw-config.dts @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include <common/tbbr/tbbr_img_def.h> +#include <dt-bindings/soc/stm32mp1-tzc400.h> + +/dts-v1/; + +/ { + dtb-registry { + compatible = "fconf,dyn_cfg-dtb_registry"; + + hw-config { + load-address = <0x0 0xC0600000>; + max-size = <0x00020000>; + id = <HW_CONFIG_ID>; + }; + + nt_fw { + load-address = <0x0 0xC0100000>; + max-size = <0x00400000>; + id = <BL33_IMAGE_ID>; + }; + +#ifdef AARCH32_SP_OPTEE + tos_fw { + load-address = <0x0 0x2FFC0000>; + max-size = <0x0001F000>; + id = <BL32_IMAGE_ID>; + }; +#else + tos_fw { + load-address = <0x0 0x2FFC0000>; + max-size = <0x00019000>; + id = <BL32_IMAGE_ID>; + }; + + tos_fw-config { + load-address = <0x0 0x2FFD9000>; + max-size = <0x00005000>; + id = <TOS_FW_CONFIG_ID>; + }; +#endif + }; +}; diff --git a/fdts/stm32mp15-ddr-512m-fw-config.dts b/fdts/stm32mp15-ddr-512m-fw-config.dts new file mode 100644 index 000000000..822f55e12 --- /dev/null +++ b/fdts/stm32mp15-ddr-512m-fw-config.dts @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include <common/tbbr/tbbr_img_def.h> +#include <dt-bindings/soc/stm32mp1-tzc400.h> + +/dts-v1/; + +/ { + dtb-registry { + compatible = "fconf,dyn_cfg-dtb_registry"; + + hw-config { + load-address = <0x0 0xC0600000>; + max-size = <0x00020000>; + id = <HW_CONFIG_ID>; + }; + + nt_fw { + load-address = <0x0 0xC0100000>; + max-size = <0x00400000>; + id = <BL33_IMAGE_ID>; + }; + +#ifdef AARCH32_SP_OPTEE + tos_fw { + load-address = <0x0 0x2FFC0000>; + max-size = <0x0001F000>; + id = <BL32_IMAGE_ID>; + }; +#else + tos_fw { + load-address = <0x0 0x2FFC0000>; + max-size = <0x00019000>; + id = <BL32_IMAGE_ID>; + }; + + tos_fw-config { + load-address = <0x0 0x2FFD9000>; + max-size = <0x00005000>; + id = <TOS_FW_CONFIG_ID>; + }; +#endif + }; +}; diff --git a/fdts/stm32mp157a-avenger96-fw-config.dts b/fdts/stm32mp157a-avenger96-fw-config.dts new file mode 100644 index 000000000..10f9402c4 --- /dev/null +++ b/fdts/stm32mp157a-avenger96-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-1g-fw-config.dts" diff --git a/fdts/stm32mp157a-dk1-fw-config.dts b/fdts/stm32mp157a-dk1-fw-config.dts new file mode 100644 index 000000000..256d0db93 --- /dev/null +++ b/fdts/stm32mp157a-dk1-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-512m-fw-config.dts" diff --git a/fdts/stm32mp157a-ed1-fw-config.dts b/fdts/stm32mp157a-ed1-fw-config.dts new file mode 100644 index 000000000..10f9402c4 --- /dev/null +++ b/fdts/stm32mp157a-ed1-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-1g-fw-config.dts" diff --git a/fdts/stm32mp157a-ev1-fw-config.dts b/fdts/stm32mp157a-ev1-fw-config.dts new file mode 100644 index 000000000..10f9402c4 --- /dev/null +++ b/fdts/stm32mp157a-ev1-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-1g-fw-config.dts" diff --git a/fdts/stm32mp157c-dk2-fw-config.dts b/fdts/stm32mp157c-dk2-fw-config.dts new file mode 100644 index 000000000..256d0db93 --- /dev/null +++ b/fdts/stm32mp157c-dk2-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-512m-fw-config.dts" diff --git a/fdts/stm32mp157c-ed1-fw-config.dts b/fdts/stm32mp157c-ed1-fw-config.dts new file mode 100644 index 000000000..10f9402c4 --- /dev/null +++ b/fdts/stm32mp157c-ed1-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-1g-fw-config.dts" diff --git a/fdts/stm32mp157c-ev1-fw-config.dts b/fdts/stm32mp157c-ev1-fw-config.dts new file mode 100644 index 000000000..10f9402c4 --- /dev/null +++ b/fdts/stm32mp157c-ev1-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-1g-fw-config.dts" diff --git a/fdts/stm32mp157d-dk1-fw-config.dts b/fdts/stm32mp157d-dk1-fw-config.dts new file mode 100644 index 000000000..256d0db93 --- /dev/null +++ b/fdts/stm32mp157d-dk1-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-512m-fw-config.dts" diff --git a/fdts/stm32mp157d-ed1-fw-config.dts b/fdts/stm32mp157d-ed1-fw-config.dts new file mode 100644 index 000000000..10f9402c4 --- /dev/null +++ b/fdts/stm32mp157d-ed1-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-1g-fw-config.dts" diff --git a/fdts/stm32mp157d-ev1-fw-config.dts b/fdts/stm32mp157d-ev1-fw-config.dts new file mode 100644 index 000000000..10f9402c4 --- /dev/null +++ b/fdts/stm32mp157d-ev1-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-1g-fw-config.dts" diff --git a/fdts/stm32mp157f-dk2-fw-config.dts b/fdts/stm32mp157f-dk2-fw-config.dts new file mode 100644 index 000000000..256d0db93 --- /dev/null +++ b/fdts/stm32mp157f-dk2-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-512m-fw-config.dts" diff --git a/fdts/stm32mp157f-ed1-fw-config.dts b/fdts/stm32mp157f-ed1-fw-config.dts new file mode 100644 index 000000000..10f9402c4 --- /dev/null +++ b/fdts/stm32mp157f-ed1-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-1g-fw-config.dts" diff --git a/fdts/stm32mp157f-ev1-fw-config.dts b/fdts/stm32mp157f-ev1-fw-config.dts new file mode 100644 index 000000000..10f9402c4 --- /dev/null +++ b/fdts/stm32mp157f-ev1-fw-config.dts @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +/* + * Copyright (c) 2020, STMicroelectronics - All Rights Reserved + */ + +#include "stm32mp15-ddr-1g-fw-config.dts" diff --git a/plat/st/common/bl2_io_storage.c b/plat/st/common/bl2_io_storage.c index c8226ad9a..683196d3d 100644 --- a/plat/st/common/bl2_io_storage.c +++ b/plat/st/common/bl2_io_storage.c @@ -105,6 +105,10 @@ static const io_dev_connector_t *spi_dev_con; static const io_dev_connector_t *memmap_dev_con; #endif +static const io_uuid_spec_t fw_config_uuid_spec = { + .uuid = UUID_FW_CONFIG, +}; + static const io_uuid_spec_t bl33_partition_spec = { .uuid = UUID_NON_TRUSTED_FIRMWARE_BL33 }; @@ -216,6 +220,11 @@ static const struct plat_io_policy policies[] = { .image_spec = (uintptr_t)&bl33_partition_spec, .check = open_image }, + [FW_CONFIG_ID] = { + .dev_handle = &image_dev_handle, + .image_spec = (uintptr_t)&fw_config_uuid_spec, + .check = open_image + }, [TOS_FW_CONFIG_ID] = { .dev_handle = &image_dev_handle, .image_spec = (uintptr_t)&tos_fw_config_uuid_spec, diff --git a/plat/st/stm32mp1/bl2_plat_setup.c b/plat/st/stm32mp1/bl2_plat_setup.c index 0ab94b10a..f0e95175c 100644 --- a/plat/st/stm32mp1/bl2_plat_setup.c +++ b/plat/st/stm32mp1/bl2_plat_setup.c @@ -5,6 +5,7 @@ */ #include <assert.h> +#include <errno.h> #include <string.h> #include <platform_def.h> @@ -26,6 +27,8 @@ #include <drivers/st/stm32mp1_pwr.h> #include <drivers/st/stm32mp1_ram.h> #include <drivers/st/stpmic1.h> +#include <lib/fconf/fconf.h> +#include <lib/fconf/fconf_dyn_cfg_getter.h> #include <lib/mmio.h> #include <lib/optee_utils.h> #include <lib/xlat_tables/xlat_tables_v2.h> @@ -159,7 +162,6 @@ void bl2_el3_early_platform_setup(u_register_t arg0, void bl2_platform_setup(void) { int ret; - uint32_t ddr_ns_size; ret = stm32mp1_ddr_probe(); if (ret < 0) { @@ -167,26 +169,8 @@ void bl2_platform_setup(void) panic(); } - ddr_ns_size = stm32mp_get_ddr_ns_size(); - assert(ddr_ns_size > 0U); - - /* Map non secure DDR for BL33 load, now with cacheable attribute */ - ret = mmap_add_dynamic_region(STM32MP_DDR_BASE, STM32MP_DDR_BASE, - ddr_ns_size, MT_MEMORY | MT_RW | MT_NS); - assert(ret == 0); - #ifdef AARCH32_SP_OPTEE INFO("BL2 runs OP-TEE setup\n"); - - /* Map secure DDR for OP-TEE paged area */ - ret = mmap_add_dynamic_region(STM32MP_DDR_BASE + ddr_ns_size, - STM32MP_DDR_BASE + ddr_ns_size, - STM32MP_DDR_S_SIZE, - MT_MEMORY | MT_RW | MT_SECURE); - assert(ret == 0); - - /* Initialize tzc400 after DDR initialization */ - stm32mp1_security_setup(); #else INFO("BL2 runs SP_MIN setup\n"); #endif @@ -532,33 +516,6 @@ skip_console_init: stm32mp_io_setup(); } -#if defined(AARCH32_SP_OPTEE) -static void set_mem_params_info(entry_point_info_t *ep_info, - image_info_t *unpaged, image_info_t *paged) -{ - uintptr_t bl32_ep = 0; - - /* Use the default dram setup if no valid ep found */ - if (get_optee_header_ep(ep_info, &bl32_ep) && - (bl32_ep >= STM32MP_OPTEE_BASE) && - (bl32_ep < (STM32MP_OPTEE_BASE + STM32MP_OPTEE_SIZE))) { - assert((STM32MP_OPTEE_BASE >= BL2_LIMIT) || - ((STM32MP_OPTEE_BASE + STM32MP_OPTEE_SIZE) <= BL2_BASE)); - - unpaged->image_base = STM32MP_OPTEE_BASE; - unpaged->image_max_size = STM32MP_OPTEE_SIZE; - } else { - unpaged->image_base = STM32MP_DDR_BASE + dt_get_ddr_size() - - STM32MP_DDR_S_SIZE - - STM32MP_DDR_SHMEM_SIZE; - unpaged->image_max_size = STM32MP_DDR_S_SIZE; - } - paged->image_base = STM32MP_DDR_BASE + dt_get_ddr_size() - - STM32MP_DDR_S_SIZE - STM32MP_DDR_SHMEM_SIZE; - paged->image_max_size = STM32MP_DDR_S_SIZE; -} -#endif - /******************************************************************************* * This function can be used by the platforms to update/use image * information for given `image_id`. @@ -572,6 +529,24 @@ int bl2_plat_handle_post_image_load(unsigned int image_id) bl_mem_params_node_t *pager_mem_params; bl_mem_params_node_t *paged_mem_params; #endif + const struct dyn_cfg_dtb_info_t *fw_config_info, *config_info; + uint32_t fw_config_max_size; + uintptr_t nsec_base_address = 0U; + size_t nsec_size = 0U; +#if defined(AARCH32_SP_OPTEE) + uintptr_t sec_base_address = 0U; + size_t sec_size = 0U; +#endif + unsigned int i; + unsigned long long ddr_top __unused; + const unsigned int image_ids[] = { + BL32_IMAGE_ID, + BL33_IMAGE_ID, + HW_CONFIG_ID, +#if !defined(AARCH32_SP_OPTEE) + TOS_FW_CONFIG_ID, +#endif + }; assert(bl_mem_params != NULL); @@ -581,6 +556,123 @@ int bl2_plat_handle_post_image_load(unsigned int image_id) #endif switch (image_id) { + case FW_CONFIG_ID: + /* Set global DTB info for fixed fw_config information */ + fw_config_max_size = STM32MP_FW_CONFIG_MAX_SIZE; + set_config_info(STM32MP_FW_CONFIG_BASE, fw_config_max_size, FW_CONFIG_ID); + + fw_config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, FW_CONFIG_ID); + if (fw_config_info == NULL) { + ERROR("Invalid FW_CONFIG address\n"); + plat_error_handler(-1); + } + + err = fconf_populate_dtb_registry(fw_config_info->config_addr); + if (err < 0) { + ERROR("Parsing of FW_CONFIG failed %d\n", err); + plat_error_handler(err); + } + + /* Iterate through all the fw config IDs */ + for (i = 0; i < ARRAY_SIZE(image_ids); i++) { + bl_mem_params = get_bl_mem_params_node(image_ids[i]); + assert(bl_mem_params != NULL); + + config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, image_ids[i]); + if (config_info == NULL) { + ERROR("BL32_IMAGE_ID not found\n"); + plat_error_handler(-1); + } + + bl_mem_params->image_info.image_base = config_info->config_addr; + bl_mem_params->image_info.image_max_size = config_info->config_max_size; + + switch (image_ids[i]) { + case BL32_IMAGE_ID: + bl_mem_params->ep_info.pc = config_info->config_addr; +#if defined(AARCH32_SP_OPTEE) + sec_base_address += config_info->config_addr; + sec_size += config_info->config_max_size; + + /* In case of OPTEE, initialize address space with tos_fw addr */ + bl_mem_params = get_bl_mem_params_node(BL32_EXTRA1_IMAGE_ID); + bl_mem_params->image_info.image_base = config_info->config_addr; + bl_mem_params->image_info.image_max_size = + config_info->config_max_size; +#endif + break; + case TOS_FW_CONFIG_ID: + break; + case BL33_IMAGE_ID: + if (!wakeup_standby) { + bl_mem_params->ep_info.pc = config_info->config_addr; + } + nsec_base_address = config_info->config_addr; + nsec_size = config_info->config_max_size; + break; + case HW_CONFIG_ID: + if (config_info->config_addr < nsec_base_address) { + nsec_size += nsec_base_address - config_info->config_addr; + nsec_base_address = config_info->config_addr; + } else { + nsec_size = config_info->config_addr - nsec_base_address + + config_info->config_max_size; + } + break; + default: + return -EINVAL; + } + } +#if defined(AARCH32_SP_OPTEE) + /* Fix PAGEABLE part into DDR */ + bl_mem_params = get_bl_mem_params_node(BL32_EXTRA2_IMAGE_ID); + + if (sec_base_address < STM32MP_DDR_BASE) { + sec_base_address = STM32MP_DDR_BASE + (dt_get_ddr_size() - + STM32MP_DDR_S_SIZE - + STM32MP_DDR_SHMEM_SIZE); + sec_size = STM32MP_DDR_S_SIZE; + bl_mem_params->image_info.image_base = sec_base_address; + bl_mem_params->image_info.image_max_size = sec_size; + } + + err = mmap_add_dynamic_region(sec_base_address, + sec_base_address, + sec_size, + MT_MEMORY | MT_RW | MT_SECURE); + assert(err == 0); +#endif + + err = mmap_add_dynamic_region(nsec_base_address, + nsec_base_address, + nsec_size, + MT_MEMORY | MT_RW | MT_NS); + assert(err == 0); + + /* Configuration of TZC400 */ + stm32mp1_security_setup_begin(); + +#if defined(AARCH32_SP_OPTEE) + stm32mp1_security_add_region(sec_base_address, sec_size, true); + + if (sec_base_address > STM32MP_DDR_BASE) { + stm32mp1_security_add_region(STM32MP_DDR_BASE, + sec_base_address - STM32MP_DDR_BASE, + false); + } + + ddr_top = STM32MP_DDR_BASE + dt_get_ddr_size() - 1U; + if (sec_base_address + sec_size < ddr_top) { + stm32mp1_security_add_region(sec_base_address + sec_size, + ddr_top - (sec_base_address + sec_size) + 1U, + false); + } +#else + stm32mp1_security_add_region(STM32MP_DDR_BASE, dt_get_ddr_size(), false); +#endif + stm32mp1_security_setup_end(); + + break; case BL32_IMAGE_ID: #if defined(AARCH32_SP_OPTEE) bl_mem_params->ep_info.pc = @@ -592,10 +684,6 @@ int bl2_plat_handle_post_image_load(unsigned int image_id) paged_mem_params = get_bl_mem_params_node(BL32_EXTRA2_IMAGE_ID); assert(paged_mem_params != NULL); - set_mem_params_info(&bl_mem_params->ep_info, - &pager_mem_params->image_info, - &paged_mem_params->image_info); - err = parse_optee_header(&bl_mem_params->ep_info, &pager_mem_params->image_info, &paged_mem_params->image_info); diff --git a/plat/st/stm32mp1/plat_bl2_mem_params_desc.c b/plat/st/stm32mp1/plat_bl2_mem_params_desc.c index b9e74229d..dcafb8c3a 100644 --- a/plat/st/stm32mp1/plat_bl2_mem_params_desc.c +++ b/plat/st/stm32mp1/plat_bl2_mem_params_desc.c @@ -19,6 +19,21 @@ * the next executable image id. ******************************************************************************/ static bl_mem_params_node_t bl2_mem_params_descs[] = { + /* Fill FW_CONFIG related information if it exists */ + { + .image_id = FW_CONFIG_ID, + SET_STATIC_PARAM_HEAD(ep_info, PARAM_IMAGE_BINARY, + VERSION_2, entry_point_info_t, + SECURE | NON_EXECUTABLE), + SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY, + VERSION_2, image_info_t, + IMAGE_ATTRIB_PLAT_SETUP), + + .image_info.image_base = STM32MP_FW_CONFIG_BASE, + .image_info.image_max_size = STM32MP_FW_CONFIG_MAX_SIZE, + + .next_handoff_image_id = INVALID_IMAGE_ID, + }, /* Fill BL32 related information */ { .image_id = BL32_IMAGE_ID, @@ -27,24 +42,14 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = { VERSION_2, entry_point_info_t, SECURE | EXECUTABLE | EP_FIRST_EXE), -#if !defined(AARCH32_SP_OPTEE) - .ep_info.pc = STM32MP_BL32_BASE, -#endif .ep_info.spsr = SPSR_MODE32(MODE32_svc, SPSR_T_ARM, SPSR_E_LITTLE, DISABLE_ALL_EXCEPTIONS), SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t, - IMAGE_ATTRIB_PLAT_SETUP), -#if defined(AARCH32_SP_OPTEE) - /* optee header is loaded in SYSRAM above BL2 */ - .image_info.image_base = STM32MP_OPTEE_BASE, - .image_info.image_max_size = STM32MP_OPTEE_SIZE, -#else - .image_info.image_base = STM32MP_BL32_BASE, - .image_info.image_max_size = STM32MP_BL32_SIZE, -#endif + 0), + .next_handoff_image_id = BL33_IMAGE_ID, }, @@ -88,10 +93,6 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = { VERSION_2, image_info_t, 0), - .image_info.image_base = STM32MP_HW_CONFIG_BASE, - .image_info.image_max_size = - PLAT_STM32MP_NS_IMAGE_OFFSET - STM32MP_HW_CONFIG_BASE, - .next_handoff_image_id = INVALID_IMAGE_ID, }, #if !defined(AARCH32_SP_OPTEE) @@ -104,8 +105,6 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = { VERSION_2, image_info_t, 0), - .image_info.image_base = STM32MP_BL32_DTB_BASE, - .image_info.image_max_size = STM32MP_BL32_DTB_SIZE, .next_handoff_image_id = INVALID_IMAGE_ID, }, #endif @@ -117,7 +116,6 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = { VERSION_2, entry_point_info_t, NON_SECURE | EXECUTABLE), - .ep_info.pc = PLAT_STM32MP_NS_IMAGE_OFFSET, .ep_info.spsr = SPSR_MODE32(MODE32_svc, SPSR_T_ARM, SPSR_E_LITTLE, DISABLE_ALL_EXCEPTIONS), @@ -125,10 +123,6 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = { SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t, 0), - .image_info.image_base = PLAT_STM32MP_NS_IMAGE_OFFSET, - .image_info.image_max_size = STM32MP_DDR_MAX_SIZE - - (PLAT_STM32MP_NS_IMAGE_OFFSET - STM32MP_DDR_BASE), - .next_handoff_image_id = INVALID_IMAGE_ID, } }; diff --git a/plat/st/stm32mp1/plat_image_load.c b/plat/st/stm32mp1/plat_image_load.c index 120cabc25..a5afbe4e5 100644 --- a/plat/st/stm32mp1/plat_image_load.c +++ b/plat/st/stm32mp1/plat_image_load.c @@ -33,14 +33,7 @@ static bool addr_inside_backupsram(uintptr_t addr) ******************************************************************************/ bl_load_info_t *plat_get_bl_image_load_info(void) { -#ifdef AARCH32_SP_OPTEE - bl_mem_params_node_t *bl32 = get_bl_mem_params_node(BL32_IMAGE_ID); -#endif - bl_mem_params_node_t *bl33 = get_bl_mem_params_node(BL33_IMAGE_ID); - uint32_t ddr_ns_size = stm32mp_get_ddr_ns_size(); uint32_t rstsr = mmio_read_32(stm32mp_rcc_base() + RCC_MP_RSTSCLRR); - uint32_t bkpr_core1_addr = - tamp_bkpr(BOOT_API_CORE1_BRANCH_ADDRESS_TAMP_BCK_REG_IDX); uintptr_t pwr_base = stm32mp_pwr_base(); /* @@ -52,12 +45,22 @@ bl_load_info_t *plat_get_bl_image_load_info(void) if (stm32mp_boot_action_is_wakeup_from_standby() && ((mmio_read_32(pwr_base + PWR_CR3) & PWR_CR3_DDRSREN) != 0U) && ((rstsr & RCC_MP_RSTSCLRR_PADRSTF) == 0U)) { + uint32_t bkpr_core1_addr = + tamp_bkpr(BOOT_API_CORE1_BRANCH_ADDRESS_TAMP_BCK_REG_IDX); + stm32mp_clk_enable(RTCAPB); if (mmio_read_32(bkpr_core1_addr) != 0U) { + bl_mem_params_node_t *bl33 = get_bl_mem_params_node(BL33_IMAGE_ID); + bl_mem_params_node_t *bl32 __unused; + bl_mem_params_node_t *ns_dt __unused; + bl33->image_info.h.attr |= IMAGE_ATTRIB_SKIP_LOADING; -#ifdef AARCH32_SP_OPTEE + ns_dt = get_bl_mem_params_node(HW_CONFIG_ID); + ns_dt->image_info.h.attr |= IMAGE_ATTRIB_SKIP_LOADING; +#if AARCH32_SP_OPTEE + bl32 = get_bl_mem_params_node(BL32_IMAGE_ID); bl32->image_info.h.attr |= IMAGE_ATTRIB_SKIP_LOADING; bl32->ep_info.pc = stm32_pm_get_optee_ep(); @@ -76,10 +79,6 @@ bl_load_info_t *plat_get_bl_image_load_info(void) stm32mp_clk_disable(RTCAPB); } - /* Max size is non-secure DDR end address minus image_base */ - bl33->image_info.image_max_size = STM32MP_DDR_BASE + ddr_ns_size - - bl33->image_info.image_base; - return get_bl_load_info_from_mem_params_desc(); } diff --git a/plat/st/stm32mp1/platform.mk b/plat/st/stm32mp1/platform.mk index d1ff12db7..eb64db88d 100644 --- a/plat/st/stm32mp1/platform.mk +++ b/plat/st/stm32mp1/platform.mk @@ -89,6 +89,11 @@ STM32IMAGE ?= ${STM32IMAGEPATH}/stm32image${BIN_EXT} STM32IMAGE_SRC := ${STM32IMAGEPATH}/stm32image.c STM32MP_NT_FW_CONFIG := ${BL33_CFG} +STM32MP_FW_CONFIG_NAME := $(patsubst %.dtb,%-fw-config.dtb,$(DTB_FILE_NAME)) +STM32MP_FW_CONFIG := ${BUILD_PLAT}/fdts/$(STM32MP_FW_CONFIG_NAME) +FDT_SOURCES += $(addprefix fdts/, $(patsubst %.dtb,%.dts,$(STM32MP_FW_CONFIG_NAME))) +# Add the FW_CONFIG to FIP and specify the same to certtool +$(eval $(call TOOL_ADD_PAYLOAD,${STM32MP_FW_CONFIG},--fw-config)) # Add the NT_FW_CONFIG to FIP and specify the same to certtool $(eval $(call TOOL_ADD_PAYLOAD,${STM32MP_NT_FW_CONFIG},--hw-config)) ifeq ($(AARCH32_SP),sp_min) @@ -183,6 +188,9 @@ PLAT_BL_COMMON_SOURCES += drivers/arm/tzc/tzc400.c \ plat/st/stm32mp1/stm32mp1_security.c \ plat/st/stm32mp1/stm32mp1_syscfg.c +BL2_SOURCES += lib/fconf/fconf.c \ + lib/fconf/fconf_dyn_cfg_getter.c + BL2_SOURCES += drivers/io/io_block.c \ drivers/io/io_dummy.c \ drivers/io/io_fip.c \ diff --git a/plat/st/stm32mp1/sp_min/sp_min_setup.c b/plat/st/stm32mp1/sp_min/sp_min_setup.c index bc385b5b4..737a6abe2 100644 --- a/plat/st/stm32mp1/sp_min/sp_min_setup.c +++ b/plat/st/stm32mp1/sp_min/sp_min_setup.c @@ -290,32 +290,47 @@ static void stm32mp1_etzpc_early_setup(void) etzpc_configure_tzma(STM32MP1_ETZPC_TZMA_SYSRAM, TZMA1_SECURE_RANGE); } -static void populate_ns_dt(u_register_t ns_dt_addr) +static void populate_ns_dt(u_register_t ns_dt_addr, uintptr_t sec_base, size_t sec_size) { void *external_fdt = (void *)ns_dt_addr; int ret; + if (sec_base < STM32MP_DDR_BASE) { + /* No need to reserve memory if secure monitor is not in DDR */ + return; + } + + /* Map Base Non Secure DDR for Non secure DT update */ + ret = mmap_add_dynamic_region(ns_dt_addr, ns_dt_addr, STM32MP_HW_CONFIG_MAX_SIZE, + MT_NON_CACHEABLE | MT_EXECUTE_NEVER | MT_RW | MT_NS); + assert(ret == 0); + if (fdt_check_header(external_fdt) != 0) { INFO("Non-secure device tree not found\n"); - return; + goto out; } ret = fdt_open_into(external_fdt, external_fdt, STM32MP_HW_CONFIG_MAX_SIZE); if (ret < 0) { WARN("Error opening DT %i\n", ret); + goto out; } - ret = fdt_add_reserved_memory(external_fdt, "tf-a", BL_CODE_BASE, - (BL32_LIMIT + STM32MP_BL32_DTB_SIZE) - BL_CODE_BASE); + ret = fdt_add_reserved_memory(external_fdt, "tf-a", sec_base, sec_size); if (ret < 0) { WARN("Error updating DT %i\n", ret); + goto out; } ret = fdt_pack(external_fdt); if (ret < 0) { WARN("Error packing DT %i\n", ret); } + +out: + ret = mmap_remove_dynamic_region(ns_dt_addr, STM32MP_HW_CONFIG_MAX_SIZE); + assert(ret == 0); } /******************************************************************************* @@ -365,6 +380,9 @@ void sp_min_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) { bl_params_t *params_from_bl2 = (bl_params_t *)arg0; + uintptr_t dt_addr = arg1; + uintptr_t sec_base = 0U; + size_t sec_size = 0U; /* Imprecise aborts can be masked in NonSecure */ write_scr(read_scr() | SCR_AW_BIT); @@ -381,11 +399,11 @@ void sp_min_early_platform_setup2(u_register_t arg0, u_register_t arg1, bl_params_node_t *bl_params = params_from_bl2->head; - /* - * Copy BL33 entry point information. - * They are stored in Secure RAM, in BL2's address space. - */ while (bl_params != NULL) { + /* + * Copy BL33 entry point information. + * They are stored in Secure RAM, in BL2's address space. + */ if (bl_params->image_id == BL33_IMAGE_ID) { bl33_image_ep_info = *bl_params->ep_info; /* @@ -397,14 +415,17 @@ void sp_min_early_platform_setup2(u_register_t arg0, u_register_t arg1, bl33_image_ep_info.args.arg1 = 0U; bl33_image_ep_info.args.arg2 = arg2; } + } - break; + if (bl_params->image_id == BL32_IMAGE_ID) { + sec_base = bl_params->image_info->image_base; + sec_size = bl_params->image_info->image_max_size; } bl_params = bl_params->next_params_info; } - if (dt_open_and_check(STM32MP_DTB_BASE) < 0) { + if (dt_open_and_check(dt_addr) < 0) { panic(); } @@ -421,7 +442,7 @@ void sp_min_early_platform_setup2(u_register_t arg0, u_register_t arg1, stm32mp1_etzpc_early_setup(); if (arg2 != 0U) { - populate_ns_dt(arg2); + populate_ns_dt(arg2, sec_base, sec_size); } else { INFO("Non-secure device tree not found\n"); } @@ -475,9 +496,6 @@ void sp_min_platform_setup(void) { ddr_save_sr_mode(); - /* Initialize tzc400 after DDR initialization */ - stm32mp1_security_setup(); - generic_delay_timer_init(); stm32_gic_init(); diff --git a/plat/st/stm32mp1/stm32mp1_def.h b/plat/st/stm32mp1/stm32mp1_def.h index 29e2c2626..8faf6d79e 100644 --- a/plat/st/stm32mp1/stm32mp1_def.h +++ b/plat/st/stm32mp1/stm32mp1_def.h @@ -127,20 +127,22 @@ enum ddr_type { #define STM32MP_OPTEE_SIZE (STM32MP_DTB_BASE - \ STM32MP_OPTEE_BASE) -#define STM32MP_BL2_SIZE U(0x0001A000) /* 104 KB for BL2 */ +#define STM32MP_BL2_SIZE U(0x0001B000) /* 108 KB for BL2 */ #define STM32MP_BL2_BASE (STM32MP_SEC_SYSRAM_BASE + \ STM32MP_SEC_SYSRAM_SIZE - \ STM32MP_BL2_SIZE) #else -#define STM32MP_BL32_SIZE U(0x00018000) /* 92 KB for BL32 */ +#define STM32MP_BL32_SIZE U(0x00019000) /* 96 KB for BL32 */ #define STM32MP_BL32_BASE (STM32MP_SEC_SYSRAM_BASE + \ STM32MP_SEC_SYSRAM_SIZE - \ STM32MP_BL32_SIZE) -#define STM32MP_BL2_SIZE U(0x0001E000) /* 100 KB for BL2 */ -#define STM32MP_BL2_BASE (STM32MP_BL32_DTB_BASE - \ +#define STM32MP_BL2_SIZE U(0x0001B000) /* 108 KB for BL2 */ + +#define STM32MP_BL2_BASE (STM32MP_SEC_SYSRAM_BASE + \ + STM32MP_SEC_SYSRAM_SIZE - \ STM32MP_BL2_SIZE) #endif @@ -179,8 +181,12 @@ enum ddr_type { #define STM32MP_DTB_BASE STM32MP_BL32_DTB_BASE #endif +#define STM32MP_FW_CONFIG_BASE (STM32MP_SYSRAM_BASE + \ + STM32MP_SYSRAM_SIZE - \ + PAGE_SIZE) +#define STM32MP_FW_CONFIG_MAX_SIZE PAGE_SIZE #define STM32MP_HW_CONFIG_BASE STM32MP_DDR_BASE -#define STM32MP_HW_CONFIG_MAX_SIZE U(0x10000) +#define STM32MP_HW_CONFIG_MAX_SIZE U(0x20000) #define STM32MP_BL33_BASE (STM32MP_DDR_BASE + U(0x100000)) /* Define Temporary Stack size use during low power mode */ -- GitLab