From 973e0b7f2cc9ac64132b2179295c424a88b690ea Mon Sep 17 00:00:00 2001 From: Divin Raj Date: Thu, 4 Apr 2024 10:16:14 +0100 Subject: [PATCH 1/7] feat(arm): add support for loading CONFIG from BL2 This commit introduces a new ARM platform-specific build option called `ARM_FW_CONFIG_LOAD_ENABLE`. This option enables the loading of the `fw_config` device tree when resetting to the BL2 scenario. Additionally, the FW_CONFIG image reference has been added to the fdts/tbbr_cot_descriptors.dtsi file in order to use in the scenario of RESET_TO_BL2. Signed-off-by: Divin Raj Change-Id: I11de497b7dbb1386ed84d939d6fd2a11856e9e1b --- docs/plat/arm/arm-build-options.rst | 6 +++++ fdts/tbbr_cot_descriptors.dtsi | 6 +++++ include/plat/arm/common/plat_arm.h | 3 +++ plat/arm/common/arm_bl2_el3_setup.c | 41 ++++++++++++++++++++++++++++- plat/arm/common/arm_bl2_setup.c | 3 +++ plat/arm/common/arm_common.mk | 19 +++++++++++++ 6 files changed, 77 insertions(+), 1 deletion(-) diff --git a/docs/plat/arm/arm-build-options.rst b/docs/plat/arm/arm-build-options.rst index e1b3ef0e6..afbb15767 100644 --- a/docs/plat/arm/arm-build-options.rst +++ b/docs/plat/arm/arm-build-options.rst @@ -16,6 +16,12 @@ Arm Platform Build Options should match the frame used by the Non-Secure image (normally the Linux kernel). Default is true (access to the frame is allowed). +- ``ARM_FW_CONFIG_LOAD_ENABLE``: Boolean option to enable the loading of + FW_CONFIG device trees from the Firmware Image Package (FIP). When enabled, + BL2 calls the platform specific function `arm_bl2_el3_plat_config_load`. + This function is responsible for loading, parsing, and validating the + FW_CONFIG device trees from the FIP. The option depends on RESET_TO_BL2. + - ``ARM_DISABLE_TRUSTED_WDOG``: boolean option to disable the Trusted Watchdog. By default, Arm platforms use a watchdog to trigger a system reset in case an error is encountered during the boot process (for example, when an image diff --git a/fdts/tbbr_cot_descriptors.dtsi b/fdts/tbbr_cot_descriptors.dtsi index b3c0ca7a2..253297f38 100644 --- a/fdts/tbbr_cot_descriptors.dtsi +++ b/fdts/tbbr_cot_descriptors.dtsi @@ -195,6 +195,12 @@ cot { hash = <&hw_config_hash>; }; + fw_config { + image-id = ; + parent = <&trusted_boot_fw_cert>; + hash = <&fw_config_hash>; + }; + scp_bl2_image { image-id = ; parent = <&scp_fw_content_cert>; diff --git a/include/plat/arm/common/plat_arm.h b/include/plat/arm/common/plat_arm.h index 83a5cd21f..c3756bf5d 100644 --- a/include/plat/arm/common/plat_arm.h +++ b/include/plat/arm/common/plat_arm.h @@ -262,6 +262,9 @@ void arm_bl2_setup_next_ep_info(bl_mem_params_node_t *next_param_node); /* BL2 at EL3 functions */ void arm_bl2_el3_early_platform_setup(void); void arm_bl2_el3_plat_arch_setup(void); +#if ARM_FW_CONFIG_LOAD_ENABLE +void arm_bl2_el3_plat_config_load(void); +#endif /* ARM_FW_CONFIG_LOAD_ENABLE */ /* BL2U utility functions */ void arm_bl2u_early_platform_setup(struct meminfo *mem_layout, diff --git a/plat/arm/common/arm_bl2_el3_setup.c b/plat/arm/common/arm_bl2_el3_setup.c index 01e0db0bc..869830d41 100644 --- a/plat/arm/common/arm_bl2_el3_setup.c +++ b/plat/arm/common/arm_bl2_el3_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2023, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2024, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -8,6 +8,8 @@ #include #include +#include +#include #include #include #include @@ -64,6 +66,43 @@ void bl2_el3_early_platform_setup(u_register_t arg0 __unused, generic_delay_timer_init(); } +#if ARM_FW_CONFIG_LOAD_ENABLE +/************************************************************************************* + * FW CONFIG load function for BL2 when RESET_TO_BL2=1 && ARM_FW_CONFIG_LOAD_ENABLE=1 + *************************************************************************************/ +void arm_bl2_el3_plat_config_load(void) +{ + int ret; + const struct dyn_cfg_dtb_info_t *fw_config_info; + + /* Set global DTB info for fixed fw_config information */ + set_config_info(PLAT_FW_CONFIG_BASE, ~0UL, PLAT_FW_CONFIG_MAX_SIZE, FW_CONFIG_ID); + + /* Fill the device tree information struct with the info from the config dtb */ + ret = fconf_load_config(FW_CONFIG_ID); + if (ret < 0) { + ERROR("Loading of FW_CONFIG failed %d\n", ret); + plat_error_handler(ret); + } + + /* + * FW_CONFIG loaded successfully. Check the FW_CONFIG device tree parsing + * is successful. + */ + fw_config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, FW_CONFIG_ID); + if (fw_config_info == NULL) { + ret = -1; + ERROR("Invalid FW_CONFIG address\n"); + plat_error_handler(ret); + } + ret = fconf_populate_dtb_registry(fw_config_info->config_addr); + if (ret < 0) { + ERROR("Parsing of FW_CONFIG failed %d\n", ret); + plat_error_handler(ret); + } +} +#endif /* ARM_FW_CONFIG_LOAD_ENABLE */ + /******************************************************************************* * Perform the very early platform specific architectural setup here. At the * moment this is only initializes the mmu in a quick and dirty way. diff --git a/plat/arm/common/arm_bl2_setup.c b/plat/arm/common/arm_bl2_setup.c index b5a7db140..d018a9500 100644 --- a/plat/arm/common/arm_bl2_setup.c +++ b/plat/arm/common/arm_bl2_setup.c @@ -140,6 +140,9 @@ void bl2_plat_preload_setup(void) arm_transfer_list_dyn_cfg_init(secure_tl); #else +#if ARM_FW_CONFIG_LOAD_ENABLE + arm_bl2_el3_plat_config_load(); +#endif /* ARM_FW_CONFIG_LOAD_ENABLE */ arm_bl2_dyn_cfg_init(); #endif diff --git a/plat/arm/common/arm_common.mk b/plat/arm/common/arm_common.mk index 0c9b94389..13694b83e 100644 --- a/plat/arm/common/arm_common.mk +++ b/plat/arm/common/arm_common.mk @@ -164,6 +164,25 @@ ifneq ($(filter 1,${RESET_TO_BL31} ${RESET_TO_SP_MIN}),) ENABLE_PIE := 1 endif +# On Arm platform, disable ARM_FW_CONFIG_LOAD_ENABLE by default. +ARM_FW_CONFIG_LOAD_ENABLE := 0 +$(eval $(call assert_boolean,ARM_FW_CONFIG_LOAD_ENABLE)) +$(eval $(call add_define,ARM_FW_CONFIG_LOAD_ENABLE)) + +# In order to enable ARM_FW_CONFIG_LOAD_ENABLE for the Arm platform, the +# platform should be reset to BL2 (RESET_TO_BL2=1), and FW_CONFIG must be +# specified. +ifeq (${ARM_FW_CONFIG_LOAD_ENABLE},1) + ifneq (${RESET_TO_BL2},1) + $(error RESET_TO_BL2 must be enabled when ARM_FW_CONFIG_LOAD_ENABLE \ + is enabled) + endif + ifeq (${FW_CONFIG},) + $(error FW_CONFIG must be specified when ARM_FW_CONFIG_LOAD_ENABLE \ + is enabled) + endif +endif + # Disable GPT parser support, use FIP image by default ARM_GPT_SUPPORT := 0 $(eval $(call assert_boolean,ARM_GPT_SUPPORT)) From 8d5c762731c35471a170004d282ce1669a91cc0b Mon Sep 17 00:00:00 2001 From: Divin Raj Date: Tue, 16 Apr 2024 14:07:10 +0100 Subject: [PATCH 2/7] build(bl2): enable check for bl2 base overflow assert Currently, the BL2 base overflow check asserts for all cases, but this check is only necessary if not reset to BL2 case. Therefore, adding a condition for this check. Signed-off-by: Divin Raj Change-Id: Ia129921d76bcd32058ea0767db0319e6724be8ab --- plat/arm/common/arm_bl2_setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plat/arm/common/arm_bl2_setup.c b/plat/arm/common/arm_bl2_setup.c index d018a9500..90ee70cc0 100644 --- a/plat/arm/common/arm_bl2_setup.c +++ b/plat/arm/common/arm_bl2_setup.c @@ -42,7 +42,7 @@ static uintptr_t config_base __unused; #if TRANSFER_LIST CASSERT(BL2_BASE >= PLAT_ARM_EL3_FW_HANDOFF_BASE + PLAT_ARM_FW_HANDOFF_SIZE, assert_bl2_base_overflows); -#else +#elif !RESET_TO_BL2 CASSERT(BL2_BASE >= ARM_FW_CONFIG_LIMIT, assert_bl2_base_overflows); #endif /* TRANSFER_LIST */ From f661c74b528f3aee6f30a28a82e8c76ab26f35f7 Mon Sep 17 00:00:00 2001 From: Peter Hoyes Date: Mon, 20 Feb 2023 12:08:43 +0000 Subject: [PATCH 3/7] feat(rd1ae): introduce Arm RD-1 AE platform Create a new platform for the RD-1 AE automotive FVP. This platform contains: * Neoverse-V3AE, Arm9.2-A application processor * A GICv4-compatible GIC-720AE * 128 MB of SRAM, of which 1 MB is reserved for TF-A and BL2 runs at ELmax (EL3). Additionally, this commit updates the maintainers.rst file and the changelog.yaml to add scope for RD-1 AE variants. Signed-off-by: Peter Hoyes Signed-off-by: Divin Raj Signed-off-by: Rahul Singh Change-Id: I9ae64b3f05a52653ebd1d334b15b7f21821264e2 --- changelog.yaml | 7 + docs/about/maintainers.rst | 13 ++ .../platform/rd1ae/include/plat_macros.S | 25 ++++ .../platform/rd1ae/include/platform_def.h | 138 ++++++++++++++++++ .../platform/rd1ae/include/rd1ae_helpers.S | 45 ++++++ .../automotive_rd/platform/rd1ae/platform.mk | 50 +++++++ .../automotive_rd/platform/rd1ae/rd1ae_err.c | 22 +++ .../automotive_rd/platform/rd1ae/rd1ae_plat.c | 55 +++++++ 8 files changed, 355 insertions(+) create mode 100644 plat/arm/board/automotive_rd/platform/rd1ae/include/plat_macros.S create mode 100644 plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h create mode 100644 plat/arm/board/automotive_rd/platform/rd1ae/include/rd1ae_helpers.S create mode 100644 plat/arm/board/automotive_rd/platform/rd1ae/platform.mk create mode 100644 plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_err.c create mode 100644 plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_plat.c diff --git a/changelog.yaml b/changelog.yaml index d073a8427..5224441cc 100644 --- a/changelog.yaml +++ b/changelog.yaml @@ -272,6 +272,13 @@ subsections: - title: Corstone-1000 scope: corstone-1000 + - title: Automotive RD + scope: automotive_rd + + subsections: + - title: RD-1 AE + scope: rd1ae + - title: Aspeed scope: aspeed diff --git a/docs/about/maintainers.rst b/docs/about/maintainers.rst index 8bb12abbd..4d08a7f58 100644 --- a/docs/about/maintainers.rst +++ b/docs/about/maintainers.rst @@ -594,6 +594,16 @@ Arm Total Compute platform port :|G|: `rupsin01`_ :|F|: plat/arm/board/tc +Arm Automotive RD platform port +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:|M|: Diego Sueiro +:|G|: `diego-sueiro`_ +:|M|: Peter Hoyes +:|G|: `hoyes`_ +:|M|: Divin Raj +:|G|: `divin-raj`_ +:|F|: plat/arm/board/automotive_rd + Aspeed platform port ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :|M|: Chia-Wei Wang @@ -1041,12 +1051,15 @@ Conventional Changelog Extensions .. _CJKay: https://github.com/cjkay .. _danh-arm: https://github.com/danh-arm .. _davidvincze: https://github.com/davidvincze +.. _diego-sueiro: https://github.com/diego-sueiro +.. _divin-raj: https://github.com/divin-raj .. _etienne-lms: https://github.com/etienne-lms .. _glneo: https://github.com/glneo .. _gprocopciucnxp: https://github.com/gprocopciucnxp .. _grandpaul: https://github.com/grandpaul .. _harrisonmutai-arm: https://github.com/harrisonmutai-arm .. _hilamirandakuzi1: https://github.com/hilamirandakuzi1 +.. _hoyes: https://github.com/hoyes .. _hzhuang1: https://github.com/hzhuang1 .. _hugues-kambampiana-arm: https://github.com/hugueskamba .. _JackyBai: https://github.com/JackyBai diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/include/plat_macros.S b/plat/arm/board/automotive_rd/platform/rd1ae/include/plat_macros.S new file mode 100644 index 000000000..8efe8acb1 --- /dev/null +++ b/plat/arm/board/automotive_rd/platform/rd1ae/include/plat_macros.S @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef PLAT_MACROS_S +#define PLAT_MACROS_S + +#include + +/* --------------------------------------------- + * The below required platform porting macro + * prints out relevant platform registers + * whenever an unhandled exception is taken in + * BL31. + * + * There are currently no platform specific regs + * to print. + * --------------------------------------------- + */ + .macro plat_crash_print_regs + .endm + +#endif /* PLAT_MACROS_S */ diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h b/plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h new file mode 100644 index 000000000..3bb719a12 --- /dev/null +++ b/plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef PLATFORM_DEF_H +#define PLATFORM_DEF_H + +#include +#include + +/* These are referenced by arm_def.h #included next, so #define first. */ +#define PLAT_ARM_TRUSTED_SRAM_BASE UL(0x0) + +#include +#include +#include + +#define PLATFORM_CORE_COUNT U(16) +#define PLAT_ARM_CLUSTER_COUNT U(16) +#define PLAT_MAX_CPUS_PER_CLUSTER U(1) +#define PLAT_MAX_PE_PER_CPU U(1) + +#define PLATFORM_STACK_SIZE UL(0x1000) + +/* BL1 is not supported */ +#define PLAT_ARM_TRUSTED_ROM_BASE UL(0x0) +#define PLAT_ARM_TRUSTED_ROM_SIZE UL(0x0) + +#define PLAT_ARM_TRUSTED_SRAM_SIZE UL(0x00080000) + +/* USE_ROMLIB is not supported */ +#define PLAT_ARM_MAX_ROMLIB_RW_SIZE U(0) +#define PLAT_ARM_MAX_ROMLIB_RO_SIZE U(0) + +/* Defined based on actual binary sizes */ +#define PLAT_ARM_MAX_BL1_RW_SIZE 0x0 +#define PLAT_ARM_MAX_BL2_SIZE 0x20000 +#define PLAT_ARM_MAX_BL31_SIZE 0x70000 + +#define PLAT_ARM_DRAM2_BASE ULL(0x8080000000) +#define PLAT_ARM_DRAM2_SIZE ULL(0x180000000) + +#define PLAT_CSS_MHU_BASE UL(0x2A920000) +#define PLAT_ARM_NSTIMER_FRAME_ID U(0) + +#define SOC_CSS_SEC_UART_BASE UL(0x2A410000) +#define SOC_CSS_NSEC_UART_BASE UL(0x2A400000) +#define SOC_CSS_UART_SIZE UL(0x10000) +#define SOC_CSS_UART_CLK_IN_HZ UL(7372800) +#define PLAT_ARM_BOOT_UART_BASE SOC_CSS_SEC_UART_BASE +#define PLAT_ARM_BOOT_UART_CLK_IN_HZ SOC_CSS_UART_CLK_IN_HZ +#define PLAT_ARM_RUN_UART_BASE SOC_CSS_SEC_UART_BASE +#define PLAT_ARM_RUN_UART_CLK_IN_HZ SOC_CSS_UART_CLK_IN_HZ +#define PLAT_ARM_CRASH_UART_BASE SOC_CSS_SEC_UART_BASE +#define PLAT_ARM_CRASH_UART_CLK_IN_HZ SOC_CSS_UART_CLK_IN_HZ + +/* Physical and virtual address space limits for MMU */ +#define PLAT_PHY_ADDR_SPACE_SIZE (1ULL << 42) +#define PLAT_VIRT_ADDR_SPACE_SIZE (1ULL << 42) + +/* GIC related constants */ +#define PLAT_ARM_GICD_BASE UL(0x30000000) +#define PLAT_ARM_GICR_BASE UL(0x301C0000) +#define PLAT_ARM_GICC_BASE UL(0x2C000000) +#define PLAT_ARM_G1S_IRQ_PROPS(grp) CSS_G1S_IRQ_PROPS(grp) +#define PLAT_ARM_G0_IRQ_PROPS(grp) ARM_G0_IRQ_PROPS(grp) + +/* Virtual address used by dynamic mem_protect for chunk_base */ +#define PLAT_ARM_MEM_PROTEC_VA_FRAME UL(0xC0000000) + +/* Secure Watchdog Constants */ +#define SBSA_SECURE_WDOG_BASE UL(0x2A480000) +#define SBSA_SECURE_WDOG_TIMEOUT UL(100) + +#define V2M_SYS_LED_SS_SHIFT U(0) +#define V2M_SYS_LED_EL_SHIFT U(1) +#define V2M_SYS_LED_EC_SHIFT U(3) + +#define V2M_SYS_LED_SS_MASK U(0x01) +#define V2M_SYS_LED_EL_MASK U(0x03) +#define V2M_SYS_LED_EC_MASK U(0x1f) + +#define V2M_SYSREGS_BASE UL(0x0C010000) +#define V2M_SYS_LED U(0x8) + +#define PLAT_ARM_SCMI_CHANNEL_COUNT U(1) +#define CSS_SYSTEM_PWR_DMN_LVL ARM_PWR_LVL2 +#define PLAT_MAX_PWR_LVL ARM_PWR_LVL1 + +#define MAX_IO_DEVICES U(3) +#define MAX_IO_HANDLES U(4) + +#ifdef IMAGE_BL2 +#define PLAT_ARM_MMAP_ENTRIES U(5) +#else +#define PLAT_ARM_MMAP_ENTRIES U(6) +#endif +#define MAX_XLAT_TABLES U(6) + +#define V2M_FLASH0_BASE UL(0x08000000) +#define V2M_FLASH0_SIZE UL(0x04000000) +#define V2M_FLASH_BLOCK_SIZE UL(0x00040000) /* 256 KB */ +#define PLAT_ARM_FLASH_IMAGE_BASE V2M_FLASH0_BASE +#define PLAT_ARM_FLASH_IMAGE_MAX_SIZE (V2M_FLASH0_SIZE - V2M_FLASH_BLOCK_SIZE) + +/* RD1AE-specific memory mappings */ +#define RD1AE_EXTERNAL_FLASH MAP_REGION_FLAT(V2M_FLASH0_BASE, \ + V2M_FLASH0_SIZE, \ + MT_DEVICE | MT_RO | \ + MT_SECURE) + +#define RD1AE_MAP_NS_DRAM1 MAP_REGION_FLAT(ARM_DRAM1_BASE, \ + ARM_DRAM1_SIZE, \ + MT_MEMORY | MT_RW | \ + MT_NS) + +#define RD1AE_DEVICE_BASE (0x20000000) +#define RD1AE_DEVICE_SIZE (0x20000000) +#define RD1AE_MAP_DEVICE MAP_REGION_FLAT(RD1AE_DEVICE_BASE, \ + RD1AE_DEVICE_SIZE, \ + MT_DEVICE | MT_RW | \ + MT_SECURE) + +/******************************************************************************* + * Memprotect definitions + ******************************************************************************/ +/* PSCI memory protect definitions: + * This variable is stored in a non-secure flash because some ARM reference + * platforms do not have secure NVRAM. Real systems that provided MEM_PROTECT + * support must use a secure NVRAM to store the PSCI MEM_PROTECT definitions. + */ +#define PLAT_ARM_MEM_PROT_ADDR (V2M_FLASH0_BASE + \ + V2M_FLASH0_SIZE - \ + V2M_FLASH_BLOCK_SIZE) + +#endif /* PLATFORM_DEF_H */ diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/include/rd1ae_helpers.S b/plat/arm/board/automotive_rd/platform/rd1ae/include/rd1ae_helpers.S new file mode 100644 index 000000000..32260efc7 --- /dev/null +++ b/plat/arm/board/automotive_rd/platform/rd1ae/include/rd1ae_helpers.S @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include + + .globl plat_arm_calc_core_pos + + /* --------------------------------------------------------------------- + * unsigned int plat_arm_calc_core_pos(u_register_t mpidr) + * + * Function to calculate the core position on rd1ae. + * + * (ClusterId * PLAT_MAX_CPUS_PER_CLUSTER * PLAT_MAX_PE_PER_CPU) + + * (CPUId * PLAT_MAX_PE_PER_CPU) + + * ThreadId + * + * which can be simplified as: + * + * ((ClusterId * PLAT_MAX_CPUS_PER_CLUSTER + CPUId) * PLAT_MAX_PE_PER_CPU) + * + ThreadId + * --------------------------------------------------------------------- + */ +func plat_arm_calc_core_pos + mov x4, x0 + + /* Extract individual affinity fields from MPIDR */ + ubfx x0, x4, #MPIDR_AFF0_SHIFT, #MPIDR_AFFINITY_BITS + ubfx x1, x4, #MPIDR_AFF1_SHIFT, #MPIDR_AFFINITY_BITS + ubfx x2, x4, #MPIDR_AFF2_SHIFT, #MPIDR_AFFINITY_BITS + ubfx x3, x4, #MPIDR_AFF3_SHIFT, #MPIDR_AFFINITY_BITS + + /* Compute linear position */ + mov x4, #PLAT_ARM_CLUSTER_COUNT + madd x2, x3, x4, x2 + mov x4, #PLAT_MAX_CPUS_PER_CLUSTER + madd x1, x2, x4, x1 + mov x4, #PLAT_MAX_PE_PER_CPU + madd x0, x1, x4, x0 + ret +endfunc plat_arm_calc_core_pos diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk b/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk new file mode 100644 index 000000000..d51622abc --- /dev/null +++ b/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk @@ -0,0 +1,50 @@ +# Copyright (c) 2024, Arm Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +# RD1AE (Kronos) platform. +$(info Platform ${PLAT} is (kronos) specific.) + +RD1AE_BASE = plat/arm/board/automotive_rd/platform/rd1ae + +PLAT_INCLUDES += -I${RD1AE_BASE}/include/ + +override ARM_PLAT_MT := 1 +override ARM_RECOM_STATE_ID_ENC := 1 +override CSS_LOAD_SCP_IMAGES := 0 +override CTX_INCLUDE_AARCH32_REGS := 0 +override ENABLE_SVE_FOR_NS := 1 +override ENABLE_SVE_FOR_SWD := 1 +override NEED_BL1 := 0 +override NEED_BL2U := 0 +override NEED_BL31 := 0 +override PSCI_EXTENDED_STATE_ID := 1 + +ARM_ARCH_MAJOR := 9 +ARM_ARCH_MINOR := 2 +CSS_USE_SCMI_SDS_DRIVER := 1 +ENABLE_FEAT_AMU := 1 +ENABLE_FEAT_ECV := 1 +ENABLE_FEAT_FGT := 1 +ENABLE_FEAT_MTE2 := 1 +ENABLE_MPAM_FOR_LOWER_ELS := 1 +HW_ASSISTED_COHERENCY := 1 +RESET_TO_BL2 := 1 +SVE_VECTOR_LEN := 128 +USE_COHERENT_MEM := 0 + +RD1AE_CPU_SOURCES := lib/cpus/aarch64/neoverse_v3.S + +PLAT_BL_COMMON_SOURCES += ${RD1AE_BASE}/rd1ae_plat.c \ + ${RD1AE_BASE}/include/rd1ae_helpers.S + +BL2_SOURCES += ${RD1AE_CPU_SOURCES} \ + ${RD1AE_BASE}/rd1ae_err.c \ + lib/utils/mem_region.c \ + plat/arm/common/arm_nor_psci_mem_protect.c \ + drivers/arm/sbsa/sbsa.c + +include plat/arm/common/arm_common.mk +include plat/arm/css/common/css_common.mk +include plat/arm/board/common/board_common.mk diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_err.c b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_err.c new file mode 100644 index 000000000..625447331 --- /dev/null +++ b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_err.c @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include + +/* + * rd1ae error handler + */ +void __dead2 plat_arm_error_handler(int err) +{ + console_flush(); + + sbsa_wdog_refresh(SBSA_SECURE_WDOG_BASE); + + while (1) { + wfi(); + } +} diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_plat.c b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_plat.c new file mode 100644 index 000000000..52d9c1f94 --- /dev/null +++ b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_plat.c @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include +#include +#include + +const mmap_region_t plat_arm_mmap[] = { + ARM_MAP_SHARED_RAM, + RD1AE_MAP_DEVICE, + RD1AE_EXTERNAL_FLASH, +#if IMAGE_BL2 + RD1AE_MAP_NS_DRAM1, +#endif + {0} +}; + +void plat_arm_secure_wdt_start(void) +{ + sbsa_wdog_start(SBSA_SECURE_WDOG_BASE, SBSA_SECURE_WDOG_TIMEOUT); +} + +void plat_arm_secure_wdt_stop(void) +{ + sbsa_wdog_stop(SBSA_SECURE_WDOG_BASE); +} + +/* + * For rd1ae we should not do anything in these interface functions. + * They are used to override the weak functions in cci drivers + */ +void plat_arm_interconnect_init(void) +{ +} + +void plat_arm_interconnect_enter_coherency(void) +{ +} + +void plat_arm_interconnect_exit_coherency(void) +{ +} + +/* + * TZC programming is currently not done. + */ +void plat_arm_security_setup(void) +{ +} From bb7c7e713074e6254955e9e64386493a7ad810f1 Mon Sep 17 00:00:00 2001 From: Divin Raj Date: Thu, 4 Apr 2024 14:00:36 +0100 Subject: [PATCH 4/7] feat(rd1ae): add device tree files This commit Add FW_CONFIG and HW_CONFIG device trees Signed-off-by: Divin Raj Change-Id: Ia6cbf06def8ec9b74ef9040bab801278a3117899 --- fdts/rd1ae.dts | 416 ++++++++++++++++++ .../platform/rd1ae/fdts/rd1ae_fw_config.dts | 21 + .../platform/rd1ae/include/platform_def.h | 3 + .../automotive_rd/platform/rd1ae/platform.mk | 13 + 4 files changed, 453 insertions(+) create mode 100644 fdts/rd1ae.dts create mode 100644 plat/arm/board/automotive_rd/platform/rd1ae/fdts/rd1ae_fw_config.dts diff --git a/fdts/rd1ae.dts b/fdts/rd1ae.dts new file mode 100644 index 000000000..3060b5a72 --- /dev/null +++ b/fdts/rd1ae.dts @@ -0,0 +1,416 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/dts-v1/; + +#include + +/ { + model = "RD-1 AE"; + compatible = "arm,rd1ae", "arm,neoverse"; + interrupt-parent = <&gic>; + #address-cells = <2>; + #size-cells = <2>; + + chosen { + stdout-path = &soc_serial0; + }; + + cpus { + #address-cells = <2>; + #size-cells = <0>; + + cpu0: cpu@0 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0x0>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu1: cpu@10000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0x10000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu2: cpu@20000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0x20000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu3: cpu@30000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0x30000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu4: cpu@40000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0x40000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu5: cpu@50000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0x50000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu6: cpu@60000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0x60000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu7: cpu@70000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0x70000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu8: cpu@80000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0x80000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu9: cpu@90000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0x90000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu10: cpu@a0000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0xa0000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu11: cpu@b0000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0xb0000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu12: cpu@c0000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0xc0000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu13: cpu@d0000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0xd0000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu14: cpu@e0000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0xe0000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + cpu15: cpu@f0000 { + device_type = "cpu"; + compatible = "arm,neoverse-v3"; + reg = <0x0 0xf0000>; + enable-method = "psci"; + i-cache-size = <0x10000>; + i-cache-line-size = <0x40>; + i-cache-sets = <0x100>; + d-cache-size = <0x10000>; + d-cache-line-size = <0x40>; + d-cache-sets = <0x100>; + }; + }; + + memory@80000000 { + device_type = "memory"; + /* + * 0x7fc0 0000 - 0x7fff ffff : BL32 + * 0x7fbf 0000 - 0x7fbf ffff : FFA_SHARED_MM_BUF + */ + reg = <0x00000000 0x80000000 0 0x7fbf0000>, + <0x00000080 0x80000000 0 0x80000000>; + }; + + timer { + compatible = "arm,armv8-timer"; + interrupts = , + , + , + ; + }; + + soc_clk24mhz: clk24mhz { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <24000000>; + clock-output-names = "refclk24mhz"; + }; + + soc_refclk1mhz: refclk1mhz { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <1000000>; + clock-output-names = "refclk1mhz"; + }; + + soc { + compatible = "simple-bus"; + #address-cells = <2>; + #size-cells = <2>; + ranges; + + gic: interrupt-controller@30000000 { + compatible = "arm,gic-v3"; + reg = <0x0 0x30000000 0 0x10000>, // GICD + <0x0 0x301c0000 0 0x8000000>; // GICR + #interrupt-cells = <3>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + interrupt-controller; + interrupts = ; + + its1: msi-controller@30040000 { + compatible = "arm,gic-v3-its"; + reg = <0x0 0x30040000 0x0 0x40000>; + msi-controller; + #msi-cells = <1>; + }; + its2: msi-controller@30080000 { + compatible = "arm,gic-v3-its"; + reg = <0x0 0x30080000 0x0 0x40000>; + msi-controller; + #msi-cells = <1>; + }; + its3: msi-controller@300c0000 { + compatible = "arm,gic-v3-its"; + reg = <0x0 0x300c0000 0x0 0x40000>; + msi-controller; + #msi-cells = <1>; + }; + its4: msi-controller@30100000 { + compatible = "arm,gic-v3-its"; + reg = <0x0 0x30100000 0x0 0x40000>; + msi-controller; + #msi-cells = <1>; + }; + its5: msi-controller@30140000 { + compatible = "arm,gic-v3-its"; + reg = <0x0 0x30140000 0x0 0x40000>; + msi-controller; + #msi-cells = <1>; + }; + its6: msi-controller@30180000 { + compatible = "arm,gic-v3-its"; + reg = <0x0 0x30180000 0x0 0x40000>; + msi-controller; + #msi-cells = <1>; + }; + }; + + soc_serial0: serial@2a400000 { + compatible = "arm,pl011", "arm,primecell"; + reg = <0x0 0x2a400000 0x0 0x10000>; + interrupts = ; + clocks = <&soc_clk24mhz>, <&soc_clk24mhz>; + clock-names = "uartclk", "apb_pclk"; + }; + + watchdog@2a440000 { + compatible = "arm,sbsa-gwdt"; + reg = <0x0 0x2a440000 0 0x1000>, + <0x0 0x2a450000 0 0x1000>; + interrupts = ; + }; + + rtc@c170000 { + compatible = "arm,pl031", "arm,primecell"; + reg = <0x0 0x0c170000 0x0 0x10000>; + interrupts = ; + clocks = <&soc_clk24mhz>; + clock-names = "apb_pclk"; + }; + + virtio-net@c150000 { + compatible = "virtio,mmio"; + reg = <0x0 0xc150000 0x0 0x200>; + interrupts = ; + }; + + virtio-block@c130000 { + compatible = "virtio,mmio"; + reg = <0x0 0xc130000 0x0 0x200>; + interrupts = ; + }; + + virtio-rng@c140000 { + compatible = "virtio,mmio"; + reg = <0x0 0xc140000 0x0 0x200>; + interrupts = ; + }; + + pci@4000000000 { + #address-cells = <0x03>; + #size-cells = <0x02>; + compatible = "pci-host-ecam-generic"; + device_type = "pci"; + bus-range = <0x00 0x11>; + reg = <0x40 0x00 0x00 0x04000000>; + ranges = <0x43000000 0x40 0x40000000 0x40 0x40000000 0x10 0x00000000 + 0x02000000 0x00 0x60000000 0x00 0x60000000 0x00 0x08000000 + 0x01000000 0x00 0x00 0x00 0x77800000 0x00 0x800000>; + msi-map = <0x00 &its1 0x40000 0x10000>; + iommu-map = <0x00 &smmu 0x40000 0x10000>; + dma-coherent; + }; + + smmu: iommu@280000000 { + compatible = "arm,smmu-v3"; + reg = <0x2 0x80000000 0x0 0x100000>; + dma-coherent; + #iommu-cells = <1>; + interrupts = <1 210 1>, + <1 211 1>, + <1 212 1>, + <1 213 1>; + interrupt-names = "eventq", "priq", "cmdq-sync", "gerror"; + msi-parent = <&its1 0x10000>; + }; + + sysreg: sysreg@c010000 { + compatible = "arm,vexpress-sysreg"; + reg = <0x0 0xc010000 0x0 0x1000>; + gpio-controller; + #gpio-cells = <2>; + }; + + fixed_3v3: v2m-3v3@c011000 { + compatible = "regulator-fixed"; + reg = <0x0 0xc011000 0x0 0x1000>; + regulator-name = "3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; + }; + + mmci@c050000 { + compatible = "arm,pl180", "arm,primecell"; + reg = <0x0 0xc050000 0x0 0x1000>; + interrupts = <0 0x8B 0x4>, + <0 0x8C 0x4>; + cd-gpios = <&sysreg 0 0>; + wp-gpios = <&sysreg 1 0>; + bus-width = <8>; + max-frequency = <12000000>; + vmmc-supply = <&fixed_3v3>; + clocks = <&soc_clk24mhz>, <&soc_clk24mhz>; + clock-names = "mclk", "apb_pclk"; + }; + + }; + + psci { + compatible = "arm,psci-1.0", "arm,psci-0.2", "arm,psci"; + method = "smc"; + cpu_suspend = <0xc4000001>; + cpu_off = <0x84000002>; + cpu_on = <0x84000003>; + }; + +}; diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/fdts/rd1ae_fw_config.dts b/plat/arm/board/automotive_rd/platform/rd1ae/fdts/rd1ae_fw_config.dts new file mode 100644 index 000000000..53cd3b0fa --- /dev/null +++ b/plat/arm/board/automotive_rd/platform/rd1ae/fdts/rd1ae_fw_config.dts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include + +/dts-v1/; + +/ { + dtb-registry { + compatible = "fconf,dyn_cfg-dtb_registry"; + + hw-config { + load-address = <0x0 0x83000000>; + max-size = <0x8000>; + id = ; + }; + }; +}; diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h b/plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h index 3bb719a12..ca529575b 100644 --- a/plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h +++ b/plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h @@ -105,6 +105,9 @@ #define PLAT_ARM_FLASH_IMAGE_BASE V2M_FLASH0_BASE #define PLAT_ARM_FLASH_IMAGE_MAX_SIZE (V2M_FLASH0_SIZE - V2M_FLASH_BLOCK_SIZE) +#define PLAT_FW_CONFIG_MAX_SIZE (ARM_FW_CONFIG_LIMIT - ARM_FW_CONFIG_BASE) +#define PLAT_FW_CONFIG_BASE ARM_FW_CONFIG_BASE + /* RD1AE-specific memory mappings */ #define RD1AE_EXTERNAL_FLASH MAP_REGION_FLAT(V2M_FLASH0_BASE, \ V2M_FLASH0_SIZE, \ diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk b/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk index d51622abc..db5f4e913 100644 --- a/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk +++ b/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk @@ -10,6 +10,7 @@ RD1AE_BASE = plat/arm/board/automotive_rd/platform/rd1ae PLAT_INCLUDES += -I${RD1AE_BASE}/include/ +override ARM_FW_CONFIG_LOAD_ENABLE := 1 override ARM_PLAT_MT := 1 override ARM_RECOM_STATE_ID_ENC := 1 override CSS_LOAD_SCP_IMAGES := 0 @@ -45,6 +46,18 @@ BL2_SOURCES += ${RD1AE_CPU_SOURCES} \ plat/arm/common/arm_nor_psci_mem_protect.c \ drivers/arm/sbsa/sbsa.c +# Add the FDT_SOURCES and options for Dynamic Config +FDT_SOURCES += ${RD1AE_BASE}/fdts/${PLAT}_fw_config.dts \ + fdts/${PLAT}.dts + +FW_CONFIG := ${BUILD_PLAT}/fdts/${PLAT}_fw_config.dtb +HW_CONFIG := ${BUILD_PLAT}/fdts/${PLAT}.dtb + +# Add the FW_CONFIG to FIP and specify the same to certtool +$(eval $(call TOOL_ADD_PAYLOAD,${FW_CONFIG},--fw-config,${FW_CONFIG})) +# Add the HW_CONFIG to FIP and specify the same to certtool +$(eval $(call TOOL_ADD_PAYLOAD,${HW_CONFIG},--hw-config,${HW_CONFIG})) + include plat/arm/common/arm_common.mk include plat/arm/css/common/css_common.mk include plat/arm/board/common/board_common.mk From daf934ca918057b13fecfe949315e097ca358329 Mon Sep 17 00:00:00 2001 From: Peter Hoyes Date: Mon, 20 Feb 2023 12:08:43 +0000 Subject: [PATCH 5/7] feat(rd1ae): introduce BL31 for RD-1 AE platform This commit introduces BL31 to the RD-1 AE platform. The RD-1 AE platform incorporates an SCP for CPU power control. Additinaly introducing the memory descriptor provides BL image information that gets used by BL2 to load the images Signed-off-by: Peter Hoyes Signed-off-by: Divin Raj Change-Id: I035cbfd09f254aa47483ad35676f1cb3ffb661bd --- .../automotive_rd/platform/rd1ae/platform.mk | 18 ++++- .../rd1ae/rd1ae_bl2_mem_params_desc.c | 67 ++++++++++++++++++ .../platform/rd1ae/rd1ae_bl31_setup.c | 28 ++++++++ .../platform/rd1ae/rd1ae_topology.c | 70 +++++++++++++++++++ plat/arm/common/arm_common.mk | 2 +- 5 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_bl2_mem_params_desc.c create mode 100644 plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_bl31_setup.c create mode 100644 plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_topology.c diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk b/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk index db5f4e913..7b7c97e2a 100644 --- a/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk +++ b/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk @@ -19,7 +19,6 @@ override ENABLE_SVE_FOR_NS := 1 override ENABLE_SVE_FOR_SWD := 1 override NEED_BL1 := 0 override NEED_BL2U := 0 -override NEED_BL31 := 0 override PSCI_EXTENDED_STATE_ID := 1 ARM_ARCH_MAJOR := 9 @@ -30,22 +29,39 @@ ENABLE_FEAT_ECV := 1 ENABLE_FEAT_FGT := 1 ENABLE_FEAT_MTE2 := 1 ENABLE_MPAM_FOR_LOWER_ELS := 1 +GIC_ENABLE_V4_EXTN := 1 +GICV3_SUPPORT_GIC600 := 1 HW_ASSISTED_COHERENCY := 1 +PLAT_MHU_VERSION := 1 RESET_TO_BL2 := 1 SVE_VECTOR_LEN := 128 USE_COHERENT_MEM := 0 RD1AE_CPU_SOURCES := lib/cpus/aarch64/neoverse_v3.S +include drivers/arm/gic/v3/gicv3.mk +RD1AE_GIC_SOURCES := ${GICV3_SOURCES} \ + plat/common/plat_gicv3.c \ + plat/arm/common/arm_gicv3.c + PLAT_BL_COMMON_SOURCES += ${RD1AE_BASE}/rd1ae_plat.c \ ${RD1AE_BASE}/include/rd1ae_helpers.S BL2_SOURCES += ${RD1AE_CPU_SOURCES} \ ${RD1AE_BASE}/rd1ae_err.c \ + ${RD1AE_BASE}/rd1ae_bl2_mem_params_desc.c \ lib/utils/mem_region.c \ plat/arm/common/arm_nor_psci_mem_protect.c \ drivers/arm/sbsa/sbsa.c +BL31_SOURCES += ${RD1AE_CPU_SOURCES} \ + ${RD1AE_GIC_SOURCES} \ + ${RD1AE_BASE}/rd1ae_bl31_setup.c \ + ${RD1AE_BASE}/rd1ae_topology.c \ + drivers/cfi/v2m/v2m_flash.c \ + lib/utils/mem_region.c \ + plat/arm/common/arm_nor_psci_mem_protect.c + # Add the FDT_SOURCES and options for Dynamic Config FDT_SOURCES += ${RD1AE_BASE}/fdts/${PLAT}_fw_config.dts \ fdts/${PLAT}.dts diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_bl2_mem_params_desc.c b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_bl2_mem_params_desc.c new file mode 100644 index 000000000..30cc90f09 --- /dev/null +++ b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_bl2_mem_params_desc.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include + +/******************************************************************************* + * Following descriptor provides BL image/ep information that gets used + * by BL2 to load the images and also subset of this information is + * passed to next BL image. The image loading sequence is managed by + * populating the images in required loading order. The image execution + * sequence is managed by populating the `next_handoff_image_id` with + * the next executable image id. + ******************************************************************************/ +static bl_mem_params_node_t bl2_mem_params_descs[] = { + /* Fill BL31 related information */ + { + .image_id = BL31_IMAGE_ID, + + SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, + VERSION_2, entry_point_info_t, + SECURE | EXECUTABLE | EP_FIRST_EXE), + .ep_info.pc = BL31_BASE, + .ep_info.spsr = SPSR_64(MODE_EL3, MODE_SP_ELX, + DISABLE_ALL_EXCEPTIONS), +#if DEBUG + .ep_info.args.arg3 = ARM_BL31_PLAT_PARAM_VAL, +#endif + + SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, + VERSION_2, image_info_t, IMAGE_ATTRIB_PLAT_SETUP), + .image_info.image_base = BL31_BASE, + .image_info.image_max_size = BL31_LIMIT - BL31_BASE, + + .next_handoff_image_id = BL33_IMAGE_ID, + }, + /* Fill HW_CONFIG related information */ + { + .image_id = HW_CONFIG_ID, + SET_STATIC_PARAM_HEAD(ep_info, PARAM_IMAGE_BINARY, + VERSION_2, entry_point_info_t, + NON_SECURE | NON_EXECUTABLE), + SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY, + VERSION_2, image_info_t, IMAGE_ATTRIB_SKIP_LOADING), + .next_handoff_image_id = INVALID_IMAGE_ID, + }, + /* Fill BL33 related information */ + { + .image_id = BL33_IMAGE_ID, + SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, + VERSION_2, entry_point_info_t, NON_SECURE | EXECUTABLE), + .ep_info.pc = PLAT_ARM_NS_IMAGE_BASE, + + SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, + VERSION_2, image_info_t, 0), + .image_info.image_base = PLAT_ARM_NS_IMAGE_BASE, + .image_info.image_max_size = ARM_DRAM1_BASE + ARM_DRAM1_SIZE + - PLAT_ARM_NS_IMAGE_BASE, + .next_handoff_image_id = INVALID_IMAGE_ID, + }, +}; + +REGISTER_BL_IMAGE_DESCS(bl2_mem_params_descs) diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_bl31_setup.c b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_bl31_setup.c new file mode 100644 index 000000000..ce7bad75a --- /dev/null +++ b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_bl31_setup.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include + +static scmi_channel_plat_info_t plat_rd_scmi_info[] = { + { + .scmi_mbx_mem = CSS_SCMI_PAYLOAD_BASE, + .db_reg_addr = PLAT_CSS_MHU_BASE + MHU_V3_SENDER_REG_SET(0), + .db_preserve_mask = 0xfffffffe, + .db_modify_mask = 0x1, + .ring_doorbell = &mhu_ring_doorbell, + }, +}; + +scmi_channel_plat_info_t *plat_css_get_scmi_info(unsigned int channel_id) +{ + return &plat_rd_scmi_info[channel_id]; +} + +const plat_psci_ops_t *plat_arm_psci_override_pm_ops(plat_psci_ops_t *ops) +{ + return css_scmi_override_pm_ops(ops); +} diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_topology.c b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_topology.c new file mode 100644 index 000000000..25331840d --- /dev/null +++ b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_topology.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2024, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include + +/****************************************************************************** + * The power domain tree descriptor. + * + * This descriptor defines the layout of the power domain tree for the RD1AE + * platform, which consists of 16 clusters. + ******************************************************************************/ +const unsigned char rd1_ae_pd_tree_desc[] = { + (PLAT_ARM_CLUSTER_COUNT), + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, + PLAT_MAX_CPUS_PER_CLUSTER, +}; + +/******************************************************************************* + * This function returns the topology tree information. + ******************************************************************************/ +const unsigned char *plat_get_power_domain_tree_desc(void) +{ + return rd1_ae_pd_tree_desc; +} + +/******************************************************************************* + * The array mapping platform core position (implemented by plat_my_core_pos()) + * to the SCMI power domain ID implemented by SCP. + ******************************************************************************/ +const uint32_t plat_css_core_pos_to_scmi_dmn_id_map[] = { + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0x0)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0x1)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0x2)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0x3)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0x4)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0x5)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0x6)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0x7)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0x8)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0x9)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0xA)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0xB)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0xC)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0xD)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0xE)), + (SET_SCMI_CHANNEL_ID(0x0) | SET_SCMI_DOMAIN_ID(0xF)), +}; + +unsigned int plat_arm_get_cluster_core_count(u_register_t mpidr) +{ + return PLAT_MAX_CPUS_PER_CLUSTER; +} diff --git a/plat/arm/common/arm_common.mk b/plat/arm/common/arm_common.mk index 13694b83e..96d6beaf6 100644 --- a/plat/arm/common/arm_common.mk +++ b/plat/arm/common/arm_common.mk @@ -294,7 +294,7 @@ endif ifeq (${JUNO_AARCH32_EL3_RUNTIME},1) BL2_SOURCES += plat/arm/common/aarch32/arm_bl2_mem_params_desc.c else -ifneq (${PLAT}, corstone1000) +ifeq ($(filter $(PLAT), corstone1000 rd1ae),) BL2_SOURCES += plat/arm/common/${ARCH}/arm_bl2_mem_params_desc.c endif endif From 2638496965edd80e43af71a5952e7005d1fd3e8c Mon Sep 17 00:00:00 2001 From: Divin Raj Date: Mon, 29 Jul 2024 18:54:52 +0100 Subject: [PATCH 6/7] feat(rd1ae): enabling Trusted Board Boot(TBB) for RD-1 AE In this commit, Trusted Board Boot has been enabled for the RD-1 AE platform, and the non-volatile counter remains at the default values since the non-volatile counter is read-only for Arm development platforms. Signed-off-by: Divin Raj Change-Id: I2e1072101e56da0e474d2a3e9802e5d65a77fd55 --- .../platform/rd1ae/include/platform_def.h | 16 +++++++++ .../automotive_rd/platform/rd1ae/platform.mk | 9 +++++ .../automotive_rd/platform/rd1ae/rd1ae_plat.c | 1 + .../automotive_rd/platform/rd1ae/rd1ae_tbb.c | 34 +++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_tbb.c diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h b/plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h index ca529575b..44c8ee3c9 100644 --- a/plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h +++ b/plat/arm/board/automotive_rd/platform/rd1ae/include/platform_def.h @@ -126,6 +126,22 @@ MT_DEVICE | MT_RW | \ MT_SECURE) +#define SOC_PLATFORM_PERIPH_BASE UL(0x0E000000) +#define SOC_PLATFORM_PERIPH_SIZE UL(0x02000000) +#define SOC_PLATFORM_PERIPH_MAP_DEVICE MAP_REGION_FLAT(SOC_PLATFORM_PERIPH_BASE, \ + SOC_PLATFORM_PERIPH_SIZE, \ + MT_DEVICE | MT_RW | MT_SECURE) + +/* Non-volatile counters */ +#define TRUSTED_NVCTR_BASE_OFFSET UL(0x00E70000) +#define TFW_NVCTR_BASE_OFFSET 0x0000 +#define NTFW_CTR_BASE_OFFSET 0x0004 +#define SOC_TRUSTED_NVCTR_BASE (SOC_PLATFORM_PERIPH_BASE + TRUSTED_NVCTR_BASE_OFFSET) +#define TFW_NVCTR_BASE (SOC_TRUSTED_NVCTR_BASE + TFW_NVCTR_BASE_OFFSET) +#define TFW_NVCTR_SIZE U(4) +#define NTFW_CTR_BASE (SOC_TRUSTED_NVCTR_BASE + NTFW_CTR_BASE_OFFSET) +#define NTFW_CTR_SIZE U(4) + /******************************************************************************* * Memprotect definitions ******************************************************************************/ diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk b/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk index 7b7c97e2a..35cd8a19d 100644 --- a/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk +++ b/plat/arm/board/automotive_rd/platform/rd1ae/platform.mk @@ -62,6 +62,10 @@ BL31_SOURCES += ${RD1AE_CPU_SOURCES} \ lib/utils/mem_region.c \ plat/arm/common/arm_nor_psci_mem_protect.c +ifeq (${TRUSTED_BOARD_BOOT},1) +BL2_SOURCES += ${RD1AE_BASE}/rd1ae_tbb.c +endif + # Add the FDT_SOURCES and options for Dynamic Config FDT_SOURCES += ${RD1AE_BASE}/fdts/${PLAT}_fw_config.dts \ fdts/${PLAT}.dts @@ -74,6 +78,11 @@ $(eval $(call TOOL_ADD_PAYLOAD,${FW_CONFIG},--fw-config,${FW_CONFIG})) # Add the HW_CONFIG to FIP and specify the same to certtool $(eval $(call TOOL_ADD_PAYLOAD,${HW_CONFIG},--hw-config,${HW_CONFIG})) +ifeq (${TRUSTED_BOARD_BOOT},1) +FIP_BL2_ARGS := tb-fw +$(eval $(call TOOL_ADD_PAYLOAD,${BUILD_PLAT}/tb_fw.crt,--tb-fw-cert)) +endif + include plat/arm/common/arm_common.mk include plat/arm/css/common/css_common.mk include plat/arm/board/common/board_common.mk diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_plat.c b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_plat.c index 52d9c1f94..e917330b0 100644 --- a/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_plat.c +++ b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_plat.c @@ -15,6 +15,7 @@ const mmap_region_t plat_arm_mmap[] = { ARM_MAP_SHARED_RAM, RD1AE_MAP_DEVICE, RD1AE_EXTERNAL_FLASH, + SOC_PLATFORM_PERIPH_MAP_DEVICE, #if IMAGE_BL2 RD1AE_MAP_NS_DRAM1, #endif diff --git a/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_tbb.c b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_tbb.c new file mode 100644 index 000000000..01fbcce86 --- /dev/null +++ b/plat/arm/board/automotive_rd/platform/rd1ae/rd1ae_tbb.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024, ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include + +int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) +{ + assert(heap_addr != NULL); + assert(heap_size != NULL); + + return arm_get_mbedtls_heap(heap_addr, heap_size); +} + +/* + * Return the ROTPK hash in the following ASN.1 structure in DER format: + * + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, + * parameters ANY DEFINED BY algorithm OPTIONAL + * } + * + * DigestInfo ::= SEQUENCE { + * digestAlgorithm AlgorithmIdentifier, + * digest OCTET STRING + * } + */ +int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len, + unsigned int *flags) +{ + return arm_get_rotpk_info(cookie, key_ptr, key_len, flags); +} From 53e75cfa3e55b07e540dd1b6be275bb48a919ec3 Mon Sep 17 00:00:00 2001 From: Divin Raj Date: Wed, 17 Apr 2024 00:35:17 +0100 Subject: [PATCH 7/7] docs(rd1ae): add RD-1 AE documentation Documenting RD-1 AE features, boot sequence, and build procedure. Signed-off-by: Divin Raj Change-Id: Ie93438931e9ead42a2a6dd2d752d37bc06fa2e32 --- docs/plat/arm/automotive_rd/index.rst | 50 +++++++++++++++++++++++++++ docs/plat/arm/index.rst | 3 +- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 docs/plat/arm/automotive_rd/index.rst diff --git a/docs/plat/arm/automotive_rd/index.rst b/docs/plat/arm/automotive_rd/index.rst new file mode 100644 index 000000000..d0db6ac56 --- /dev/null +++ b/docs/plat/arm/automotive_rd/index.rst @@ -0,0 +1,50 @@ +RD-1 AE (Kronos) Platform +========================= + +Some of the features of the RD-1 AE platform referenced in TF-A include: + +- Neoverse-V3AE, Arm9.2-A application processor (64-bit mode) +- A GICv4-compatible GIC-720AE + +Further information on RD1-AE is available at `rd1ae`_ + +Boot Sequence +------------- + +BL2 –> BL31 –> BL33 + +The boot process starts from RSE (Runtime Security Engine) that loads the BL2 image +and signals the System Control Processor (SCP) to power up the Application Processor (AP). +The AP then runs BL2, which loads the rest of the images, including the runtime firmware +BL31, and proceeds to execute it. Finally, it passes control to the non-secure world +BL33 (u-boot). + +BL2 performs the actions described in the `Trusted Board Boot (TBB)`_ document. + +Build Procedure (TF-A only) +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Obtain `Arm toolchain`_ and set the CROSS_COMPILE environment variable to + point to the toolchain folder. + +- Build TF-A: + + .. code:: shell + + make \ + PLAT=rd1ae \ + MBEDTLS_DIR= \ + ARCH=aarch64 \ + CREATE_KEYS=1 \ + GENERATE_COT=1 \ + TRUSTED_BOARD_BOOT=1 \ + COT=tbbr \ + ARM_ROTPK_LOCATION=devel_rsa \ + ROT_KEY=plat/arm/board/common/rotpk/arm_rotprivk_rsa.pem \ + BL33= \ + +*Copyright (c) 2024, Arm Limited. All rights reserved.* + +.. _Arm Toolchain: https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/downloads +.. _rd1ae: https://developer.arm.com/Tools%20and%20Software/Arm%20Reference%20Design-1%20AE +.. _Trusted Board Boot (TBB): https://trustedfirmware-a.readthedocs.io/en/latest/design/trusted-board-boot.html diff --git a/docs/plat/arm/index.rst b/docs/plat/arm/index.rst index 2f6852225..35c0c5986 100644 --- a/docs/plat/arm/index.rst +++ b/docs/plat/arm/index.rst @@ -14,6 +14,7 @@ Arm Development Platforms arm-build-options morello/index corstone1000/index + automotive_rd/index This chapter holds documentation related to Arm's development platforms, including both software models (FVPs) and hardware development boards @@ -21,4 +22,4 @@ such as Juno. -------------- -*Copyright (c) 2019-2021, Arm Limited. All rights reserved.* +*Copyright (c) 2019-2024, Arm Limited. All rights reserved.*