From e4dff321799fc342638be45618bf0fc44b74b186 Mon Sep 17 00:00:00 2001 From: Robert Rosengren Date: Tue, 14 Dec 2010 09:28:58 +0100 Subject: 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 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/10895 Reviewed-by: QATOOLS Reviewed-by: Michael BRANDT --- cpu/arm_cortexa9/db8500/sec_bridge.c | 84 ++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 cpu/arm_cortexa9/db8500/sec_bridge.c (limited to 'cpu/arm_cortexa9/db8500/sec_bridge.c') 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 for ST-Ericsson. + * + * License terms: GNU General Public License (GPL), version 2. + */ + +#include +#include + +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; +} -- cgit v1.2.3