diff --git a/docs/components/granule-protection-tables-design.rst b/docs/components/granule-protection-tables-design.rst index 07637dd58..7a4ffcf0b 100644 --- a/docs/components/granule-protection-tables-design.rst +++ b/docs/components/granule-protection-tables-design.rst @@ -80,8 +80,8 @@ structure used by the granule transition service which will be covered more below. In the reference implementation for FVP models, you can find an example of PAS -region definitions in the file ``include/plat/arm/common/arm_pas_def.h``. Table -creation API calls can be found in ``plat/arm/common/arm_bl2_setup.c`` and +region definitions in the file ``plat/arm/board/fvp/include/fvp_pas_def.h``. +Table creation API calls can be found in ``plat/arm/common/arm_bl2_setup.c`` and runtime initialization API calls can be seen in ``plat/arm/common/arm_bl31_setup.c``. diff --git a/include/plat/arm/common/plat_arm.h b/include/plat/arm/common/plat_arm.h index 0fb06a662..97f544630 100644 --- a/include/plat/arm/common/plat_arm.h +++ b/include/plat/arm/common/plat_arm.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -31,6 +32,17 @@ typedef struct arm_tzc_regions_info { unsigned int nsaid_permissions; } arm_tzc_regions_info_t; +typedef struct arm_gpt_info { + pas_region_t *pas_region_base; + unsigned int pas_region_count; + uintptr_t l0_base; + uintptr_t l1_base; + size_t l0_size; + size_t l1_size; + gpccr_pps_e pps; + gpccr_pgs_e pgs; +} arm_gpt_info_t; + /******************************************************************************* * Default mapping definition of the TrustZone Controller for ARM standard * platforms. @@ -362,6 +374,8 @@ int plat_arm_get_alt_image_source( unsigned int plat_arm_calc_core_pos(u_register_t mpidr); const mmap_region_t *plat_arm_get_mmap(void); +const arm_gpt_info_t *plat_arm_get_gpt_info(void); + /* Allow platform to override psci_pm_ops during runtime */ const plat_psci_ops_t *plat_arm_psci_override_pm_ops(plat_psci_ops_t *ops); diff --git a/plat/arm/board/fvp/fvp_bl2_setup.c b/plat/arm/board/fvp/fvp_bl2_setup.c index ebd52664b..97d000e7f 100644 --- a/plat/arm/board/fvp/fvp_bl2_setup.c +++ b/plat/arm/board/fvp/fvp_bl2_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2013-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -21,6 +22,32 @@ static struct transfer_list_header *ns_tl __unused; +#if ENABLE_RME +/* + * The GPT library might modify the gpt regions structure to optimize + * the layout, so the array cannot be constant. + */ +static pas_region_t pas_regions[] = { + ARM_PAS_KERNEL, + ARM_PAS_SECURE, + ARM_PAS_REALM, + ARM_PAS_EL3_DRAM, + ARM_PAS_GPTS, + ARM_PAS_KERNEL_1 +}; + +static const arm_gpt_info_t arm_gpt_info = { + .pas_region_base = pas_regions, + .pas_region_count = (unsigned int)ARRAY_SIZE(pas_regions), + .l0_base = (uintptr_t)ARM_L0_GPT_BASE, + .l1_base = (uintptr_t)ARM_L1_GPT_BASE, + .l0_size = (size_t)ARM_L0_GPT_SIZE, + .l1_size = (size_t)ARM_L1_GPT_SIZE, + .pps = GPCCR_PPS_64GB, + .pgs = GPCCR_PGS_4K +}; +#endif + void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) { arm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1); @@ -41,6 +68,13 @@ void bl2_platform_setup(void) fvp_timer_init(); } +#if ENABLE_RME +const arm_gpt_info_t *plat_arm_get_gpt_info(void) +{ + return &arm_gpt_info; +} +#endif /* ENABLE_RME */ + /******************************************************************************* * This function returns the list of executable images ******************************************************************************/ diff --git a/plat/arm/board/fvp/fvp_common.c b/plat/arm/board/fvp/fvp_common.c index c40a3ced3..beae242ea 100644 --- a/plat/arm/board/fvp/fvp_common.c +++ b/plat/arm/board/fvp/fvp_common.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2013-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -24,7 +24,6 @@ #endif #include -#include #include #include diff --git a/include/plat/arm/common/arm_pas_def.h b/plat/arm/board/fvp/include/fvp_pas_def.h similarity index 96% rename from include/plat/arm/common/arm_pas_def.h rename to plat/arm/board/fvp/include/fvp_pas_def.h index 797792b10..468438724 100644 --- a/include/plat/arm/common/arm_pas_def.h +++ b/plat/arm/board/fvp/include/fvp_pas_def.h @@ -1,13 +1,13 @@ /* - * Copyright (c) 2021-2022, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2021-2024, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef ARM_PAS_DEF_H -#define ARM_PAS_DEF_H +#ifndef FVP_PAS_DEF_H +#define FVP_PAS_DEF_H #include -#include +#include /***************************************************************************** * PAS regions used to initialize the Granule Protection Table (GPT) @@ -114,4 +114,4 @@ /* GPT Configuration options */ #define PLATFORM_L0GPTSZ GPCCR_L0GPTSZ_30BITS -#endif /* ARM_PAS_DEF_H */ +#endif /* FVP_PAS_DEF_H */ diff --git a/plat/arm/common/arm_bl2_setup.c b/plat/arm/common/arm_bl2_setup.c index c545f5890..3ef561a92 100644 --- a/plat/arm/common/arm_bl2_setup.c +++ b/plat/arm/common/arm_bl2_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2024, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -23,9 +23,6 @@ #include #endif #include -#if ENABLE_RME -#include -#endif #include #include @@ -135,35 +132,33 @@ void bl2_platform_setup(void) } #if ENABLE_RME -static void arm_bl2_plat_gpt_setup(void) +static void arm_bl2_gpt_setup(void) { /* - * The GPT library might modify the gpt regions structure to optimize - * the layout, so the array cannot be constant. + * It is to be noted that any Arm platform that reuses arm_bl2_gpt_setup + * must implement plat_arm_get_gpt_info within its platform code */ - pas_region_t pas_regions[] = { - ARM_PAS_KERNEL, - ARM_PAS_SECURE, - ARM_PAS_REALM, - ARM_PAS_EL3_DRAM, - ARM_PAS_GPTS, - ARM_PAS_KERNEL_1 - }; + const arm_gpt_info_t *arm_gpt_info = + plat_arm_get_gpt_info(); + + if (arm_gpt_info == NULL) { + ERROR("arm_gpt_info not initialized!!\n"); + panic(); + } /* Initialize entire protected space to GPT_GPI_ANY. */ - if (gpt_init_l0_tables(GPCCR_PPS_64GB, ARM_L0_GPT_BASE, - ARM_L0_GPT_SIZE) < 0) { + if (gpt_init_l0_tables(arm_gpt_info->pps, arm_gpt_info->l0_base, + arm_gpt_info->l0_size) < 0) { ERROR("gpt_init_l0_tables() failed!\n"); panic(); } /* Carve out defined PAS ranges. */ - if (gpt_init_pas_l1_tables(GPCCR_PGS_4K, - ARM_L1_GPT_BASE, - ARM_L1_GPT_SIZE, - pas_regions, - (unsigned int)(sizeof(pas_regions) / - sizeof(pas_region_t))) < 0) { + if (gpt_init_pas_l1_tables(arm_gpt_info->pgs, + arm_gpt_info->l1_base, + arm_gpt_info->l1_size, + arm_gpt_info->pas_region_base, + arm_gpt_info->pas_region_count) < 0) { ERROR("gpt_init_pas_l1_tables() failed!\n"); panic(); } @@ -216,7 +211,7 @@ void arm_bl2_plat_arch_setup(void) enable_mmu_el3(0); /* Initialise and enable granule protection after MMU. */ - arm_bl2_plat_gpt_setup(); + arm_bl2_gpt_setup(); #else enable_mmu_el1(0); #endif