summaryrefslogtreecommitdiff
path: root/src/arch/arm64/bl31.c
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2019-05-28 21:01:37 -0700
committerJulius Werner <jwerner@chromium.org>2019-09-14 05:01:16 +0000
commitb3f24b4884fe9fe0589629fbe929ebddfdc683c2 (patch)
treee2db80dac53be5f6dc1277713e5d5c5eff85f0a9 /src/arch/arm64/bl31.c
parent8b93689a358b0a65a334cc3adf6141e79fab032f (diff)
downloadcoreboot-b3f24b4884fe9fe0589629fbe929ebddfdc683c2.tar.xz
arm64: Uprev Arm TF and adjust to BL31 parameter changes
This patch uprevs the Arm Trusted Firmware submodule to the new upstream master (commit 42cdeb930). Arm Trusted Firmware unified a bunch of stuff related to BL31 handoff parameters across platforms which involved changing a few names around. This patch syncs coreboot back up with that. They also made header changes that now allow us to directly include all the headers we need (in a safer and cleaner way than before), so we can get rid of some structure definitions that were duplicated. Since the version of entry point info parameters we have been using has been deprecated in Trusted Firmware, this patch switches to the new version 2 parameter format. NOTE: This may or may not stop Cavium from booting with the current pinned Trusted Firmware blob. Cavium maintainers are still evaluating whether to fix that later or drop the platform entirely. Tested on GOOGLE_KEVIN (rk3399). Change-Id: I0ed32bce5585ce191736f0ff2e5a94a9d2b2cc28 Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/34676 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Hung-Te Lin <hungte@chromium.org>
Diffstat (limited to 'src/arch/arm64/bl31.c')
-rw-r--r--src/arch/arm64/bl31.c89
1 files changed, 62 insertions, 27 deletions
diff --git a/src/arch/arm64/bl31.c b/src/arch/arm64/bl31.c
index fb24dff40e..c94b1d101e 100644
--- a/src/arch/arm64/bl31.c
+++ b/src/arch/arm64/bl31.c
@@ -18,32 +18,75 @@
#include <bl31.h>
#include <bootmem.h>
#include <cbfs.h>
+#include <cbmem.h>
#include <console/console.h>
#include <program_loading.h>
-/*
- * TODO: Many of these structures are currently unused. Better not fill them out
- * to make future changes fail fast, rather than try to come up with content
- * that might turn out to not make sense. Implement later as required.
- *
-static image_info_t bl31_image_info;
-static image_info_t bl32_image_info;
-static image_info_t bl33_image_info;
- */
-static entry_point_info_t bl32_ep_info;
-static entry_point_info_t bl33_ep_info;
-static bl31_params_t bl31_params;
+#include <arm-trusted-firmware/include/export/common/bl_common_exp.h>
+
+static entry_point_info_t bl32_ep_info = {
+ .h = {
+ .type = PARAM_EP,
+ .version = PARAM_VERSION_1,
+ .size = sizeof(bl32_ep_info),
+ .attr = EP_SECURE,
+ },
+};
+static entry_point_info_t bl33_ep_info = {
+ .h = {
+ .type = PARAM_EP,
+ .version = PARAM_VERSION_1,
+ .size = sizeof(bl33_ep_info),
+ .attr = EP_NON_SECURE,
+ },
+};
+
+static bl_params_node_t bl32_params_node = {
+ .image_id = BL32_IMAGE_ID,
+ .ep_info = &bl32_ep_info,
+};
+static bl_params_node_t bl33_params_node = {
+ .image_id = BL33_IMAGE_ID,
+ .ep_info = &bl33_ep_info,
+};
+
+static bl_params_t bl_params = {
+ .h = {
+ .type = PARAM_BL_PARAMS,
+ .version = PARAM_VERSION_2,
+ .size = sizeof(bl_params),
+ .attr = 0,
+ },
+ .head = &bl33_params_node,
+};
+
+static struct bl_aux_param_header *bl_aux_params;
-void __weak *soc_get_bl31_plat_params(bl31_params_t *params)
+/* Only works when using the default soc_get_bl31_plat_params() below. */
+void register_bl31_aux_param(struct bl_aux_param_header *param)
{
- /* Default weak implementation. */
- return NULL;
+ param->next = (uintptr_t)bl_aux_params;
+ bl_aux_params = param;
+}
+
+/* Default implementation. All newly added SoCs should use this if possible! */
+__weak void *soc_get_bl31_plat_params(void)
+{
+ static struct bl_aux_param_uint64 cbtable_param = {
+ .h = { .type = BL_AUX_PARAM_COREBOOT_TABLE, },
+ };
+ if (!cbtable_param.value) {
+ cbtable_param.value = (uint64_t)cbmem_find(CBMEM_ID_CBTABLE);
+ if (cbtable_param.value)
+ register_bl31_aux_param(&cbtable_param.h);
+ }
+ return bl_aux_params;
}
void run_bl31(u64 payload_entry, u64 payload_arg0, u64 payload_spsr)
{
struct prog bl31 = PROG_INIT(PROG_BL31, CONFIG_CBFS_PREFIX"/bl31");
- void (*bl31_entry)(bl31_params_t *params, void *plat_params) = NULL;
+ void (*bl31_entry)(bl_params_t *params, void *plat_params) = NULL;
if (prog_locate(&bl31))
die("BL31 not found");
@@ -52,8 +95,6 @@ void run_bl31(u64 payload_entry, u64 payload_arg0, u64 payload_spsr)
die("BL31 load failed");
bl31_entry = prog_entry(&bl31);
- SET_PARAM_HEAD(&bl31_params, PARAM_BL31, VERSION_1, 0);
-
if (CONFIG(ARM64_USE_SECURE_OS)) {
struct prog bl32 = PROG_INIT(PROG_BL32,
CONFIG_CBFS_PREFIX"/secure_os");
@@ -64,27 +105,21 @@ void run_bl31(u64 payload_entry, u64 payload_arg0, u64 payload_spsr)
if (cbfs_prog_stage_load(&bl32))
die("BL32 load failed");
- SET_PARAM_HEAD(&bl32_ep_info, PARAM_EP, VERSION_1,
- PARAM_EP_SECURE);
bl32_ep_info.pc = (uintptr_t)prog_entry(&bl32);
bl32_ep_info.spsr = SPSR_EXCEPTION_MASK |
get_eret_el(EL1, SPSR_USE_L);
- bl31_params.bl32_ep_info = &bl32_ep_info;
+ bl33_params_node.next_params_info = &bl32_params_node;
}
- bl31_params.bl33_ep_info = &bl33_ep_info;
-
- SET_PARAM_HEAD(&bl33_ep_info, PARAM_EP, VERSION_1, PARAM_EP_NON_SECURE);
bl33_ep_info.pc = payload_entry;
bl33_ep_info.spsr = payload_spsr;
bl33_ep_info.args.arg0 = payload_arg0;
- /* May update bl31_params if necessary. */
- void *bl31_plat_params = soc_get_bl31_plat_params(&bl31_params);
+ void *bl31_plat_params = soc_get_bl31_plat_params();
/* MMU disable will flush cache, so passed params land in memory. */
raw_write_daif(SPSR_EXCEPTION_MASK);
mmu_disable();
- bl31_entry(&bl31_params, bl31_plat_params);
+ bl31_entry(&bl_params, bl31_plat_params);
die("BL31 returned!");
}