aboutsummaryrefslogtreecommitdiff
path: root/lib/bl_aux_params
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2019-05-24 20:31:15 -0700
committerJulius Werner <jwerner@chromium.org>2019-07-18 16:42:40 -0700
commitb852d229f32aa65a8f402931fe6940a4303fe9e0 (patch)
tree0687ad2e78c86a3246ab0438b7f6cc15979b6c9e /lib/bl_aux_params
parentd0d0f171643a22bbc3d06f5b6dde40cc1d9d5d11 (diff)
downloadtrusted-firmware-a-b852d229f32aa65a8f402931fe6940a4303fe9e0.tar.gz
Introduce lightweight BL platform parameter library
This patch adds some common helper code to support a lightweight platform parameter passing framework between BLs that has already been used on Rockchip platforms but is more widely useful to others as well. It can be used as an implementation for the SoC firmware configuration file mentioned in the docs, and is primarily intended for platforms that only require a handful of values to be passed and want to get by without a libfdt dependency. Parameters are stored in a linked list and the parameter space is split in generic and vendor-specific parameter types. Generic types will be handled by this code whereas vendor-specific types have to be handled by a vendor-specific handler function that gets passed in. Change-Id: If3413d44e86b99d417294ce8d33eb2fc77a6183f Signed-off-by: Julius Werner <jwerner@chromium.org>
Diffstat (limited to 'lib/bl_aux_params')
-rw-r--r--lib/bl_aux_params/bl_aux_params.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/bl_aux_params/bl_aux_params.c b/lib/bl_aux_params/bl_aux_params.c
new file mode 100644
index 0000000000..7a8115c61b
--- /dev/null
+++ b/lib/bl_aux_params/bl_aux_params.c
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <common/debug.h>
+#include <lib/coreboot.h>
+#include <lib/bl_aux_params/bl_aux_params.h>
+
+void bl_aux_params_parse(u_register_t head,
+ bl_aux_param_handler_t handler)
+{
+ struct bl_aux_param_header *p;
+
+ for (p = (void *)head; p; p = (void *)(uintptr_t)p->next) {
+ if (handler && handler(p))
+ continue;
+
+ switch (p->type) {
+#if COREBOOT
+ case BL_AUX_PARAM_COREBOOT_TABLE:
+ coreboot_table_setup((void *)(uintptr_t)
+ ((struct bl_aux_param_uint64 *)p)->value);
+ break;
+#endif
+ default:
+ ERROR("Ignoring unknown BL aux parameter: 0x%llx",
+ p->type);
+ break;
+ }
+ }
+}