From patchwork Fri Sep 1 08:25:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sumit Garg X-Patchwork-Id: 808578 X-Patchwork-Delegate: yorksun@freescale.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3xkC4H69kVz9t1t for ; Fri, 1 Sep 2017 18:25:51 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 7757AC21ED6; Fri, 1 Sep 2017 08:25:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=BAD_ENC_HEADER, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id F3B95C21EDF; Fri, 1 Sep 2017 08:25:28 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id AD214C21ED5; Fri, 1 Sep 2017 08:25:04 +0000 (UTC) Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-cys01nam02on0066.outbound.protection.outlook.com [104.47.37.66]) by lists.denx.de (Postfix) with ESMTPS id 97F2CC21EE0 for ; Fri, 1 Sep 2017 08:25:00 +0000 (UTC) Received: from BN6PR03CA0060.namprd03.prod.outlook.com (10.173.137.22) by CY1PR03MB2268.namprd03.prod.outlook.com (10.166.207.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.13.10; Fri, 1 Sep 2017 08:24:58 +0000 Received: from BY2FFO11FD032.protection.gbl (2a01:111:f400:7c0c::124) by BN6PR03CA0060.outlook.office365.com (2603:10b6:404:4c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.13.10 via Frontend Transport; Fri, 1 Sep 2017 08:24:58 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11FD032.mail.protection.outlook.com (10.1.14.210) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1385.11 via Frontend Transport; Fri, 1 Sep 2017 08:24:57 +0000 Received: from vinitha-OptiPlex-790.ap.freescale.net (vinitha-OptiPlex-790.ap.freescale.net [10.232.134.143]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v818OgmX021859; Fri, 1 Sep 2017 01:24:53 -0700 From: Sumit Garg To: Date: Fri, 1 Sep 2017 13:55:01 +0530 Message-ID: <1504254301-7970-2-git-send-email-sumit.garg@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1504254301-7970-1-git-send-email-sumit.garg@nxp.com> References: <1504254301-7970-1-git-send-email-sumit.garg@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131487278980793600; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(979002)(6009001)(336005)(39860400002)(39380400002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(50986999)(53936002)(54906002)(76176999)(36756003)(47776003)(498600001)(48376002)(110136004)(50466002)(2950100002)(68736007)(626005)(4326008)(104016004)(85426001)(50226002)(97736004)(8936002)(81156014)(81166006)(5003940100001)(8656003)(6666003)(189998001)(6916009)(86362001)(8676002)(356003)(106466001)(33646002)(5660300001)(2351001)(105606002)(2906002)(305945005)(77096006)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR03MB2268; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD032; 1:SJgcTF66j2YpQB48R+DMClXXL5VAIscZPAByJRDouQA1G2e1zOfNxujEQms1jSxK5mZm+FQ74unzb0Epyz08FMrWJguPyo3v30Ld7Qh7jVDAuoQFMw2/ot6m10PPrOud MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ccd43ed1-ccfe-4e8d-f9f8-08d4f112ee85 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(300000502095)(300135100095)(22001)(300000503095)(300135400095)(2017052603199)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:CY1PR03MB2268; X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB2268; 3:6XBf4WXCh5WDwlfZLpb6V3mh60c0UNizLQFfNBaVZCiYCAGLvSGAiMFsUO8zSlJXgrmzbjE7Q2VfDLdli0/WmKrviTdRT66P+bnUxs5A/MVTF7LhmnnEUZo3eGTGWmCqY7Gb/02Ip4kCsecQWxp5ASk3nesbOQX9ePtfKHgwi8jKSJXFgXQJrhjA4oeKT1DNLxkh1QnDS+QnEYzAyoDw2puMvu0lrPAwa6a1uUMAJkPWtxazVkmKoSPdHP8v/LXtL9N8R74c3qwvEU48WuzQouJWhMf1dsO9q88xMf+kXAbaG/7Y/0vurvY1lJVFIxW5iy1OnX35skNOUn0rB1sm8qjtdO/RHDC70XaT8hiJ6NA=; 25:4VJxa1eCTwrlDjI8ZH95Pg5EUHpTbyBLKgW0ia9hq+xc4kwh6cgHAi/8HRkfJKLcjSc3hNhwzBneHqpmTtwyZ1WGDLSKe0ky7ft62gvyrNbZEg4mjnQA9cjP2cj4EnZzuxagpWFyTl7+N/Dg/DRnYv+JrLa3tMuH0LImlIbB7YVTWzJEKZziHQisEMoBkIOGrrm83ZwJvx2Bt20YWbUUDp/4HmLiLOskYFwJDO7Q5PyjNgNHEaCtSXKdakSjh24fKHwNuwKdsHk9sVkgWPi0GeN0ZNGHIFEzhxFN8LdOgVR0WeMOFMs0BTzwJc+wZNhnsKUc2jpCcK8Xlto4Acgjfw== X-MS-TrafficTypeDiagnostic: CY1PR03MB2268: X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB2268; 31:NlR4bQ0ckADmfM0IzcAdIEe0OgvemrRZVKZlaPsUNblRO9AitUdC2va7SG8am9dWErAoma4vF4nwUMyzI+TS0ei4cBIqGQGg9Ki+mGqBhULRO5d+XpOnHkAOZZNN8fk1tu2466TxkjdO521LjF1jvOBeJNtsYp75lV033frJzdqfRlzQxcnNWEyc7S7NniRStvFEgDToMoGJQ1I29yIcySvUx2VJ5P1LucxIFERBgic=; 4:Iw/Y7fn0X5x0HvZqNffzObWpo7FLUsXa8GXZN9I7vyHMlVru0LRBFFSPRajzat+bzFr+sIqtSRzCyRTF8/OpI1xCqa3b/zc+ESfMfxFuctnWjFK6LMMCIYKSS4jSusewy7pQRQ1R1kPupk1F8HFS3eKvA9uAba7doj++5U+x2JbjWw0wjdxqzcLdHSRjJZpO4ZvGU6GUqbcfQj9O/zNDeyycOxmtCppT4MPQvTiwFAd/en/xU8oXc3PZQMrV1A0muZPAoYkgOe35/uajiIdccrcpBoMGqBblqu7glOjyUf8= X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(601004)(2401047)(13018025)(8121501046)(5005006)(13016025)(93006095)(93001095)(3002001)(100000703101)(100105400095)(10201501046)(6055026)(6096035)(20161123561025)(20161123563025)(20161123556025)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150)(20161123559100)(20161123565025)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:CY1PR03MB2268; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CY1PR03MB2268; X-Forefront-PRVS: 0417A3FFD2 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR03MB2268; 23:KdY4Z5aqhZbttlJVGhlqsbXLrIGVkueuwYxsInnxW?= s9SYltiv7fQVdPXR54slnfxUugZKEJD5ByMhx382WZ6ObfrmmI8JxZusvIsbCUlWu3yY7BgTd0dkXOg/Qp+XwZKVBZuFiPbnKVRdzOapobfkLUhDpVsMfsTu9rGjYaeeQy9Vu+KguTfRborXpX2Ce73A+XFtSDL++BiX8y0o7K1A2uo0Fyc+0rjFebYNp3t5OSOV4iVagzbZMi9QwzlhuwR/acDVu8qLmvfX/MPhCt+0HWx3J8U0kl7k8aHjD1zwQpNieI56iqsa76wOfyUTnhqKugwWTXk3mH2a4u2FXQQM/T236rJT1tf6rLuM1SVyznpS0bohWB127of20UUVmtp40XxZlmy1fspLukpdVK6bXPZ1TWbNtw+t7FWqPUxCAoZwShOzb0zUmEXWdcBlCYLWji/UFa8HthSfcIyl9NbXUq11M22sUJNS73UjvWg+L4KuIiAaq598pj0qPfIIm+xWxTeFl7XyX9CV2Lw34XE/fg9dTF92H9yXl2RAqhyoxcWwJtsestDicwiYB6Bqxlz83no08h+7ABJee0Sn5ioRvyu0TUtoweqgeNPWKegK8Q6ecU+nnRQNTpcKZxfln5z09DSPzhx160+y1qtt0Kf+PcQ4TR79QnNPw8R9mHOhApcm0yX7i5K/uvVxb/95vdLSXMpVI1PwUqGN0gVhgrX7ocPDayYa+58KsPBDRrRyiglgmEbLR52h0nbncNEw+KJKKb2YMmt/FjUvW1lLH+HzgVQ0dZKY1WT/RRiEzbKBsFcaJPS/XZTU+WHNJGfbcwgcUXn19Uk/x3zRFzkzJvcJAChldsFMg3LQk2jIgUIs02XhynGXLGzlCIN+AINclpRApPT/mgwNuReNF4JaXzO4l8EV9sAwJ4fYMsotZoxOxyblewtRXmd42AOs4b62/IvePhdYWy2Vif76445eXXY0Pz3QpGckCdu3T+l5h1zXMIWM9pmSei0hvFpaPRnY1XwD7qUGbqEQJ5BKVrPNLjtrLE3BbEszw6RstQXu8hwYZFYFsuVuZMsDRlobaV9Ieni/tWd1ztPfdmHyQEZ9DQ/f4LaT+kYIAfZWv/eZLDQu1q0B1Kw9B6cxYqsPmnazyhhQApxXCKWH57V41bCGvbCFxNb4Row4obYDNQUEau/lhIRi/OAyTpTmOsNIIm7gkfq/8fzlSWEcVNXAhaaW96uhA== X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB2268; 6:or8VU+1d5v3VfCS0MNI0EKGBtWLPZYH/++Vs2wWBiGPg06PcagQB8m/xf8McUMp6p9xRDIYHMpoE03nIrXM5++d6QTPy92Ll5kWjkoGufZWTzUircLZyd5MDeLXB8ZmsVysu8kSyMORYOQcf6D8GasiuQvnCedbOU3rLFAW0iXbj7+9iAyqhxhdb+b3xEzbTtatNWqUPuoy2ZzWuYgZuzSkjFZsXTr5SCRlsnYfVBNSyAWWyDn7VIaluxwh3AGQ+y2ZSPhdMCfD9+eJ+hUQbjZb4qRLYep1MCecKXuGGiinAZyPfZJ/e0UynM4Ag/d7VEn+mBnSZ6EncAMixk6RHwg==; 5:eMVoxNo0+WQGCf9WZc4I1fGu7CpU4vjDGKY+yemW+dwFGDWMtJCX/uVuerQS5ahq+5/W9/hKv6uaEfGwBPq4+qNsT+Y0yj6y+8ON2mGF01saGmzHDu+hlt9oEULyDyTdzmyE5NV8CmdMBMZ/GkmNRg==; 24:oFejA/pEK80N5g6KeIwoQrOUKgog65O5K/jBYJa8a7XcFjPAfbWYyhOEX15/4AjiFM0mqVDrZPFNT0o8UME912M0Uu93Ye7d67Q60IztbKk=; 7:4PMaK+r8y5MkvkSAl8+0mjvH2aZ4AyPcGw/UCIy8uF3tINUEdhxFhGrG5A4u33rRSRn+xPCpYDIWcI1Qc1+7vMaN+9lY8v8gMI9eWvnQDmQiwxPPB3nAITz02zAR5GtKNNF+qsPf+yMve6t3YAbYEZEE+q54WFvCzM+meAYgBoiIPVynN45QW2IEg7Gk1/6NwTOdbgvE9OnqZJWSGhREaz7vdwWj5BIBv85PdKRhc6w= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2017 08:24:57.7673 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR03MB2268 Cc: sahil.malhotra@nxp.com, Zhiqiang.Hou@nxp.com, pankaj.gupta@nxp.com, arun.pathak@nxp.com, ruchika.gupta@nxp.com Subject: [U-Boot] [PATCH 2/2] armv8: sec_firmware: Add support for loadables in FIT X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Enable support for loadables in SEC firmware FIT image. Currently support is added for single loadable image. Brief description of implementation: - Add two more address pointers (loadable_h, loadable_l) as arguments to sec_firmware_init() api. - Create new api: sec_firmware_checks_copy_loadable() to check if loadables node is present in SEC firmware FIT image. If present, verify loadable image and copies it to secure DDR memory. - Populate address pointers with secure DDR memory addresses where loadable is copied. Example use-case could be trusted OS (tee.bin) as loadables node in SEC firmware FIT image. Signed-off-by: Sumit Garg --- arch/arm/cpu/armv8/fsl-layerscape/ppa.c | 16 +++++- arch/arm/cpu/armv8/sec_firmware.c | 92 +++++++++++++++++++++++++++++-- arch/arm/include/asm/armv8/sec_firmware.h | 4 +- 3 files changed, 104 insertions(+), 8 deletions(-) diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ppa.c b/arch/arm/cpu/armv8/fsl-layerscape/ppa.c index 35c612d..87a0885 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/ppa.c +++ b/arch/arm/cpu/armv8/fsl-layerscape/ppa.c @@ -35,6 +35,7 @@ int ppa_init(void) unsigned int el = current_el(); void *ppa_fit_addr; u32 *boot_loc_ptr_l, *boot_loc_ptr_h; + u32 *loadable_l, *loadable_h; int ret; #ifdef CONFIG_CHAIN_OF_TRUST @@ -252,9 +253,9 @@ int ppa_init(void) PPA_KEY_HASH, &ppa_img_addr); if (ret != 0) - printf("PPA validation failed\n"); + printf("SEC firmware(s) validation failed\n"); else - printf("PPA validation Successful\n"); + printf("SEC firmware(s) validation Successful\n"); } #if defined(CONFIG_SYS_LS_PPA_FW_IN_MMC) || \ defined(CONFIG_SYS_LS_PPA_FW_IN_NAND) @@ -266,15 +267,24 @@ int ppa_init(void) struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); boot_loc_ptr_l = &gur->bootlocptrl; boot_loc_ptr_h = &gur->bootlocptrh; + + /* Assign addresses to loadable ptrs */ + loadable_l = &gur->scratchrw[4]; + loadable_h = &gur->scratchrw[5]; #elif defined(CONFIG_FSL_LSCH2) struct ccsr_scfg __iomem *scfg = (void *)(CONFIG_SYS_FSL_SCFG_ADDR); boot_loc_ptr_l = &scfg->scratchrw[1]; boot_loc_ptr_h = &scfg->scratchrw[0]; + + /* Assign addresses to loadable ptrs */ + loadable_l = &scfg->scratchrw[2]; + loadable_h = &scfg->scratchrw[3]; #endif debug("fsl-ppa: boot_loc_ptr_l = 0x%p, boot_loc_ptr_h =0x%p\n", boot_loc_ptr_l, boot_loc_ptr_h); - ret = sec_firmware_init(ppa_fit_addr, boot_loc_ptr_l, boot_loc_ptr_h); + ret = sec_firmware_init(ppa_fit_addr, boot_loc_ptr_l, boot_loc_ptr_h, + loadable_l, loadable_h); #if defined(CONFIG_SYS_LS_PPA_FW_IN_MMC) || \ defined(CONFIG_SYS_LS_PPA_FW_IN_NAND) diff --git a/arch/arm/cpu/armv8/sec_firmware.c b/arch/arm/cpu/armv8/sec_firmware.c index 0e74834..927eae4 100644 --- a/arch/arm/cpu/armv8/sec_firmware.c +++ b/arch/arm/cpu/armv8/sec_firmware.c @@ -105,6 +105,74 @@ static int sec_firmware_parse_image(const void *sec_firmware_img, return 0; } +/* + * SEC Firmware FIT image parser to check if any loadable is + * present. If present, verify integrity of the loadable and + * copy loadable to address provided in (loadable_h, loadable_l). + * + * Returns 0 on success and a negative errno on error task fail. + */ +static int sec_firmware_check_copy_loadable(const void *sec_firmware_img, + u32 *loadable_l, u32 *loadable_h) +{ + phys_addr_t sec_firmware_loadable_addr = 0; + int conf_node_off, ld_node_off; + char *conf_node_name = NULL; + const void *data; + size_t size; + ulong load; + + conf_node_name = SEC_FIRMEWARE_FIT_CNF_NAME; + + conf_node_off = fit_conf_get_node(sec_firmware_img, conf_node_name); + if (conf_node_off < 0) { + printf("SEC Firmware: %s: no such config\n", conf_node_name); + return -ENOENT; + } + + ld_node_off = fit_conf_get_prop_node(sec_firmware_img, conf_node_off, + FIT_LOADABLE_PROP); + if (ld_node_off >= 0) { + printf("SEC Firmware: '%s' present in config\n", + FIT_LOADABLE_PROP); + + /* Verify secure firmware image */ + if (!(fit_image_verify(sec_firmware_img, ld_node_off))) { + printf("SEC Loadable: Bad loadable image (bad CRC)\n"); + return -EINVAL; + } + + if (fit_image_get_data(sec_firmware_img, ld_node_off, + &data, &size)) { + printf("SEC Loadable: Can't get subimage data/size"); + return -ENOENT; + } + + /* Get load address, treated as load offset to secure memory */ + if (fit_image_get_load(sec_firmware_img, ld_node_off, &load)) { + printf("SEC Loadable: Can't get subimage load"); + return -ENOENT; + } + + /* Compute load address for loadable in secure memory */ + sec_firmware_loadable_addr = (sec_firmware_addr - + gd->arch.tlb_size) + load; + + /* Copy loadable to secure memory and flush dcache */ + debug("%s copied to address 0x%p\n", + FIT_LOADABLE_PROP, (void *)sec_firmware_loadable_addr); + memcpy((void *)sec_firmware_loadable_addr, data, size); + flush_dcache_range(sec_firmware_loadable_addr, + sec_firmware_loadable_addr + size); + } + + /* Populate address ptrs for loadable image with loadbale addr */ + out_le32(loadable_l, (sec_firmware_loadable_addr & WORD_MASK)); + out_le32(loadable_h, (sec_firmware_loadable_addr >> WORD_SHIFT)); + + return 0; +} + static int sec_firmware_copy_image(const char *title, u64 image_addr, u32 image_size, u64 sec_firmware) { @@ -117,9 +185,11 @@ static int sec_firmware_copy_image(const char *title, /* * This function will parse the SEC Firmware image, and then load it - * to secure memory. + * to secure memory. Also load any loadable if present along with SEC + * Firmware image. */ -static int sec_firmware_load_image(const void *sec_firmware_img) +static int sec_firmware_load_image(const void *sec_firmware_img, + u32 *loadable_l, u32 *loadable_h) { const void *raw_image_addr; size_t raw_image_size = 0; @@ -172,6 +242,15 @@ static int sec_firmware_load_image(const void *sec_firmware_img) if (ret) goto out; + /* + * Check if any loadable are present along with firmware image, if + * present load them. + */ + ret = sec_firmware_check_copy_loadable(sec_firmware_img, loadable_l, + loadable_h); + if (ret) + goto out; + sec_firmware_addr |= SEC_FIRMWARE_LOADED; debug("SEC Firmware: Entry point: 0x%llx\n", sec_firmware_addr & SEC_FIRMWARE_ADDR_MASK); @@ -289,17 +368,22 @@ int sec_firmware_get_random(uint8_t *rand, int bytes) * @sec_firmware_img: the SEC Firmware image address * @eret_hold_l: the address to hold exception return address low * @eret_hold_h: the address to hold exception return address high + * @loadable_l: the address to hold loadable address low + * @loadable_h: the address to hold loadable address high */ int sec_firmware_init(const void *sec_firmware_img, u32 *eret_hold_l, - u32 *eret_hold_h) + u32 *eret_hold_h, + u32 *loadable_l, + u32 *loadable_h) { int ret; if (!sec_firmware_is_valid(sec_firmware_img)) return -EINVAL; - ret = sec_firmware_load_image(sec_firmware_img); + ret = sec_firmware_load_image(sec_firmware_img, loadable_l, + loadable_h); if (ret) { printf("SEC Firmware: Failed to load image\n"); return ret; diff --git a/arch/arm/include/asm/armv8/sec_firmware.h b/arch/arm/include/asm/armv8/sec_firmware.h index 6d42a71..2ba1847 100644 --- a/arch/arm/include/asm/armv8/sec_firmware.h +++ b/arch/arm/include/asm/armv8/sec_firmware.h @@ -9,8 +9,10 @@ #define PSCI_INVALID_VER 0xffffffff #define SEC_JR3_OFFSET 0x40000 +#define WORD_MASK 0xffffffff +#define WORD_SHIFT 32 -int sec_firmware_init(const void *, u32 *, u32 *); +int sec_firmware_init(const void *, u32 *, u32 *, u32 *, u32 *); int _sec_firmware_entry(const void *, u32 *, u32 *); bool sec_firmware_is_valid(const void *); bool sec_firmware_support_hwrng(void);