From a97bfa5ff18b2682e3b9c528cbd5fb16ceec3393 Mon Sep 17 00:00:00 2001 From: AlexeiFedorov Date: Wed, 14 Dec 2022 17:28:11 +0000 Subject: [PATCH] feat(rme): set DRAM information in Boot Manifest platform data This patch adds support for setting configuration of DRAM banks for FVP model in RMM-EL3 Boot Manifest structure. Structure 'rmm_manifest' is extended with 'plat_dram' structure which contains information about platform's DRAM layout: - number of DRAM banks; - pointer to 'dram_bank[]' array; - check sum: two's complement 64-bit value of the sum of data in 'plat_dram' and 'dram_bank[] array. Each 'dram_bank' structure holds information about DRAM bank base address and its size. This values must be aligned to 4KB page size. The patch increases Boot Manifest minor version to 2 and removes 'typedef rmm_manifest_t' as per "3.4.15.1. Avoid anonymous typedefs of structs/enums in headers" of https://trustedfirmware-a.readthedocs.io/en/latest/process/coding-style.html Signed-off-by: AlexeiFedorov Change-Id: I5176caa5780e27d1e0daeb5dea3e40cf6ad5fd12 --- include/plat/arm/common/arm_def.h | 2 ++ include/plat/common/platform.h | 5 +-- include/services/rmm_core_manifest.h | 52 +++++++++++++++++++++------- include/services/trp/platform_trp.h | 4 ++- plat/arm/board/fvp/fvp_common.c | 40 ++++++++++++++++++--- plat/arm/common/arm_bl2_setup.c | 4 --- plat/arm/common/arm_bl31_setup.c | 2 -- plat/arm/common/trp/arm_trp_setup.c | 9 +++-- services/std_svc/rmmd/rmmd_main.c | 4 +-- services/std_svc/rmmd/trp/trp_main.c | 2 +- 10 files changed, 90 insertions(+), 34 deletions(-) diff --git a/include/plat/arm/common/arm_def.h b/include/plat/arm/common/arm_def.h index 36b1bdb6d..1e22c1073 100644 --- a/include/plat/arm/common/arm_def.h +++ b/include/plat/arm/common/arm_def.h @@ -235,6 +235,8 @@ #define ARM_DRAM2_SIZE PLAT_ARM_DRAM2_SIZE #define ARM_DRAM2_END (ARM_DRAM2_BASE + \ ARM_DRAM2_SIZE - 1U) +/* Number of DRAM banks */ +#define ARM_DRAM_BANKS_NUM 2UL #define ARM_IRQ_SEC_PHY_TIMER 29 diff --git a/include/plat/common/platform.h b/include/plat/common/platform.h index 335103612..8543ac713 100644 --- a/include/plat/common/platform.h +++ b/include/plat/common/platform.h @@ -11,7 +11,7 @@ #include #if defined(SPD_spmd) - #include +#include #endif #if ENABLE_RME #include @@ -37,6 +37,7 @@ struct bl_params; struct mmap_region; struct spm_mm_boot_info; struct sp_res_desc; +struct rmm_manifest; enum fw_enc_status_t; /******************************************************************************* @@ -322,7 +323,7 @@ int plat_rmmd_get_cca_attest_token(uintptr_t buf, size_t *len, int plat_rmmd_get_cca_realm_attest_key(uintptr_t buf, size_t *len, unsigned int type); size_t plat_rmmd_get_el3_rmm_shared_mem(uintptr_t *shared); -int plat_rmmd_load_manifest(rmm_manifest_t *manifest); +int plat_rmmd_load_manifest(struct rmm_manifest *manifest); #endif /******************************************************************************* diff --git a/include/services/rmm_core_manifest.h b/include/services/rmm_core_manifest.h index 7edef469b..a59788392 100644 --- a/include/services/rmm_core_manifest.h +++ b/include/services/rmm_core_manifest.h @@ -14,7 +14,7 @@ #include #define RMMD_MANIFEST_VERSION_MAJOR U(0) -#define RMMD_MANIFEST_VERSION_MINOR U(1) +#define RMMD_MANIFEST_VERSION_MINOR U(2) /* * Manifest version encoding: @@ -35,16 +35,44 @@ #define RMMD_GET_MANIFEST_VERSION_MINOR(_version) \ (_version & 0xFFFF) -/* Boot manifest core structure as per v0.1 */ -typedef struct rmm_manifest { - uint32_t version; /* Manifest version */ - uint32_t padding; /* RES0 */ - uintptr_t plat_data; /* Manifest platform data */ -} rmm_manifest_t; - -CASSERT(offsetof(rmm_manifest_t, version) == 0, - rmm_manifest_t_version_unaligned); -CASSERT(offsetof(rmm_manifest_t, plat_data) == 8, - rmm_manifest_t_plat_data_unaligned); +/* DRAM bank structure */ +struct dram_bank { + uintptr_t base; /* Base address */ + uint64_t size; /* Size of bank */ +}; + +CASSERT(offsetof(struct dram_bank, base) == 0, + rmm_manifest_base_unaligned); +CASSERT(offsetof(struct dram_bank, size) == 8, + rmm_manifest_size_unaligned); + +/* DRAM layout info structure */ +struct dram_info { + uint64_t banks_num; /* Number of DRAM banks */ + struct dram_bank *dram_data; /* Pointer to dram_bank[] */ + uint64_t check_sum; /* Checksum of dram_info data */ +}; + +CASSERT(offsetof(struct dram_info, banks_num) == 0, + rmm_manifest_banks_num_unaligned); +CASSERT(offsetof(struct dram_info, dram_data) == 8, + rmm_manifest_dram_data_unaligned); +CASSERT(offsetof(struct dram_info, check_sum) == 16, + rmm_manifest_check_sum_unaligned); + +/* Boot manifest core structure as per v0.2 */ +struct rmm_manifest { + uint32_t version; /* Manifest version */ + uint32_t padding; /* RES0 */ + uintptr_t plat_data; /* Manifest platform data */ + struct dram_info plat_dram; /* Platform DRAM data */ +}; + +CASSERT(offsetof(struct rmm_manifest, version) == 0, + rmm_manifest_version_unaligned); +CASSERT(offsetof(struct rmm_manifest, plat_data) == 8, + rmm_manifest_plat_data_unaligned); +CASSERT(offsetof(struct rmm_manifest, plat_dram) == 16, + rmm_manifest_plat_dram_unaligned); #endif /* RMM_CORE_MANIFEST_H */ diff --git a/include/services/trp/platform_trp.h b/include/services/trp/platform_trp.h index 1c963c851..756e9db6c 100644 --- a/include/services/trp/platform_trp.h +++ b/include/services/trp/platform_trp.h @@ -9,9 +9,11 @@ #include +struct rmm_manifest; + /******************************************************************************* * Mandatory TRP functions (only if platform contains a TRP) ******************************************************************************/ -void trp_early_platform_setup(rmm_manifest_t *manifest); +void trp_early_platform_setup(struct rmm_manifest *manifest); #endif /* PLATFORM_TRP_H */ diff --git a/plat/arm/board/fvp/fvp_common.c b/plat/arm/board/fvp/fvp_common.c index f5d9940f0..e6d5b159b 100644 --- a/plat/arm/board/fvp/fvp_common.c +++ b/plat/arm/board/fvp/fvp_common.c @@ -17,14 +17,13 @@ #include #include #include -#if ENABLE_RME #include -#endif #if SPM_MM #include #endif #include +#include #include #include @@ -531,15 +530,46 @@ size_t plat_rmmd_get_el3_rmm_shared_mem(uintptr_t *shared) return (size_t)RMM_SHARED_SIZE; } -int plat_rmmd_load_manifest(rmm_manifest_t *manifest) +CASSERT(ARM_DRAM_BANKS_NUM == 2UL, ARM_DRAM_BANKS_NUM_mismatch); + +/* FVP DRAM banks */ +const struct dram_bank fvp_dram_banks[ARM_DRAM_BANKS_NUM] = { + {ARM_PAS_2_BASE, ARM_PAS_2_SIZE}, + {ARM_PAS_4_BASE, ARM_PAS_4_SIZE} +}; + +int plat_rmmd_load_manifest(struct rmm_manifest *manifest) { + uint64_t check_sum; + struct dram_bank *bank_ptr; + assert(manifest != NULL); manifest->version = RMMD_MANIFEST_VERSION; manifest->padding = 0U; /* RES0 */ manifest->plat_data = (uintptr_t)NULL; + manifest->plat_dram.banks_num = ARM_DRAM_BANKS_NUM; + + /* Array dram_banks[] follows dram_info structure */ + bank_ptr = (struct dram_bank *) + ((uintptr_t)&manifest->plat_dram.check_sum + + sizeof(manifest->plat_dram.check_sum)); + + manifest->plat_dram.dram_data = bank_ptr; + + /* Copy FVP DRAM banks data to Boot Manifest */ + (void)memcpy((void *)bank_ptr, &fvp_dram_banks, sizeof(fvp_dram_banks)); + + /* Calculate check sum of plat_dram structure */ + check_sum = ARM_DRAM_BANKS_NUM + (uint64_t)bank_ptr; + + for (unsigned long i = 0UL; i < ARM_DRAM_BANKS_NUM; i++) { + check_sum += bank_ptr[i].base + bank_ptr[i].size; + } + + /* Check sum must be 0 */ + manifest->plat_dram.check_sum = ~check_sum + 1UL; return 0; } - -#endif +#endif /* ENABLE_RME */ diff --git a/plat/arm/common/arm_bl2_setup.c b/plat/arm/common/arm_bl2_setup.c index 02e419a43..ca9842285 100644 --- a/plat/arm/common/arm_bl2_setup.c +++ b/plat/arm/common/arm_bl2_setup.c @@ -18,16 +18,12 @@ #include #include #include -#if ENABLE_RME #include -#endif /* ENABLE_RME */ #ifdef SPD_opteed #include #endif #include -#if ENABLE_RME #include -#endif /* ENABLE_RME */ #include #include diff --git a/plat/arm/common/arm_bl31_setup.c b/plat/arm/common/arm_bl31_setup.c index cf403b161..19efdd32e 100644 --- a/plat/arm/common/arm_bl31_setup.c +++ b/plat/arm/common/arm_bl31_setup.c @@ -13,9 +13,7 @@ #include #include #include -#if ENABLE_RME #include -#endif #include #include #include diff --git a/plat/arm/common/trp/arm_trp_setup.c b/plat/arm/common/trp/arm_trp_setup.c index aeacd1054..04063219b 100644 --- a/plat/arm/common/trp/arm_trp_setup.c +++ b/plat/arm/common/trp/arm_trp_setup.c @@ -26,7 +26,7 @@ extern uint32_t trp_boot_manifest_version; ******************************************************************************/ static console_t arm_trp_runtime_console; -static int arm_trp_process_manifest(rmm_manifest_t *manifest) +static int arm_trp_process_manifest(struct rmm_manifest *manifest) { /* padding field on the manifest must be RES0 */ assert(manifest->padding == 0U); @@ -38,12 +38,12 @@ static int arm_trp_process_manifest(rmm_manifest_t *manifest) } trp_boot_manifest_version = manifest->version; - flush_dcache_range((uintptr_t)manifest, sizeof(rmm_manifest_t)); + flush_dcache_range((uintptr_t)manifest, sizeof(struct rmm_manifest)); return 0; } -void arm_trp_early_platform_setup(rmm_manifest_t *manifest) +void arm_trp_early_platform_setup(struct rmm_manifest *manifest) { int rc; @@ -66,10 +66,9 @@ void arm_trp_early_platform_setup(rmm_manifest_t *manifest) console_set_scope(&arm_trp_runtime_console, CONSOLE_FLAG_BOOT | CONSOLE_FLAG_RUNTIME); - } -void trp_early_platform_setup(rmm_manifest_t *manifest) +void trp_early_platform_setup(struct rmm_manifest *manifest) { arm_trp_early_platform_setup(manifest); } diff --git a/services/std_svc/rmmd/rmmd_main.c b/services/std_svc/rmmd/rmmd_main.c index 6bd9fdf30..e12eae79f 100644 --- a/services/std_svc/rmmd/rmmd_main.c +++ b/services/std_svc/rmmd/rmmd_main.c @@ -171,7 +171,7 @@ int rmmd_setup(void) uint32_t ep_attr; unsigned int linear_id = plat_my_core_pos(); rmmd_rmm_context_t *rmm_ctx = &rmm_context[linear_id]; - rmm_manifest_t *manifest; + struct rmm_manifest *manifest; int rc; /* Make sure RME is supported. */ @@ -206,7 +206,7 @@ int rmmd_setup(void) ((void *)shared_buf_base != NULL)); /* Load the boot manifest at the beginning of the shared area */ - manifest = (rmm_manifest_t *)shared_buf_base; + manifest = (struct rmm_manifest *)shared_buf_base; rc = plat_rmmd_load_manifest(manifest); if (rc != 0) { ERROR("Error loading RMM Boot Manifest (%i)\n", rc); diff --git a/services/std_svc/rmmd/trp/trp_main.c b/services/std_svc/rmmd/trp/trp_main.c index 196bc119e..4eb3e1266 100644 --- a/services/std_svc/rmmd/trp/trp_main.c +++ b/services/std_svc/rmmd/trp/trp_main.c @@ -62,7 +62,7 @@ void trp_setup(uint64_t x0, sizeof(trp_shared_region_start)); /* Perform early platform-specific setup */ - trp_early_platform_setup((rmm_manifest_t *)trp_shared_region_start); + trp_early_platform_setup((struct rmm_manifest *)trp_shared_region_start); } int trp_validate_warmboot_args(uint64_t x0, uint64_t x1, -- 2.39.5