From patchwork Wed Apr 27 13:39:22 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Z.Q. Hou" X-Patchwork-Id: 615696 X-Patchwork-Delegate: yorksun@freescale.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 3qw2c00nRQz9t3w for ; Thu, 28 Apr 2016 00:37:20 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 315ECA7684; Wed, 27 Apr 2016 16:37:18 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8M3kVKfAvoBF; Wed, 27 Apr 2016 16:37:18 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id A6109A75F3; Wed, 27 Apr 2016 16:37:17 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 6A01BA7764 for ; Wed, 27 Apr 2016 16:23:37 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 3ZBw9zHvN2YM for ; Wed, 27 Apr 2016 16:23:37 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1on0095.outbound.protection.outlook.com [157.56.110.95]) by theia.denx.de (Postfix) with ESMTPS id 407EEA773B for ; Wed, 27 Apr 2016 16:23:14 +0200 (CEST) Received: from BLUPR0301CA0025.namprd03.prod.outlook.com (10.162.113.163) by DM2PR0301MB1229.namprd03.prod.outlook.com (10.160.219.18) with Microsoft SMTP Server (TLS) id 15.1.477.8; Wed, 27 Apr 2016 13:49:35 +0000 Received: from BL2FFO11OLC005.protection.gbl (2a01:111:f400:7c09::162) by BLUPR0301CA0025.outlook.office365.com (2a01:111:e400:5259::35) with Microsoft SMTP Server (TLS) id 15.1.477.8 via Frontend Transport; Wed, 27 Apr 2016 13:49:35 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BL2FFO11OLC005.mail.protection.outlook.com (10.173.160.91) with Microsoft SMTP Server (TLS) id 15.1.477.4 via Frontend Transport; Wed, 27 Apr 2016 13:49:35 +0000 Received: from titan.ap.freescale.net ([10.192.208.233]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id u3RDnPA8010606; Wed, 27 Apr 2016 06:49:30 -0700 From: Zhiqiang Hou To: , , , , , , , , Date: Wed, 27 Apr 2016 21:39:22 +0800 Message-ID: <1461764367-7760-2-git-send-email-Zhiqiang.Hou@nxp.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1461764367-7760-1-git-send-email-Zhiqiang.Hou@nxp.com> References: <1461764367-7760-1-git-send-email-Zhiqiang.Hou@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131062385754188842; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.158.2; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(3190300001)(339900001)(189002)(199003)(87936001)(85426001)(6806005)(4326007)(106466001)(77096005)(11100500001)(5008740100001)(229853001)(2950100001)(92566002)(36756003)(4001430100002)(76176999)(1220700001)(50986999)(5003940100001)(104016004)(2201001)(47776003)(575784001)(86362001)(81166005)(5001770100001)(50226002)(2906002)(586003)(105606002)(189998001)(50466002)(48376002)(107886002)(19580395003)(19580405001)(1096002)(7059030)(21314002)(217873001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR0301MB1229; H:az84smr01.freescale.net; FPR:; SPF:Fail; MLV:sfv; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11OLC005; 1:ivZ4FlS7vszkc31OKSB5uUgsv9v27BWUyI008rh7ugxknqUQo7gYQn09ZRoSFLeZUdOwaamokr7anjGx7T8HqVJ1Ly8yaDt0lkAKdERyBgwlCfzYwt4osrUsZyFnZAadTJs+eSSrYllLqa0dKRxVJyHiKBLtG+T1oncns6MunHiBKZKvbz8Fn+ynv0rtBVcpDuGqARww4q0mP0Lb0wOi8viP0wsHYa0KrVjGqKAQ+Zz1lY52hlA7DxOlQzZM7sCZ9gipLhGL2WW6n4JjnDQQhfu8s+M0n2gaVDssEQN6vKtyXpu6px1DOi89MJVqdTvf2ISnc/BsM/rjc4XeLX0HePwLzZQZytSzehrinq8eYhfk+94oZU9tm83nGlG3BrHhcrY6Z7xBTVllK12BXSMvBRgefH17SVbqTxnIbVlKEr6ZXJWx3PyrhExPl5QIk04Y2DD22bVmTMDnPKzPXLBxZ1dokggnsXUtzDNgwCP//ON9uOXnY4dENIdj4ndhtPM8aXJflBSS18/t7TfHErwtreAlEu4F98Q42yx1yBvqzvNbfRkF92x4Y1Zmr2X7e7QkZmjPGI+ZuW6KFrCsYFJo9cnE3te0aCLDrv2cI6IN2H7nO2OlxKPppJRPjicbE9OQBsucweRsTQ3BqlsWauKHsQ== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: d727be38-5d5f-40b9-2c2a-08d36ea2c4c2 X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB1229; 2:EGahMJDfp2qSE1gzezRAIf1FVdkhKD+4iB9jQuqj9w/8v93wxPRuEgefbfdL3GWciVcgrXKULUF5HrkPj+PjAlfZSZzVQnyAxw2VLgKerx/9NBSpBx59UQQtSZeTc+QjHyrFuQv5R2owuThBsFvFLg+UWLiiavir8iMeuSBBw2NBkNzXVSpB0hdwA1Wp2Nww; 3:7ZQZb/MJ75GdpvnVr1UQ5WXF3ize+Kzscx801OPDvLxb02mnXkuoWSz0ndgnvWO4Y/Fyk0030Xq6H7dMvh09WfcL+TNRV12oSiCv6+i92Ty++tkWyERklHRyGXZL4z9AQzxBhEaiQUCEEEjfEqp9tLdTyLsqDdffyEOX7/Wys46jscE+dxtwdwF1DuGHsrA7cLPytdbd1GlxzlVsB/esKD7lXmq9BiN1h4a6Xs8yD7o=; 25:kl58zV0a6jiThSRnR9zjn3HOEChNHYS2cqdMh+F1d6h1E9z3J9ra/iL+/8sPHWpQL7Gp4WOMW1bxitlEXqBXpfQ77IFVEGsMy19Ue71jdTGXmsmih0qXJgouJNUSjVtXrx6VJTxjYWLe3OB1Ch/6koMdNqMNSyAFpVN4EvYExfR6dQrfG2NWtQveVMWzXHoo66A/olH7rmDtiugmDCXkvGubrqo8dvAkvDj20k/mlYXvoicBwNaZTUe5bIaEvOHCoFqfstIVROUPbyvCNCf/gHB8Dd+tjtJJFtSN1bWYWqqJRYaXQEHSi9wyTvtHgbDTGkBsAkz1pgZu6UVkoiBWKA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM2PR0301MB1229; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(13017025)(5005006)(13015025)(13023025)(13024025)(13018025)(10201501046)(3002001)(6055026); SRVR:DM2PR0301MB1229; BCL:0; PCL:0; RULEID:(400006); SRVR:DM2PR0301MB1229; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB1229; 4:LpW7/kPBbMHFVUXX+5Z08GRb6vFWMcwiF3VBj2O8wo7B1SaZKbZhLmz0891SauUyoYQFRPuOZXEn0Uq1E7sfNg7Y1aE6TN5gnsTb6/TYU/pUBpO7ziGO/PlTbI5OU+wzc7QfETJYN3zg3HTHvDWMdkN2XM7YJPyDXcLR/M38BmNqRa0Y23hkzNZKYRLNNTE/cESR6Ws1AWMp2xLP8bA0cTdRRNbIo600KEupvKUp5uZSGUKQuLWwjWv15+8zuWr9QXRUmY3kkME+NVz3o0wwCvSQt51ZfhoKj7BCCln4JNycwjdCDCHqJHRqB0bpdBzrihf9/NDSlTUq0ax7NtkAMvWzTNk6d3mKDfoByKFNV17X1cRGzEBUX+vBhaMl1hxAthn9Qiij5+TFLDw2CEEXLPuzLPebltzC3bijnt2MXi9Ezqi5Xtp0ohn69FXMcc7bxV20tZUFLmPYSn6S45OFctD80j7iXhMijDhVBaT8eEM= X-Forefront-PRVS: 0925081676 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR0301MB1229; 23:B2AdfZUQgxtCQ/QCXFlxTMXXziv9LZGHFbcfvBt?= =?us-ascii?Q?XS9LuVRQNmeWa+smYH3eb7N6PXqBZ1solCdgqBp6J2qrC+7pSkcgSeChut0E?= =?us-ascii?Q?zRfUzBv8lVLRjiAnI5MTqChA2tl+UR0Droukwcw/7GLUF5IsKzzIJhve/+Ee?= =?us-ascii?Q?4vxlLxxDJZenRzXgfu2nt905PejlDG+VvWh1uJV4VFj/Hk9BvDkXsfPmDIHz?= =?us-ascii?Q?xIa4mIhqu8aWI7ulGpbS3Hw1fkEWeZ6zgOZ0hKgSgsDir3oGFxLULZy3s21z?= =?us-ascii?Q?Z64GoghIA1+QAMIOHpgt0uRJ0E0uuvAPYdSTczquGCwndYnph7akj4PaBhIg?= =?us-ascii?Q?aLM/BSgAU+7/yQGi+wrv8CWMbqTcVTlt0GtUX0/ViCBPuPMOEWkbFGqTAI8R?= =?us-ascii?Q?3WFDBeoCfermyxOMvBRN0nBDsGQJ2DCXF7RlYxUIcB2gyifH6lZtBmF2lENV?= =?us-ascii?Q?YsGZ9TSHEPO+5gB1Im4mgKFnV9juUncyFgefBfO9TGSbDCOQYOU52FMxbHcq?= =?us-ascii?Q?eVMcR7drjouIjlqTOk/6kTly2X5E+i+HkrwNhX/kTCdEcECqK+pYv6AetsW8?= =?us-ascii?Q?dXZl1fMKyWlVVrkbFhOwQa0e1CtslctshqctgnVH4s7mb75zBDJg6zEOzwAP?= =?us-ascii?Q?FfuBcv4k/yIHNj4dQXvrQOxFXSgBUwTQQrvFM+G+0wIu7dpOStfZpyAINa7h?= =?us-ascii?Q?yAbyYRGqBRpdyRfV9zZXS5Dz5sFf695NkK8GWIlMEv2pSlNRX/wbKwmeDFeH?= =?us-ascii?Q?gclVU4ePM2G+pvIm1w7UBfiLpDfV66rnXufmAQb36vASa5/q/Rg6xeI7UPTZ?= =?us-ascii?Q?wk7ldDFHBg3Hba69obavG+N20xfSz2EG4VNW+Z4Ej0BC+t0TrczxDB8a+F5l?= =?us-ascii?Q?GK2zIXFSQXTcahqHJp+GPMPg6eAIilGGFRoH7f2XkDBOk1rp6vPCDc6sA+CS?= =?us-ascii?Q?g4lJBPlRYWFPAbdQNnN1eksWQBpWwx4yYhnLtQAuNq9DZvbPD5QweyYH5fBj?= =?us-ascii?Q?t1NUWfwkjWhVYSdOQMqNauR5dSGh5olHjve3P5EZfEBokuOLxaI4C5GZgX8u?= =?us-ascii?Q?7Vh8/yU/m5VZ1WYinb93btF5RzA5NQ/1dR/DmaNSTc85FPCXZyDSVcBPMlrK?= =?us-ascii?Q?UFSGKZ33+FcnSAisVZH37hsgTMrfoO9Cic7VeysnUEZOnfCA78D01it/63sa?= =?us-ascii?Q?ixBuwFKv/EzpHBQnu7OfX/FWlXDpwciBkI9GD?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB1229; 5:pLQXJH35pvLpEajmGR9HqzEHEo794eTDgQKGviOBFjoUe23rcJVMyC/Of3JlNbnZUCxWa/pTKjyllVkyaau5T9K1uJXrxC1GUn33aA/C3/TjJxbqgXJZFse/NfHcwals3G9Ls9ONeGkYdQ2T1nvC0sawr4m+FJbzWtTluc3UZvg=; 24:k+rDQYDTro9rKNVxP0xwJ3epHgADgmbrMw82yDt1x1FnZvrpbfYBu1t9e6g+yXtaxdUK1VwijultivxE9kposJgB76g9dJ1d2DuJKbXO2Bk=; 7:6GbyNXUQWkbyVdo5Yfsub7HMxcY0Krp9J+KN/VbpxJ+a5W+Smmw28T77neLGzLIUslLovYdMdWiiyQqWHbVSqiW7zvl58f9JcOgyPMjYqv3nCVkYIBxYnGNnJBGksEMCIsK6HgszWY22uqSHnq+SwtGm0kRVFrH7S8rAN7fH/7e1GIIxJRNZzRYHBAQREmR6 SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Apr 2016 13:49:35.1849 (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.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR0301MB1229 X-Mailman-Approved-At: Wed, 27 Apr 2016 16:37:16 +0200 Cc: Hou Zhiqiang Subject: [U-Boot] [PATCH v3 2/7] ARMv8/layerscape: Add FSL PPA support X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 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" From: Hou Zhiqiang The FSL Primary Protected Application (PPA) is a software component loaded during boot which runs in TrustZone and remains resident after boot. Signed-off-by: Hou Zhiqiang --- V3: - Refactor the code. - Add secure firmware validation API - Add secure firmware getting supported PSCI version API - Add PPA firmware version info output. arch/arm/cpu/armv8/fsl-layerscape/Makefile | 1 + arch/arm/cpu/armv8/fsl-layerscape/ppa.c | 242 +++++++++++++++++++++++++ arch/arm/cpu/armv8/fsl-layerscape/ppa_entry.S | 42 +++++ arch/arm/include/asm/arch-fsl-layerscape/ppa.h | 15 ++ 4 files changed, 300 insertions(+) create mode 100644 arch/arm/cpu/armv8/fsl-layerscape/ppa.c create mode 100644 arch/arm/cpu/armv8/fsl-layerscape/ppa_entry.S create mode 100644 arch/arm/include/asm/arch-fsl-layerscape/ppa.h diff --git a/arch/arm/cpu/armv8/fsl-layerscape/Makefile b/arch/arm/cpu/armv8/fsl-layerscape/Makefile index 5f86ef9..1535fee 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/Makefile +++ b/arch/arm/cpu/armv8/fsl-layerscape/Makefile @@ -10,6 +10,7 @@ obj-y += soc.o obj-$(CONFIG_MP) += mp.o obj-$(CONFIG_OF_LIBFDT) += fdt.o obj-$(CONFIG_SPL) += spl.o +obj-$(CONFIG_FSL_LS_PPA) += ppa.o ppa_entry.o ifneq ($(CONFIG_FSL_LSCH3),) obj-y += fsl_lsch3_speed.o diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ppa.c b/arch/arm/cpu/armv8/fsl-layerscape/ppa.c new file mode 100644 index 0000000..aa71212 --- /dev/null +++ b/arch/arm/cpu/armv8/fsl-layerscape/ppa.c @@ -0,0 +1,242 @@ +/* + * Copyright 2015 Freescale Semiconductor, Inc. + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_FSL_LSCH3 +#include +#elif defined(CONFIG_FSL_LSCH2) +#include +#endif +#include + +DECLARE_GLOBAL_DATA_PTR; + +extern void c_runtime_cpu_setup(void); + +#define LS_PPA_FIT_FIRMWARE_IMAGE "firmware" +#define LS_PPA_FIT_CNF_NAME "config@1" +#define PPA_MEM_SIZE_ENV_VAR "ppamemsize" + +/* + * Return the actual size of the PPA private DRAM block. + */ +unsigned long ppa_get_dram_block_size(void) +{ + unsigned long dram_block_size = CONFIG_SYS_LS_PPA_DRAM_BLOCK_MIN_SIZE; + + char *dram_block_size_env_var = getenv(PPA_MEM_SIZE_ENV_VAR); + + if (dram_block_size_env_var) { + dram_block_size = simple_strtoul(dram_block_size_env_var, NULL, + 10); + + if (dram_block_size < CONFIG_SYS_LS_PPA_DRAM_BLOCK_MIN_SIZE) { + printf("fsl-ppa: WARNING: Invalid value for \'" + PPA_MEM_SIZE_ENV_VAR + "\' environment variable: %lu\n", + dram_block_size); + + dram_block_size = CONFIG_SYS_LS_PPA_DRAM_BLOCK_MIN_SIZE; + } + } + + return dram_block_size; +} + +static int ppa_firmware_validate(void *ppa_addr) +{ + void *fit_hdr; + + fit_hdr = ppa_addr; + + if (fdt_check_header(fit_hdr)) { + printf("fsl-ppa: Bad firmware image (not a FIT image)\n"); + return -EINVAL; + } + + if (!fit_check_format(fit_hdr)) { + printf("fsl-ppa: Bad firmware image (bad FIT header)\n"); + return -EINVAL; + } + + return 0; +} + +static int ppa_firmware_get_data(void *ppa_addr, const void **data, size_t *size) +{ + void *fit_hdr; + int conf_node_off, fw_node_off; + char *conf_node_name = NULL; + char *desc; + int ret; + + fit_hdr = ppa_addr; + conf_node_name = LS_PPA_FIT_CNF_NAME; + + conf_node_off = fit_conf_get_node(fit_hdr, conf_node_name); + if (conf_node_off < 0) { + printf("fsl-ppa: %s: no such config\n", conf_node_name); + return -ENOENT; + } + + fw_node_off = fit_conf_get_prop_node(fit_hdr, conf_node_off, + LS_PPA_FIT_FIRMWARE_IMAGE); + if (fw_node_off < 0) { + printf("fsl-ppa: No '%s' in config\n", + LS_PPA_FIT_FIRMWARE_IMAGE); + return -ENOLINK; + } + + /* Verify PPA firmware image */ + if (!(fit_image_verify(fit_hdr, fw_node_off))) { + printf("fsl-ppa: Bad firmware image (bad CRC)\n"); + return -EINVAL; + } + + if (fit_image_get_data(fit_hdr, fw_node_off, data, size)) { + printf("fsl-ppa: Can't get %s subimage data/size", + LS_PPA_FIT_FIRMWARE_IMAGE); + return -ENOENT; + } + + ret = fit_get_desc(fit_hdr, fw_node_off, &desc); + if (ret) + printf("PPA Firmware unavailable\n"); + else + printf("%s\n", desc); + + return 0; +} + +/* + * PPA firmware FIT image parser checks if the image is in FIT + * format, verifies integrity of the image and calculates raw + * image address and size values. + * + * Returns 0 on success and a negative errno on error task fail. + */ +static int ppa_parse_firmware_fit_image(const void **raw_image_addr, + size_t *raw_image_size) +{ + void *ppa_addr; + int ret; + +#ifdef CONFIG_SYS_LS_PPA_FW_IN_NOR + ppa_addr = (void *)CONFIG_SYS_LS_PPA_FW_ADDR; +#else +#error "No CONFIG_SYS_LS_PPA_FW_IN_xxx defined" +#endif + + ret = ppa_firmware_validate(ppa_addr); + if (ret) + return ret; + + ret = ppa_firmware_get_data(ppa_addr, raw_image_addr, raw_image_size); + if (ret) + return ret; + + debug("fsl-ppa: raw_image_addr = 0x%p, raw_image_size = 0x%lx\n", + *raw_image_addr, *raw_image_size); + + return 0; +} + +static int ppa_copy_image(const char *title, + u64 image_addr, u32 image_size, u64 ppa_ram_addr) +{ + debug("%s copied to address 0x%p\n", title, (void *)ppa_ram_addr); + memcpy((void *)ppa_ram_addr, (void *)image_addr, image_size); + flush_dcache_range(ppa_ram_addr, ppa_ram_addr + image_size); + + return 0; +} + +int ppa_init_pre(u64 *entry) +{ + u64 ppa_ram_addr; + const void *raw_image_addr; + size_t raw_image_size = 0; + size_t ppa_ram_size = ppa_get_dram_block_size(); + int ret; + + debug("fsl-ppa: ppa size(0x%lx)\n", ppa_ram_size); + + /* + * The PPA must be stored in secure memory. + * Append PPA to secure mmu table. + */ + ppa_ram_addr = (gd->secure_ram & MEM_RESERVE_SECURE_ADDR_MASK) + + gd->arch.tlb_size; + + /* Align PPA base address to 4K */ + ppa_ram_addr = (ppa_ram_addr + 0xfff) & ~0xfff; + debug("fsl-ppa: PPA load address (0x%llx)\n", ppa_ram_addr); + + ret = ppa_parse_firmware_fit_image(&raw_image_addr, &raw_image_size); + if (ret < 0) + goto out; + + if (ppa_ram_size < raw_image_size) { + ret = -ENOSPC; + goto out; + } + + ppa_copy_image("PPA firmware", (u64)raw_image_addr, + raw_image_size, ppa_ram_addr); + + debug("fsl-ppa: PPA entry: 0x%llx\n", ppa_ram_addr); + *entry = ppa_ram_addr; + + return 0; + +out: + printf("fsl-ppa: error (%d)\n", ret); + *entry = 0; + + return ret; +} + +int ppa_init_entry(void *ppa_entry) +{ + int ret; + u32 *boot_loc_ptr_l, *boot_loc_ptr_h; + +#ifdef CONFIG_FSL_LSCH3 + struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); + boot_loc_ptr_l = &gur->bootlocptrl; + boot_loc_ptr_h = &gur->bootlocptrh; +#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]; +#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 = ppa_init(ppa_entry, boot_loc_ptr_l, boot_loc_ptr_h); + if (ret < 0) + return ret; + + debug("fsl-ppa: Return from PPA: current_el = %d\n", current_el()); + + /* + * The PE will be turned into EL2 when run out of PPA. + * First, set vector for EL2. + */ + c_runtime_cpu_setup(); + + /* Enable caches and MMU for EL2. */ + enable_caches(); + + return 0; +} diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ppa_entry.S b/arch/arm/cpu/armv8/fsl-layerscape/ppa_entry.S new file mode 100644 index 0000000..3a3bb64 --- /dev/null +++ b/arch/arm/cpu/armv8/fsl-layerscape/ppa_entry.S @@ -0,0 +1,42 @@ +/* + * Copyright 2015 Freescale Semiconductor, Inc. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include + +ENTRY(ppa_init) + /* + * x0: PPA entry point + * x1: Boot Location Pointer Low + * x2: Boot Location Pointer High + */ + + /* Save stack pointer for EL2 */ + mov x3, sp + msr sp_el2, x3 + + /* Set boot loc pointer */ + adr x4, 1f + mov x3, x4 +#if defined(CONFIG_FSL_LSCH2) + rev w3, w3 +#endif + str w3, [x1] + lsr x3, x4, #32 +#if defined(CONFIG_FSL_LSCH2) + rev w3, w3 +#endif + str w3, [x2] + +/* Call PPA monitor */ + br x0 + +1: + mov x0, #0 + ret +ENDPROC(ppa_init) diff --git a/arch/arm/include/asm/arch-fsl-layerscape/ppa.h b/arch/arm/include/asm/arch-fsl-layerscape/ppa.h new file mode 100644 index 0000000..f0f0d10 --- /dev/null +++ b/arch/arm/include/asm/arch-fsl-layerscape/ppa.h @@ -0,0 +1,15 @@ +/* + * Copyright 2015 Freescale Semiconductor, Inc. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef __FSL_PPA_H_ +#define __FSL_PPA_H_ + +int ppa_init_pre(u64 *); +int ppa_init_entry(void *); +int ppa_init(void *, u32*, u32*); +unsigned long ppa_get_dram_block_size(void); + +#endif