summaryrefslogtreecommitdiff
path: root/cpu/arm_cortexa9/db8500/sec_bridge.c
diff options
context:
space:
mode:
authorRobert Rosengren <robert.rosengren@stericsson.com>2010-12-14 09:28:58 +0100
committerMichael BRANDT <michael.brandt@stericsson.com>2010-12-15 10:00:48 +0100
commite4dff321799fc342638be45618bf0fc44b74b186 (patch)
tree5fbeeb1fa80d1faca8824475527a68903aa83a14 /cpu/arm_cortexa9/db8500/sec_bridge.c
parentc0d5e1d2461f8135492a79f3e5259ac324ee1a96 (diff)
db8500: Move ISSW code out from itp.c
Splitting security related code from itp.c into sec_bridge.c ST-Ericsson ID: WP275634 ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I813daf0d0eaea4645e7d990bf467f19b0af968db Signed-off-by: Robert Rosengren <robert.rosengren@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/10895 Reviewed-by: QATOOLS Reviewed-by: Michael BRANDT <michael.brandt@stericsson.com>
Diffstat (limited to 'cpu/arm_cortexa9/db8500/sec_bridge.c')
-rw-r--r--cpu/arm_cortexa9/db8500/sec_bridge.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/cpu/arm_cortexa9/db8500/sec_bridge.c b/cpu/arm_cortexa9/db8500/sec_bridge.c
new file mode 100644
index 000000000..fb94804eb
--- /dev/null
+++ b/cpu/arm_cortexa9/db8500/sec_bridge.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * Author: Mikael Larsson <mikael.xt.larsson@stericsson.com> for ST-Ericsson.
+ *
+ * License terms: GNU General Public License (GPL), version 2.
+ */
+
+#include <common.h>
+#include <asm/arch/sec_bridge.h>
+
+typedef u32 (*boot_rom_bridge_func_t)(const u32 , const u32, const va_list);
+static boot_rom_bridge_func_t hw_sec_rom_pub_bridge;
+
+struct sec_rom_cut_desc {
+ u32 cutid_addr;
+ u32 cutid;
+ u32 bridge_func;
+};
+
+static const struct sec_rom_cut_desc cuttable[] = {
+ { 0x9001DBF4, 0x008500B0, 0x90017300 },
+ { 0x9001FFF4, 0x008500A1, 0x90018300 },
+ { 0x9001FFF4, 0x005500A0, 0x90018300 },
+ { 0x9001FFF4, 0x008500A0, 0x90018300 },
+};
+
+int sec_bridge_init_bridge(void)
+{
+ u8 cutnb = 0;
+
+ hw_sec_rom_pub_bridge = NULL;
+
+ while ((cutnb < ARRAY_SIZE(cuttable)) &&
+ (cuttable[cutnb].cutid != *(u32 *)(cuttable[cutnb].cutid_addr)))
+ cutnb++;
+
+ if (cutnb < ARRAY_SIZE(cuttable)) {
+ hw_sec_rom_pub_bridge =
+ (boot_rom_bridge_func_t)cuttable[cutnb].bridge_func;
+
+ return 0;
+ }
+
+ printf("sec_bridge_init_bridge: cutid not found\n");
+ return 1;
+}
+
+u32 sec_bridge_call_secure_service(const u32 serviceid,
+ const u32 secureconfig,
+ ...)
+{
+ va_list ap;
+ u32 returnvalue;
+
+ va_start(ap, secureconfig);
+
+ returnvalue = hw_sec_rom_pub_bridge(serviceid,
+ secureconfig,
+ ap);
+
+ va_end(ap);
+ return returnvalue;
+}
+
+int sec_bridge_flush_issw(void)
+{
+ u32 ret;
+
+ if (hw_sec_rom_pub_bridge != NULL) {
+
+ ret = sec_bridge_call_secure_service(ISSWAPI_FLUSH_BOOT_CODE,
+ SEC_ROM_FORCE_CLEAN_MASK,
+ 0,
+ 0);
+
+ if (ret != SEC_ROM_RET_OK) {
+ printf("sec_bridge_flush_issw: ISSWAPI_FLUSH_BOOT_CODE: %d\n",
+ ret);
+ return 1;
+ }
+ }
+ return 0;
+}