From nobody Tue Dec 24 13:12:53 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1513744927419425.13283237462895; Tue, 19 Dec 2017 20:42:07 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 9EB14222447BE; Tue, 19 Dec 2017 20:37:17 -0800 (PST) Received: from NAM02-BL2-obe.outbound.protection.outlook.com (mail-bl2nam02on0062.outbound.protection.outlook.com [104.47.38.62]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 9BEA0222447B7 for ; Tue, 19 Dec 2017 20:37:15 -0800 (PST) Received: from CY1PR03CA0036.namprd03.prod.outlook.com (2603:10b6:600::46) by SN2PR03MB2367.namprd03.prod.outlook.com (2603:10b6:804:e::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.345.14; Wed, 20 Dec 2017 04:42:01 +0000 Received: from BY2FFO11FD007.protection.gbl (2a01:111:f400:7c0c::118) by CY1PR03CA0036.outlook.office365.com (2603:10b6:600::46) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.345.14 via Frontend Transport; Wed, 20 Dec 2017 04:42:01 +0000 Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11FD007.mail.protection.outlook.com (10.1.14.128) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.302.6 via Frontend Transport; Wed, 20 Dec 2017 04:41:47 +0000 Received: from uefi-OptiPlex-790.ap.freescale.net ([10.232.132.56]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id vBK4fsde019373; Tue, 19 Dec 2017 21:41:58 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.38.62; helo=nam02-bl2-obe.outbound.protection.outlook.com; envelope-from=vabhav.sharma@nxp.com; receiver=edk2-devel@lists.01.org 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; From: Vabhav To: , , , Date: Tue, 19 Dec 2017 22:10:08 +0530 Message-ID: <1513701611-19990-2-git-send-email-vabhav.sharma@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1513701611-19990-1-git-send-email-vabhav.sharma@nxp.com> References: <1513701611-19990-1-git-send-email-vabhav.sharma@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131582185079387441; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(336005)(346002)(39380400002)(39860400002)(396003)(376002)(2980300002)(1110001)(1109001)(339900001)(189003)(199004)(110136005)(5660300001)(54906003)(16586007)(316002)(2950100002)(6666003)(15188155005)(16799955002)(2906002)(104016004)(8656006)(76176011)(51416003)(498600001)(53936002)(966005)(36756003)(48376002)(47776003)(50466002)(53376002)(4326008)(8936002)(305945005)(6306002)(81166006)(85426001)(50226002)(356003)(106466001)(105606002)(77096006)(575784001)(86362001)(2201001)(8676002)(81156014)(97736004)(68736007)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:SN2PR03MB2367; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD007; 1:5hb403ALSH0SLKxe1t/DQ94j4+9AsAFbyHIsNqWeupzVNC6C2Fub1SSXK73cOYIN++I4Apvo+Hz/i83PnjPj/mCzqRJ2FrEFs33x4Z+dhehmJ9IO72OgXyV7DgAyF0ib MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: a3be4023-63f3-42cf-3531-08d54763fae4 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4628075)(201703131517081)(2017052603307); SRVR:SN2PR03MB2367; X-Microsoft-Exchange-Diagnostics: 1; SN2PR03MB2367; 3:MHaQ9Cv9u15WhPUccTzVBCjgSGaH9rgn9AtyL0c+1Uns8vK+A7gUX8BqjkgP6EZxSQyW+R7N4q5EK8RJpPZ7MSnkU92jYbQz/s/W3b5pTW+x4SK68bGhCOjGWIvXLjfsnngmkWnPmnLogHMOsuqlLDwZyQVquC3DZh3Zn/ck2bD3T5JwkgIuEj6UM/RzSJuEXgda09Wu/ugQO00OWtugX7VN9378ikA4g0Di7sinDDQkxDmN/RQw5VA0ofS56HpJRy5Gwq67myugXPyEiofHbb2v2VZEnZzI04kapM/6RL1ZX7LCy0QwOiHuew2P57fWa7NPm7Z69LwRNAu+3EJ64MZIVCRiKf9FaMivii5ZrLw=; 25:cly8mdqaVqqK3fMh+UVwvYh4y6WdQkzzcG1xBwgX3889zlfhBVq0LZITZAvMMf1pkI3bsnEBMd1z5aiUplBtYq9nwbYsYtQwAKM77VIU5ETfw4HYqbFoCVREIxn/AVNdsspSJ/3NcdJRPCWDsGDfZKoSSd5ASEnOIaTNTRYB/m6K5prCigcr5ARxb/0QhxEiJfTNPTiKhfwdPZba+r9C53eNn2Iqb0+a6jAy6vWCWG676SgYhzQr/7DEqEcr7DLVcFQbT/6pJtqD6sIdi5frnKGjt97qdUWA21jZxhEicDXhQ2JlyPwJ6x0ra9YoTluMADPs7tX/tv4sasmpkfXRmQ== X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN2PR03MB2367: X-Microsoft-Exchange-Diagnostics: 1; SN2PR03MB2367; 31:xQ1GdMaHEaH+h/99Sy7OZ35YnVgFb3rdqTmL6gvvcZ+/UGtcCcNl81CNSoMdkqMMj+WifyUO8gFByWh1pZPmMoXfVgHT8HMVNEM1qWnlQgAKlprAFob23f3etacm9KEdMVDRaR0jBo+/G0vhmhp4pLNevCTE0mhAyj3uZF3gkUvQequB+GtZKcOozfJFAWu8xGcxJzFmHejErz9h1IGu2QJAJ202mq0rEWv3cIW55u0=; 4:dCPU3rKDuhITWH0DoqkcpDfn5quGUKyZlGy0QlkR3uINP2Rs7ZinPnjTKVzwEEZo7v3sMhW/ZfYS2JIcjc0u68hGXQS8W4sn9SwjpuE334vawx9/YDReOgLIneTDOimWNjtcCbW0sxVfw54FW64P1l3Pz62PiC3YBGo6fcYuPRfKG2qDS9imb8weNwlOBc1iWW2pWto5S3++5GjAzYXhEX82k5vE1Sn5Q8dP1EGqA3hsbmuoCq9oihDzKKIu+XHaCIhfWMMKfxN5zjryMxo1ps/NdOFl+9RKdrhRnuWjU17FyUJw2OE0ESabJt3Kd9N7 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(2401047)(5005006)(8121501046)(10201501046)(3231023)(93006095)(93001095)(3002001)(6055026)(6096035)(20161123556025)(20161123559100)(201703131430075)(201703131448075)(201703131433075)(201703161259150)(201703151042153)(20161123563025)(20161123565025)(20161123561025)(201708071742011); SRVR:SN2PR03MB2367; BCL:0; PCL:0; RULEID:(100000803101)(100110400095)(400006); SRVR:SN2PR03MB2367; X-Forefront-PRVS: 0527DFA348 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN2PR03MB2367; 23:XjZmbCc36p+CK7iPu58lfg3GuTwYC5fH0jaw1OZp5?= =?us-ascii?Q?YyLV90Txo90cW90nU2CB0d2L1wPpUdQj0Jnbrp03YVcDG/XrrEsOF8W2BhvG?= =?us-ascii?Q?u5O5GbcVj6T0uZSkFJVAO5bV9JnEEm5WWAEgniwk2n1JrRxd529mKflWnYSq?= =?us-ascii?Q?armenHA/v3p8k6fTHs1/7KHpPXACY0Ls1N4rYbEfAUsF4ZV0dKPbQT5wfp64?= =?us-ascii?Q?OD1qwzyXTUgMF8gjQIB0oE9wubZv6HW4te/tFRi7Cn/mqEBC3Tt6iq1p2sVD?= =?us-ascii?Q?4DPqHGtII1W7bfKSi6CmA8ew3K294SwsnHxJHF4WH33CyHjwC0g9eT8birS2?= =?us-ascii?Q?sNEuaBhMerqMWZk4v9VJiOh8hvShepz2mD5B/V2+UIIlixP0ThzZdLEUq8Jq?= =?us-ascii?Q?w18qXs2eiX8uVCA3Mimr57sw4JOIrPrm3+cLV6h1VxUzzb2vCL5VEetogxHz?= =?us-ascii?Q?v3FS7w+e/+xMxD3ZgRNTs7qglc8l2QaMOsUnbM/DalOYyS83VVmV6dFkuJLV?= =?us-ascii?Q?TbljVziq/6yf96F8TDasfGagI3/a4vy/6kju/hvPnALp/bVIHVT1Jfd6B4Lp?= =?us-ascii?Q?jkycuEqh+xt1lMV9rAHqCmqbxahq1UWI0cQcn4nOLT7dFc6GVHrB7mltMXCs?= =?us-ascii?Q?q27IFDvp2651QsmKRFBDI3whTdiLrr2TTMJuHeD/9k11KDRETo5nJE+2nErc?= =?us-ascii?Q?vNoHFU7TtPrsLNxQA7gNbtgI9XVePI1eQTiJl45PAepc8U0XLEnmWJGJlnxp?= =?us-ascii?Q?PhNksZ3eU8jLxyar0OrxpnEvlLdhNWCaUMdiG3YYvCxm5JixejCp7XgLgwiP?= =?us-ascii?Q?SiSBqM1159A20wC10coU27g2dwuALzMOpte08b4VsHtSFHFBSlEM2gRYFBTA?= =?us-ascii?Q?AeiJiFVzLX69A2GQzNx9jUFTA8kBq8nILg03xcrD3tztc7CNkz01UmSP2XAo?= =?us-ascii?Q?lDoWyyMEwgHRiEgIYL1oAIa64D61JN2OGiN9AaRhjE8IPU58mYmLwzdERrKN?= =?us-ascii?Q?xhg7gsf6SLOCkZmS0jZq8FOpEmZD5uOzpdwMKbKscCTT5wGCTHVf/V0qsGku?= =?us-ascii?Q?Yx20+eTHYvfgRAe7vP1LfNFz9kQHrEi5/xnYLetQIWyfcJ+Z27KRN9J0xl0S?= =?us-ascii?Q?TYIOK2qL2myYZddcx57Vf8v3q8GdqnVaHlRepYIYfSn3z7sq+3NfJHs5uO7k?= =?us-ascii?Q?CeCl3KFF3zXanucLpDLO1gEMWFosA9dibNBJdRSKWYSzZT35hNGHGtVbg5IK?= =?us-ascii?Q?qqrrvNscVGMtOIEzrk=3D?= X-Microsoft-Exchange-Diagnostics: 1; SN2PR03MB2367; 6:annC8qdfQOZFTzYlP2rq2ws5pn9ORjo1vcfsnEQ7E63h54lU8Rwgkjr/xHtAh/NMWNHu+fUrRL4lwHdS4iHxg0dcJ/0RjF/kWMaMTy8jeClAFW8BmslpBt+J3CSSgNcTvD9rrgsPu1hgfaiaQkhb6dmLrJKEnBp6XjVmzJMJfSSw4Um++dhuO9IvhGLHoXhbdrmOREsshJV30saNwDUlMAhtWOA20IK+q8DJplPDe5KlDjxtEl4WbS0YD4LszwF3rGg2Bq75H3gAQLA/8fch+r96+BiG8cBKaLCDLuElHFxtkGnO9S75EaU0cMLDswLwvtrsR7WipCYXiGNAzZ6Hlw==; 5:FYeI83drRW9HSHPze+Tut+fAsBcWPmHxFiRlZwLV1nV3YYI+iUg24OBl+4ptDfEzcQeheDO9xKliCZif0vB26vpUp2hcQVNa1pu9PgOVBqhqmtLMaIrMkv0pPQkJMD3peiHpeDrjMFNTg353VJIW6L7ujo1xSlpc+yyurreW+mQ=; 24:Gj8wj6rPOQGdhYeIegZQnUFdLUlt6oDzQCKq8tnIJ5HYPIZvaHsu2yvvgnuV9WBU8TGowkzldLJPViF/63hMtutuSOkzVRmMrzzu6cyO7hI=; 7:BJpq8w2RL4249h4L7JT9Nj9Ip9QvrOcpGoEGgDJ+tZi7hAbAn24KtDVvxVJZ/3EGUmmfNzSgXMmq8utbvvPVNIbeSF3aUtsugJk6p9R9Fdy5M4h/eTIWo4V1tMNNEKFv7Tvx3hVBbaDlJgJCryl8pZUwfgFuJhsBlJlsz8t4zYocazyqeOzRcNgUQtNSAZvo5FSucGaWeu0rTe6HBvdpiTi4kaYv3OltfYl9H4XlRiW2kI+gTKO5R93+O2qAu3VQ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Dec 2017 04:41:47.7515 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a3be4023-63f3-42cf-3531-08d54763fae4 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: SN2PR03MB2367 Subject: [edk2] [PATCH edk2-platforms v2 1/4] Platform/NXP : Add Integrated flash controller library support X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" On NXP Layerscape SoCs,NOR Flash device interfacing is via IFC and IfcFlashLib provides helper functions to be used by NXP NOR flash library Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Vabhav --- Platform/NXP/Include/Library/Ifc.h | 147 +++++++++++++++++= ++++ Platform/NXP/Include/Library/IfcBase.h | 139 +++++++++++++++++= ++ .../Include/Library/IfcBoardSpecificLib.h | 50 +++++++ Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc | 2 + Platform/NXP/Library/IfcFlashLib/IfcFlashLib.c | 70 ++++++++++ Platform/NXP/Library/IfcFlashLib/IfcFlashLib.inf | 33 +++++ Platform/NXP/NxpQoriqLs.dec | 1 + 7 files changed, 442 insertions(+) create mode 100755 Platform/NXP/Include/Library/Ifc.h create mode 100644 Platform/NXP/Include/Library/IfcBase.h create mode 100755 Platform/NXP/LS1043aRdbPkg/Include/Library/IfcBoardSpec= ificLib.h create mode 100644 Platform/NXP/Library/IfcFlashLib/IfcFlashLib.c create mode 100644 Platform/NXP/Library/IfcFlashLib/IfcFlashLib.inf diff --git a/Platform/NXP/Include/Library/Ifc.h b/Platform/NXP/Include/Libr= ary/Ifc.h new file mode 100755 index 0000000..dd36fd8 --- /dev/null +++ b/Platform/NXP/Include/Library/Ifc.h @@ -0,0 +1,147 @@ +/** @Ifc.h + + Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
+ Copyright 2017 NXP + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#ifndef __IFC_H__ +#define __IFC_H__ + +#include +#include +#include +#include +#include +#include +#include + +#define IFC_BANK_COUNT 4 + +#define IFC_CSPR_REG_LEN 148 +#define IFC_AMASK_REG_LEN 144 +#define IFC_CSOR_REG_LEN 144 +#define IFC_FTIM_REG_LEN 576 + +#define IFC_CSPR_USED_LEN sizeof (IFC_CSPR) * \ + IFC_BANK_COUNT + +#define IFC_AMASK_USED_LEN sizeof (IFC_AMASK) * \ + IFC_BANK_COUNT + +#define IFC_CSOR_USED_LEN sizeof (IFC_CSOR) * \ + IFC_BANK_COUNT + +#define IFC_FTIM_USED_LEN sizeof (IFC_FTIM) * \ + IFC_BANK_COUNT + +typedef enum { + IFC_CS0 =3D 0, + IFC_CS1, + IFC_CS2, + IFC_CS3, + IFC_CS4, + IFC_CS5, + IFC_CS6, + IFC_CS7, +} IFC_CHIP_SEL; + +typedef enum { + IFC_FTIM0 =3D 0, + IFC_FTIM1, + IFC_FTIM2, + IFC_FTIM3, +} IFC_FTIMS; + +typedef struct { + UINT32 CsprExt; + UINT32 Cspr; + UINT32 Res; +} IFC_CSPR; + +typedef struct { + UINT32 Amask; + UINT32 Res[0x2]; +} IFC_AMASK; + +typedef struct { + UINT32 Csor; + UINT32 CsorExt; + UINT32 Res; +} IFC_CSOR; + +typedef struct { + UINT32 Ftim[4]; + UINT32 Res[0x8]; +}IFC_FTIM ; + +/* + * IFC controller NOR Machine registers + */ +typedef struct { + UINT32 NorEvterStat; + UINT32 Res1[0x2]; + UINT32 NorEvterEn; + UINT32 Res2[0x2]; + UINT32 NorEvterIntrEn; + UINT32 Res3[0x2]; + UINT32 NorErattr0; + UINT32 NorErattr1; + UINT32 NorErattr2; + UINT32 Res4[0x4]; + UINT32 NorCr; + UINT32 Res5[0xEF]; +} IFC_NOR; + +/* + * IFC Controller Registers + */ +typedef struct { + UINT32 IfcRev; + UINT32 Res1[0x2]; + IFC_CSPR CsprCs[IFC_BANK_COUNT]; + UINT8 Res2[IFC_CSPR_REG_LEN - IFC_CSPR_USED_LEN]; + IFC_AMASK AmaskCs[IFC_BANK_COUNT]; + UINT8 Res3[IFC_AMASK_REG_LEN - IFC_AMASK_USED_LEN]; + IFC_CSOR CsorCs[IFC_BANK_COUNT]; + UINT8 Res4[IFC_CSOR_REG_LEN - IFC_CSOR_USED_LEN]; + IFC_FTIM FtimCs[IFC_BANK_COUNT]; + UINT8 Res5[IFC_FTIM_REG_LEN - IFC_FTIM_USED_LEN]; + UINT32 RbStat; + UINT32 RbMap; + UINT32 WpMap; + UINT32 IfcGcr; + UINT32 Res7[0x2]; + UINT32 CmEvter_stat; + UINT32 Res8[0x2]; + UINT32 CmEvterEn; + UINT32 Res9[0x2]; + UINT32 CmEvterIntrEn; + UINT32 Res10[0x2]; + UINT32 CmErattr0; + UINT32 CmErattr1; + UINT32 Res11[0x2]; + UINT32 IfcCcr; + UINT32 IfcCsr; + UINT32 DdrCcrLow; + UINT32 Res12[0x2EA]; + IFC_NOR IfcNor; +} IFC_REGS; + +typedef struct { + UINT32 Ftim[IFC_BANK_COUNT]; + UINT32 CsprExt; + UINT32 Cspr; + UINT32 Csor; + UINT32 Amask; +} IfcTimings; + +#endif //__IFC_H__ diff --git a/Platform/NXP/Include/Library/IfcBase.h b/Platform/NXP/Include/= Library/IfcBase.h new file mode 100644 index 0000000..7020a29 --- /dev/null +++ b/Platform/NXP/Include/Library/IfcBase.h @@ -0,0 +1,139 @@ +/** @IfcLib.h + + Copyright 2017 NXP + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#ifndef __IFC_COMMON_H__ +#define __IFC_COMMON_H__ + +#define NOR_FLASH_DEVICE_COUNT 1 + +#define MAX_RETRY_COUNT 150000 + +/* + * CSPR - Chip Select Property Register + */ + +#define IFC_CSPR_BA 0xFFFF0000 +#define IFC_CSPR_BA_SHIFT 16 +#define IFC_CSPR_PORT_SIZE 0x00000180 +#define IFC_CSPR_PORT_SIZE_SHIFT 7 + +// Port Size 8 bit +#define IFC_CSPR_PORT_SIZE_8 0x00000080 + +// Port Size 16 bit +#define IFC_CSPR_PORT_SIZE_16 0x00000100 + +// Port Size 32 bit +#define IFC_CSPR_PORT_SIZE_32 0x00000180 + +// Write Protect +#define IFC_CSPR_WP 0x00000040 +#define IFC_CSPR_WP_SHIFT 6 + +// Machine Select +#define IFC_CSPR_MSEL 0x00000006 +#define IFC_CSPR_MSEL_SHIFT 1 + +// NOR +#define IFC_CSPR_MSEL_NOR 0x00000000 + +// Bank Valid +#define IFC_CSPR_V 0x00000001 +#define IFC_CSPR_V_SHIFT 0 + +/* + * Chip Select Option Register - NOR Flash Mode + */ + +// Enable Address shift Mode +#define IFC_CSOR_NOR_ADM_SHFT_MODE_EN 0x80000000 + +// Page Read Enable from NOR device +#define IFC_CSOR_NOR_PGRD_EN 0x10000000 + +// AVD Toggle Enable during Burst Program +#define IFC_CSOR_NOR_AVD_TGL_PGM_EN 0x01000000 + +// Address Data Multiplexing Shift +#define IFC_CSOR_NOR_ADM_MASK 0x0003E000 +#define IFC_CSOR_NOR_ADM_SHIFT_SHIFT 13 +#define IFC_CSOR_NOR_ADM_SHIFT(n) ((n) << IFC_CSOR_NOR_ADM_SHIFT_SHIFT) + +// Type of the NOR device hooked +#define IFC_CSOR_NOR_NOR_MODE_AYSNC_NOR 0x00000000 +#define IFC_CSOR_NOR_NOR_MODE_AVD_NOR 0x00000020 + +// Time for Read Enable High to Output High Impedance +#define IFC_CSOR_NOR_TRHZ_MASK 0x0000001C +#define IFC_CSOR_NOR_TRHZ_SHIFT 2 +#define IFC_CSOR_NOR_TRHZ_20 0x00000000 +#define IFC_CSOR_NOR_TRHZ_40 0x00000004 +#define IFC_CSOR_NOR_TRHZ_60 0x00000008 +#define IFC_CSOR_NOR_TRHZ_80 0x0000000C +#define IFC_CSOR_NOR_TRHZ_100 0x00000010 + +// Buffer control disable +#define IFC_CSOR_NOR_BCTLD 0x00000001 + +/* + * FTIM0 - NOR Flash Mode + */ +#define IFC_FTIM0_NOR 0xF03F3F3F +#define IFC_FTIM0_NOR_TACSE_SHIFT 28 +#define IFC_FTIM0_NOR_TACSE(n) ((n) << IFC_FTIM0_NOR_TACSE_SHIFT) +#define IFC_FTIM0_NOR_TEADC_SHIFT 16 +#define IFC_FTIM0_NOR_TEADC(n) ((n) << IFC_FTIM0_NOR_TEADC_SHIFT) +#define IFC_FTIM0_NOR_TAVDS_SHIFT 8 +#define IFC_FTIM0_NOR_TAVDS(n) ((n) << IFC_FTIM0_NOR_TAVDS_SHIFT) +#define IFC_FTIM0_NOR_TEAHC_SHIFT 0 +#define IFC_FTIM0_NOR_TEAHC(n) ((n) << IFC_FTIM0_NOR_TEAHC_SHIFT) + +/* + * FTIM1 - NOR Flash Mode + */ +#define IFC_FTIM1_NOR 0xFF003F3F +#define IFC_FTIM1_NOR_TACO_SHIFT 24 +#define IFC_FTIM1_NOR_TACO(n) ((n) << IFC_FTIM1_NOR_TACO_SHIFT) +#define IFC_FTIM1_NOR_TRAD_NOR_SHIFT 8 +#define IFC_FTIM1_NOR_TRAD_NOR(n) ((n) << IFC_FTIM1_NOR_TRAD_NOR_SHI= FT) +#define IFC_FTIM1_NOR_TSEQRAD_NOR_SHIFT 0 +#define IFC_FTIM1_NOR_TSEQRAD_NOR(n) ((n) << IFC_FTIM1_NOR_TSEQRAD_NOR_= SHIFT) + +/* + * FTIM2 - NOR Flash Mode + */ +#define IFC_FTIM2_NOR 0x0F3CFCFF +#define IFC_FTIM2_NOR_TCS_SHIFT 24 +#define IFC_FTIM2_NOR_TCS(n) ((n) << IFC_FTIM2_NOR_TCS_SHIFT) +#define IFC_FTIM2_NOR_TCH_SHIFT 18 +#define IFC_FTIM2_NOR_TCH(n) ((n) << IFC_FTIM2_NOR_TCH_SHIFT) +#define IFC_FTIM2_NOR_TWPH_SHIFT 10 +#define IFC_FTIM2_NOR_TWPH(n) ((n) << IFC_FTIM2_NOR_TWPH_SHIFT) +#define IFC_FTIM2_NOR_TWP_SHIFT 0 +#define IFC_FTIM2_NOR_TWP(n) ((n) << IFC_FTIM2_NOR_TWP_SHIFT) + +/* Convert an address into the right format for the CSPR Registers */ +#define IFC_CSPR_PHYS_ADDR(x) (((UINTN)x) & 0xffff0000) + +/* + * Address Mask Register + */ +#define IFC_AMASK_MASK 0xFFFF0000 +#define IFC_AMASK_SHIFT 16 +#define IFC_AMASK(n) (IFC_AMASK_MASK << \ + (HighBitSet32(n) - IFC_AMASK_SHIFT)) + +VOID IfcNorInit(VOID); + +#endif //__IFC_COMMON_H__ diff --git a/Platform/NXP/LS1043aRdbPkg/Include/Library/IfcBoardSpecificLib= .h b/Platform/NXP/LS1043aRdbPkg/Include/Library/IfcBoardSpecificLib.h new file mode 100755 index 0000000..aaef340 --- /dev/null +++ b/Platform/NXP/LS1043aRdbPkg/Include/Library/IfcBoardSpecificLib.h @@ -0,0 +1,50 @@ +/** IfcBoardSpecificLib.h + IFC Flash Board Specific library + + Copyright 2017 NXP + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may be= found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ +#ifndef __IFC__BOARD_SPECIFIC_LIB_H__ +#define __IFC__BOARD_SPECIFIC_LIB_H__ + +// On board flash support,endianness +#define NOR_SUPPORT +#define IFC_REG_BASE 0x1530000 +#define IFC_NOR_BUF_BASE 0x60000000 + +// On board Inegrated flash Controller chip select configuration +#define IFC_NOR_CS IFC_CS0 + +// board-specific NOR flash timing +#define NOR_FTIM0 (IFC_FTIM0_NOR_TACSE(0x1) | \ + IFC_FTIM0_NOR_TEADC(0x1) | \ + IFC_FTIM0_NOR_TAVDS(0x0) | \ + IFC_FTIM0_NOR_TEAHC(0xc)) +#define NOR_FTIM1 (IFC_FTIM1_NOR_TACO(0x1c) | \ + IFC_FTIM1_NOR_TRAD_NOR(0xb) |\ + IFC_FTIM1_NOR_TSEQRAD_NOR(0x9)) +#define NOR_FTIM2 (IFC_FTIM2_NOR_TCS(0x1) | \ + IFC_FTIM2_NOR_TCH(0x4) | \ + IFC_FTIM2_NOR_TWPH(0x8) | \ + IFC_FTIM2_NOR_TWP(0x10)) +#define NOR_FTIM3 0x0 + +#define NOR_CSPR (IFC_CSPR_PHYS_ADDR(IFC_NOR_BUF_BASE) \ + | IFC_CSPR_PORT_SIZE_16 \ + | IFC_CSPR_MSEL_NOR \ + | IFC_CSPR_V) + +#define NOR_CSPR_EXT 0x0 +#define NOR_AMASK IFC_AMASK(128*1024*1024) +#define NOR_CSOR (IFC_CSOR_NOR_ADM_SHIFT(4) | \ + IFC_CSOR_NOR_TRHZ_80) + +#endif //__IFC__BOARD_SPECIFIC_LIB_H__ diff --git a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc b/Platform/NXP/LS= 1043aRdbPkg/LS1043aRdbPkg.dsc index 1951e82..7a72338 100644 --- a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc +++ b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc @@ -47,12 +47,14 @@ # gNxpQoriqLsTokenSpaceGuid.PcdSerdes2Enabled|FALSE gNxpQoriqLsTokenSpaceGuid.PcdPlatformFreqDiv|0x1 + gNxpQoriqLsTokenSpaceGuid.PcdIfcNorEnabled|1 =20 # # Big Endian IPs # gNxpQoriqLsTokenSpaceGuid.PcdGurBigEndian|TRUE gNxpQoriqLsTokenSpaceGuid.PcdWdogBigEndian|TRUE + gNxpQoriqLsTokenSpaceGuid.PcdIfcBigEndian|TRUE =20 # # I2C controller Pcds diff --git a/Platform/NXP/Library/IfcFlashLib/IfcFlashLib.c b/Platform/NXP/= Library/IfcFlashLib/IfcFlashLib.c new file mode 100644 index 0000000..c9e8bc4 --- /dev/null +++ b/Platform/NXP/Library/IfcFlashLib/IfcFlashLib.c @@ -0,0 +1,70 @@ +/** @IfcFlashLib.c + + Copyright 2017 NXP + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#include +#include +// Include board specific file for Flash timing +#include + +#ifdef NOR_SUPPORT +VOID +GetIfcNorFlashInfo ( + IN NorFlashInfo *NorFlashInfo + ) +{ + NorFlashInfo->IfcRegs =3D (IFC_REGS*) IFC_REG_BASE; + NorFlashInfo->ChipSelect =3D IFC_NOR_CS; + return ; +} + +VOID +GetIfcNorFlashTimings ( + IN IfcTimings * NorIfcTimings + ) +{ + NorIfcTimings->Ftim[0] =3D NOR_FTIM0; + NorIfcTimings->Ftim[1] =3D NOR_FTIM1; + NorIfcTimings->Ftim[2] =3D NOR_FTIM2; + NorIfcTimings->Ftim[3] =3D NOR_FTIM3; + NorIfcTimings->Cspr =3D NOR_CSPR; + NorIfcTimings->CsprExt =3D NOR_CSPR_EXT; + NorIfcTimings->Amask =3D NOR_AMASK; + NorIfcTimings->Csor =3D NOR_CSOR; + return ; +} + +VOID IfcNorWrite32 (VOID *a, UINT32 v) { + + if (FixedPcdGetBool (PcdIfcBigEndian)) { + BeMmioWrite32 ((UINTN)a, v); + } else { + MmioWrite32 ((UINTN)a, v); + } + +} + +FLASH_DATA +IfcNorFlashData ( + FLASH_DATA Value + ) +{ + + if (FixedPcdGetBool (PcdIfcBigEndian)) { + return SwapBytes16 (Value); + } else { + return Value; + } + +} +#endif //NOR_SUPPORT diff --git a/Platform/NXP/Library/IfcFlashLib/IfcFlashLib.inf b/Platform/NX= P/Library/IfcFlashLib/IfcFlashLib.inf new file mode 100644 index 0000000..8447c7f --- /dev/null +++ b/Platform/NXP/Library/IfcFlashLib/IfcFlashLib.inf @@ -0,0 +1,33 @@ +#/** IfcFlashLib.inf +# +# Component description file for IFC FLASH Library +# +# Copyright 2017 NXP +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the B= SD License +# which accompanies this distribution. The full text of the license may = be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IM= PLIED. +# +#**/ + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D IfcFlashLib + FILE_GUID =3D 8ecefc8f-a2c4-4091-b80f-92da7c4ab37f + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D IfcFlashLib + +[Sources.common] + IfcFlashLib.c + +[Packages] + MdePkg/MdePkg.dec + Platform/NXP/NxpQoriqLs.dec + +[Pcd] + gNxpQoriqLsTokenSpaceGuid.PcdIfcBigEndian diff --git a/Platform/NXP/NxpQoriqLs.dec b/Platform/NXP/NxpQoriqLs.dec index fd07eee..e773bcd 100644 --- a/Platform/NXP/NxpQoriqLs.dec +++ b/Platform/NXP/NxpQoriqLs.dec @@ -240,6 +240,7 @@ gNxpQoriqLsTokenSpaceGuid.PcdGurBigEndian|FALSE|BOOLEAN|0x0000311 gNxpQoriqLsTokenSpaceGuid.PcdPciLutBigEndian|FALSE|BOOLEAN|0x00000312 gNxpQoriqLsTokenSpaceGuid.PcdWdogBigEndian|FALSE|BOOLEAN|0x00000313 + gNxpQoriqLsTokenSpaceGuid.PcdIfcBigEndian|FALSE|BOOLEAN|0x00000314 =20 # # System ID Eeprom Pcds --=20 1.9.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Tue Dec 24 13:12:53 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1513744931040441.9018199460969; Tue, 19 Dec 2017 20:42:11 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 0B58A222447C2; Tue, 19 Dec 2017 20:37:20 -0800 (PST) Received: from NAM03-BY2-obe.outbound.protection.outlook.com (mail-by2nam03on0064.outbound.protection.outlook.com [104.47.42.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 64D34222447B7 for ; Tue, 19 Dec 2017 20:37:18 -0800 (PST) Received: from CY4PR03CA0094.namprd03.prod.outlook.com (2603:10b6:910:4d::35) by SN2PR03MB2368.namprd03.prod.outlook.com (2603:10b6:804:e::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.345.14; Wed, 20 Dec 2017 04:42:03 +0000 Received: from BY2FFO11OLC006.protection.gbl (2a01:111:f400:7c0c::133) by CY4PR03CA0094.outlook.office365.com (2603:10b6:910:4d::35) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.323.15 via Frontend Transport; Wed, 20 Dec 2017 04:42:03 +0000 Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11OLC006.mail.protection.outlook.com (10.1.14.199) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.302.6 via Frontend Transport; Wed, 20 Dec 2017 04:41:50 +0000 Received: from uefi-OptiPlex-790.ap.freescale.net ([10.232.132.56]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id vBK4fsdf019373; Tue, 19 Dec 2017 21:42:00 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.42.64; helo=nam03-by2-obe.outbound.protection.outlook.com; envelope-from=vabhav.sharma@nxp.com; receiver=edk2-devel@lists.01.org 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; From: Vabhav To: , , , Date: Tue, 19 Dec 2017 22:10:09 +0530 Message-ID: <1513701611-19990-3-git-send-email-vabhav.sharma@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1513701611-19990-1-git-send-email-vabhav.sharma@nxp.com> References: <1513701611-19990-1-git-send-email-vabhav.sharma@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131582185109990265; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(336005)(7966004)(396003)(39380400002)(39860400002)(376002)(346002)(2980300002)(1110001)(1109001)(339900001)(189003)(199004)(8656006)(51416003)(53376002)(6306002)(76176011)(86362001)(575784001)(2950100002)(77096006)(4326008)(2201001)(50226002)(48376002)(8936002)(81166006)(50466002)(8676002)(81156014)(356003)(305945005)(47776003)(68736007)(15188155005)(5660300001)(53936002)(16799955002)(53946003)(498600001)(966005)(104016004)(2906002)(105606002)(106466001)(316002)(85426001)(54906003)(110136005)(16586007)(97736004)(59450400001)(36756003)(579004)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:SN2PR03MB2368; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11OLC006; 1:+V7wxxMCManXSr90ksN6Zg27bxvWVpgr9+D7752KUetIu9EYu7WbLCwtWXuzdi10MMdcFMAde/50sMdeispG6Vs9SDCR63P6VLNLWsb2Fdtwn7kTqaq0CD4wo58IyUoa MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 16783b04-d699-419d-2b79-08d54763fcb7 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(4534020)(4628075)(201703131517081)(5600026)(4604075)(2017052603307); SRVR:SN2PR03MB2368; X-Microsoft-Exchange-Diagnostics: 1; SN2PR03MB2368; 3:HB264C7Gs+UXwXtdvGhxcYOMMLRBtLHCPAmoYDLSiy5SqsqzAYiOrFBomfPZ4t17I+Vp8u/+pJO9HGzHwS3WSiyLTh1IL6zr79pCrAN/i2t1YzvzXDNX8SBp54DwVDh8V0Hr8U6WxwasC4ZCQDB/rJu88bB3Z8yTjaEbuRyXTRwqTO5FhrI8QKwfACepxpD6fieKzpcohnIrVaHqGSf8nK/lv1vAO8IZy3fFg7QYSKKaAMf5VBeH+GVw0uox3LHk4t6QlkIzffGSyqeuSfBBbLdjizrL5BHIeLVXRG7DfyBwCcco9cogoq+qD9fD6+iSYFDvsD7SQahI7iv7DyLM6K7XTrtQTLHuYGkzbVoePmk=; 25:i77z6kAQeWh6m+ZoKAefyIEyDAhKdMYpnAFJ887RQeL4uEkFom2B4XEoY/EbLNk+jZVeWNOOkAbuBT2d8AKB1m2bOwAZd8Dm7Ecraf8VWNg4Efhe0zgMqCeer/rRIqnBVaJ60/4R6LzsZlGnDTfWmAA4ln0oq3/sdZjGGRB9j0B82AiLuiASpeWRnGza2w+tUEY1n+vkaBWnzWJTBAwjzhjjJbEd14oFRSJZKUnVJ/eyU35cnR8mtuRSzT2xFDlETTA9DtdYWTXQZ1paRL/YbuHY8ZV8qPjlKuElZT+MMNn8egCR2GgIPr4PHQOZ/86dbbvgjzq8pROifAuhULfZyg== X-MS-TrafficTypeDiagnostic: SN2PR03MB2368: X-Microsoft-Exchange-Diagnostics: 1; SN2PR03MB2368; 31:2T38CHheV9+XMwaZtwu2HwixOFwHINFCq2Fv54fSku/Sj0EtvcY21ynCw8Gun5eDpU7wO2rTeJeVgZeRGlopR2309xtrNpFPiZ9+yeTuGAkLSnBfDmaXPVxWWk+Z57GxeeIURzjZ2GdDa7wKZ898HPCMssFnfEZIBgjmdz4Gzk6OSE7bTVayBxSH/Zy460ZcJHQaCBb08q38yIcHqQMG/M6TCS+3gKIaf/keZJZKDiU=; 4:8nmov74uOSD4gCcHJzldBjhh8zdJyW8kXS16DX9N5I0H6V19rMHeb3YGPW789jCIm46Uw4ZgPn+82AuSRA6lC37m3uvhsfUTBGmctFI5aB3YiobYWYgfUqRqnEdi2jSa47TlxQ4dl+nRKgAIT9Lx7cI7DSi60nmeJOaLBmTpDv+wDQCrRv7iFfSpcqOQqpSXhR7+EVxEUxw0HgYMdbqJDUBn4IYT9XIANtjnBnf8e5TK7g8Nmn4yY3dF/d91qlbXDgCO/2TP0V4ddNXLSlB5KEqH7ajAGrMOxbW+MiDXcYCa8DHfM+x6RZvY/k2Rklth X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(2401047)(8121501046)(5005006)(3002001)(93006095)(93001095)(10201501046)(3231023)(6055026)(6096035)(20161123561025)(20161123565025)(20161123556025)(20161123563025)(20161123559100)(201703131430075)(201703131441075)(201703131448075)(201703131433075)(201703161259150)(201708071742011); SRVR:SN2PR03MB2368; BCL:0; PCL:0; RULEID:(100000803101)(100110400095)(400006); SRVR:SN2PR03MB2368; X-Forefront-PRVS: 0527DFA348 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN2PR03MB2368; 23:/MQJwjSgX1nTfHHn2epLGrVS5u14VD78hTHmg2XZp?= =?us-ascii?Q?cr2BHiKDjHE25UOg7fWP+DUlBNCi1wDiE/E6/nlDO6QuefZk+Mo7BzWiqa/x?= =?us-ascii?Q?OTQIArbBMvk3yJNgP62ydBzXG4c2Y7pWjh7FDpUUMbVi32AG4GmHxf3uvfMw?= =?us-ascii?Q?3cn547zoif4xMsJQ6j5vYQNE8ffwnqv7VGJJWhLLQrsdeAW0oJ65HBCJVNGd?= =?us-ascii?Q?X9G1tHLldNN4SQMFKO7YjK3ohzWqUgUfC34pGBPZ4T7FRF1aEy8gG0lr4KG+?= =?us-ascii?Q?fK8mhdVu577PWD4PUabmGekG4bDsg0QXaje08J5yeG9Sqntm2/nIN7UM6yXg?= =?us-ascii?Q?jG10sOmlHQPXtgMPf8y71WrJel/dt2BIyb+t5h/jgqVesvDNf9BA9ECXCh7+?= =?us-ascii?Q?Go/+l3sh1wvllfJtki6Sq+OR7puLmGuzJVjWjmZyh6uugo6MCImBqtYEybxB?= =?us-ascii?Q?XtUCCGTjtX66ATY82BRXMhNEOJ23bp4h0Xy74VzNp/PsTCzuprvSu5kOcdfz?= =?us-ascii?Q?hz5+xpo253cA0cLuJWrIbiJeoJ1wKFH9wMoBOSW/CVxZ590cAZWkwonPaALL?= =?us-ascii?Q?dVIPV27Q4I/P+YXKK8amGLEFNSTWCjzbrYgXbpJLjFgGZkH5wkY0pHBV9mfp?= =?us-ascii?Q?e3Zh7zzCOlFoCSI6bdCWOByUvCV2N358UY/YthERIRX2Q18akHVX9pejjcjp?= =?us-ascii?Q?0nMm6NFi7pI1fLPwuAIK57Q0TrXBzwOSAYQ7MLYftLQelNKuRZMvlAoszewd?= =?us-ascii?Q?cslDYdsZdHlrR914Qve0b8f/MIwSWYRxfLtpC0XZP0B+ymrx3wIHFXwHv0y3?= =?us-ascii?Q?6rUpu1u5ypVUi7Ry+z50vYVjiF9dhiMdt7jsPifpF+4yAFNW8C1B2WOR2I72?= =?us-ascii?Q?K5kSdZBw/VGANskw00I9BeDfK+o2DRFgwXGR3+HeIJEpCM+b2uas0qwlMacj?= =?us-ascii?Q?gRX0Lj8Ugcb7oFRU1Z0txcr+cKtTGG00GJ08VudgING6MFvQ35CWPsY+J4t7?= =?us-ascii?Q?5me8VzuROvpPjOEtvxJagZxZnBfi+h8uKY7wNBxcnkZOez3caKMOAdB3z8uu?= =?us-ascii?Q?LemgdwxW6vgDT4zZ0L1KAD29gWvflSP544jI5D7q3E7GQAQT0Igpf9G33tfS?= =?us-ascii?Q?dNZ1GaDImuNgcDu7PDTLqMa1Cpe75p9E6dRT78gFyFwnnHW74JwNSCUSRT3Z?= =?us-ascii?Q?9rCKv1Hi1drum/Aj0g428Hz1w/XYnqQq7LgALFsQR4dN19OG69POHm/8193t?= =?us-ascii?Q?0NcZy5/rYV3J2KfediBdIA7Tvx3oSMZ5z2mBbthdPLbQDIlnu1D+IAVOQosj?= =?us-ascii?Q?Xy+7GvEZzQ5Y/3WIjiX9xs=3D?= X-Microsoft-Exchange-Diagnostics: 1; SN2PR03MB2368; 6:ZQP0O3VjHjm5pQYe0b2IfOfNAqGK7cNuziBQd2+cjD2/8eTxXQuKMHJ5PxGknk2ZS9AVAJSEKx1Y28pWwbOsY7x/7x2e+rGEHwZylSBM9VuLMc62sSrRsFlixyzsuaVb766E5ndKe42svvPVUHEUYTmdIzBGaWOcMThnycC9dqKsDJFy/XNQ2b8f3m4mHgmZiDW+3GvgYUgRbEF5lk1ZxHsgHGqYtBNXGx3IYbauu575nwO3jE7u1PBwnP2UhujZ0Ry0NV/ew5+3mVIN7eA2lBSf+Q0yUgqjoct2TD0uGp9AYaXYKCe8R2AVn5Y4oSWfOvK5G6l7bmFz4/jgnt4wSB7nlDWC5eMO/D7ZfoVtIho=; 5:ujtppd7q0+9oyG5sbLUsfSRXabjjhFVWxcgB1SCNes4CCFbTEvsApCB97w4eecjigGXO0Ida2Fg11snfsiDO1FrHZXwNpyWjcLJgkri+c9B4zPMFJlHYABom0UTuIlBnWySlrezT1Du+g8jHqRSIAvs4X7ks3ZGYz9F5ypEQxJw=; 24:kIDic3/MMzyPHuiHBIF6TAxsoswuLkezMBrPCrCmNb1L38xw1iInDiMLpMQNQ+RCrdLZhstcqdcJg8kFLDeww7cn1BSWWv7sOKdFGL4R0CU=; 7:XUavr6vW0e8MB3Q7lQ5pI5EieyHeJ8ugIE+4ohx3iexWw4DwmP5HS66j9E/S2YMZZEdJol0KVpLdaXbsxI8lNIJksKZItR7VG1NaMgM7M9WgCiRUwelF0yG5NJyGlRxTHBI6sx+UBWb+igHdxGUSvHTjhjYI8/dJUCFX9Am1lcIhYZjqqgi0RVmgjlHR4Qfi2dlGwlPtqVCQbICJkxR/ey9SolddD9k4S4ntTjAZvV+6M4EshqUljaBtGGzlxBm4 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Dec 2017 04:41:50.7962 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 16783b04-d699-419d-2b79-08d54763fcb7 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: SN2PR03MB2368 Subject: [edk2] [PATCH edk2-platforms v2 2/4] Platform/NXP : Add Support for NOR flash Library X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Adding support for NOR flash library(NorFlashLib) to provide functions which will be used by NOR flash Driver. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Vabhav --- Platform/NXP/Include/Library/NorFlashLib.h | 67 +++ Platform/NXP/Library/NorFlashLib/CfiCommand.h | 99 ++++ Platform/NXP/Library/NorFlashLib/CfiNorFlashLib.c | 184 ++++++ Platform/NXP/Library/NorFlashLib/CfiNorFlashLib.h | 54 ++ Platform/NXP/Library/NorFlashLib/IfcNorFlashLib.c | 52 ++ Platform/NXP/Library/NorFlashLib/NorFlashLib.c | 658 ++++++++++++++++++= ++++ Platform/NXP/Library/NorFlashLib/NorFlashLib.inf | 42 ++ 7 files changed, 1156 insertions(+) create mode 100644 Platform/NXP/Include/Library/NorFlashLib.h create mode 100644 Platform/NXP/Library/NorFlashLib/CfiCommand.h create mode 100644 Platform/NXP/Library/NorFlashLib/CfiNorFlashLib.c create mode 100644 Platform/NXP/Library/NorFlashLib/CfiNorFlashLib.h create mode 100644 Platform/NXP/Library/NorFlashLib/IfcNorFlashLib.c create mode 100644 Platform/NXP/Library/NorFlashLib/NorFlashLib.c create mode 100644 Platform/NXP/Library/NorFlashLib/NorFlashLib.inf diff --git a/Platform/NXP/Include/Library/NorFlashLib.h b/Platform/NXP/Incl= ude/Library/NorFlashLib.h new file mode 100644 index 0000000..8eb0f82 --- /dev/null +++ b/Platform/NXP/Include/Library/NorFlashLib.h @@ -0,0 +1,67 @@ +/** @file + + Copyright (c) 2011-2012, ARM Ltd. All rights reserved. + Copyright (c) 2016, Freescale Semiconductor. All rights reserved. + Copyright 2017 NXP + +This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD= License + which accompanies this distribution. The full text of the license may be= found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPL= IED. + + **/ + +#ifndef _NOR_FLASH_LIB_H_ +#define _NOR_FLASH_LIB_H_ + +#include + +typedef struct { + UINTN DeviceBaseAddress; // Start address of the Device Base Address (= DBA) + UINTN RegionBaseAddress; // Start address of one single region + UINTN Size; + UINTN BlockSize; + UINTN MultiByteWordCount; // Maximum Word count that can be written to = Nor Flash in multi byte write + UINTN WordWriteTimeOut; // single byte/word timeout usec + UINTN BufferWriteTimeOut; // buffer write timeout usec + UINTN BlockEraseTimeOut; // block erase timeout usec + UINTN ChipEraseTimeOut; // chip erase timeout usec +} NorFlashDescription; + +EFI_STATUS +NorFlashPlatformGetDevices ( + OUT NorFlashDescription **NorFlashDevices, + OUT UINT32 *Count + ); + +EFI_STATUS +NorFlashPlatformFlashGetAttributes ( + OUT NorFlashDescription *NorFlashDevices, + IN UINT32 Count + ); + +typedef struct { + UINT8 ChipSelect; + IFC_REGS* IfcRegs; +} NorFlashInfo; + +VOID +GetIfcNorFlashInfo ( + IN NorFlashInfo *NorFlashInfo + ); + +VOID +GetIfcNorFlashTimings ( + IN IfcTimings * NorIfcTimings + ); + +typedef UINT16 FLASH_DATA; + +FLASH_DATA IfcNorFlashData (FLASH_DATA Val); + +VOID IfcNorWrite32 (VOID *a, UINT32 v); + +#endif /* _NOR_FLASH_LIB_H_ */ diff --git a/Platform/NXP/Library/NorFlashLib/CfiCommand.h b/Platform/NXP/L= ibrary/NorFlashLib/CfiCommand.h new file mode 100644 index 0000000..5e755be --- /dev/null +++ b/Platform/NXP/Library/NorFlashLib/CfiCommand.h @@ -0,0 +1,99 @@ +/** @CfiCommand.h + + Copyright 2017 NXP + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#ifndef __CFI_COMMAND_H__ +#define __CFI_COMMAND_H__ + +// CFI Data "QRY" +#define CFI_QRY_Q 0x51 +#define CFI_QRY_R 0x52 +#define CFI_QRY_Y 0x59 +#define CFI_QRY 0x515259 + +#define ENTER_CFI_QUERY_MODE_ADDR 0x0055 +#define ENTER_CFI_QUERY_MODE_CMD 0x0098 + +#define CFI_QUERY_UNIQUE_QRY_STRING 0x10 + +// Offsets for CFI queries +#define CFI_QUERY_TYP_TIMEOUT_WORD_WRITE 0x1F +#define CFI_QUERY_TYP_TIMEOUT_MAX_BUFFER_WRITE 0x20 +#define CFI_QUERY_TYP_TIMEOUT_BLOCK_ERASE 0x21 +#define CFI_QUERY_TYP_TIMEOUT_CHIP_ERASE 0x22 +#define CFI_QUERY_MAX_TIMEOUT_WORD_WRITE 0x23 +#define CFI_QUERY_MAX_TIMEOUT_MAX_BUFFER_WRITE 0x24 +#define CFI_QUERY_MAX_TIMEOUT_BLOCK_ERASE 0x25 +#define CFI_QUERY_MAX_TIMEOUT_CHIP_ERASE 0x26 +#define CFI_QUERY_DEVICE_SIZE 0x27 +#define CFI_QUERY_MAX_NUM_BYTES_WRITE 0x2A +#define CFI_QUERY_BLOCK_SIZE 0x2F + +// Unlock Address +#define CMD_UNLOCK_1_ADDR 0x555 +#define CMD_UNLOCK_2_ADDR 0x2AA + +// RESET Command +#define CMD_RESET_FIRST 0xAA +#define CMD_RESET_SECOND 0x55 +#define CMD_RESET 0xF0 + +// READ Command + +// Manufacturer ID +#define CMD_READ_M_ID_FIRST 0xAA +#define CMD_READ_M_ID_SECOND 0x55 +#define CMD_READ_M_ID_THIRD 0x90 +#define CMD_READ_M_ID_FOURTH 0x01 + +// Device ID +#define CMD_READ_D_ID_FIRST 0xAA +#define CMD_READ_D_ID_SECOND 0x55 +#define CMD_READ_D_ID_THIRD 0x90 +#define CMD_READ_D_ID_FOURTH 0x7E +#define CMD_READ_D_ID_FIFTH 0x13 +#define CMD_READ_D_ID_SIXTH 0x00 + +// WRITE Commands + +// PROGRAM Commands +#define CMD_PROGRAM_FIRST 0xAA +#define CMD_PROGRAM_SECOND 0x55 +#define CMD_PROGRAM_THIRD 0xA0 + +// Write Buffer Commands +#define CMD_WRITE_TO_BUFFER_FIRST 0xAA +#define CMD_WRITE_TO_BUFFER_SECOND 0x55 +#define CMD_WRITE_TO_BUFFER_THIRD 0x25 +#define CMD_WRITE_TO_BUFFER_CONFIRM 0x29 + +// ERASE Commands + +// UNLOCK COMMANDS FOR ERASE +#define CMD_ERASE_FIRST 0xAA +#define CMD_ERASE_SECOND 0x55 +#define CMD_ERASE_THIRD 0x80 +#define CMD_ERASE_FOURTH 0xAA +#define CMD_ERASE_FIFTH 0x55 + +// Chip Erase Commands +#define CMD_CHIP_ERASE_SIXTH 0x10 + +// Sector Erase Commands +#define CMD_SECTOR_ERASE_SIXTH 0x30 + +// SUSPEND Commands +#define CMD_PROGRAM_OR_ERASE_SUSPEND 0xB0 +#define CMD_PROGRAM_OR_ERASE_RESUME 0x30 + +#endif /* __CFI_FLASH_H__ */ diff --git a/Platform/NXP/Library/NorFlashLib/CfiNorFlashLib.c b/Platform/N= XP/Library/NorFlashLib/CfiNorFlashLib.c new file mode 100644 index 0000000..2683cae --- /dev/null +++ b/Platform/NXP/Library/NorFlashLib/CfiNorFlashLib.c @@ -0,0 +1,184 @@ +/** @CfiNorFlashLib.c + + Copyright (c) 2015, Freescale Semiconductor, Inc. All rights reserved. + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD= License + which accompanies this distribution. The full text of the license may be= found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPL= IED. + + **/ + +#include +#include +#include +#include "CfiCommand.h" +#include "CfiNorFlashLib.h" + +VOID +FlashWrite_Data ( + FLASH_DATA Val, + UINTN Addr + ) +{ + *(volatile FLASH_DATA *)(Addr) =3D (Val); +} + +VOID +FlashWrite ( + FLASH_DATA Val, + UINTN Addr + ) +{ + FLASH_DATA ShiftVal; + ShiftVal =3D IfcNorFlashData (Val); + + *(volatile FLASH_DATA *)(Addr) =3D (ShiftVal); +} + +FLASH_DATA +FlashReadData ( + UINTN Addr + ) +{ + FLASH_DATA Val; + Val =3D *(volatile FLASH_DATA *)(Addr); + + return (Val); +} + +FLASH_DATA +FlashRead ( + UINTN Addr + ) +{ + FLASH_DATA Val; + FLASH_DATA ShiftVal; + + Val =3D *(volatile FLASH_DATA *)(Addr); + ShiftVal =3D IfcNorFlashData (Val); + + return (ShiftVal); +} + +STATIC +VOID +NorFlashReadCfiData ( + IN UINTN DeviceBaseAddress, + IN UINTN CFI_Offset, + IN UINT32 NumberOfShorts, + OUT VOID *Data + ) +{ + UINT32 Count; + FLASH_DATA *TmpData =3D (FLASH_DATA *)Data; + + for (Count =3D 0; Count < NumberOfShorts; Count++, TmpData++) { + *TmpData =3D FLASH_READ ((UINTN)((FLASH_DATA*)DeviceBaseAddress + CF= I_Offset)); + CFI_Offset++; + } +} + +/* + Currently we support only CFI flash devices; Bail-out otherwise +*/ +EFI_STATUS +CfiNorFlashFlashGetAttributes ( + OUT NorFlashDescription *NorFlashDevices, + IN UINT32 Index + ) +{ + UINT32 Count; + FLASH_DATA QryData[3] =3D {0}; + FLASH_DATA BlockSize[2] =3D {0}; + UINTN DeviceBaseAddress =3D 0; + FLASH_DATA MaxNumBytes[2] =3D {0}; + FLASH_DATA Size =3D 0; + FLASH_DATA HighByteMask =3D 0xFF; // Masks High byte in a= UIN16 word + FLASH_DATA HighByteShift =3D 8; // Bitshifts needed to ma= ke a byte High Byte in a UIN16 word + FLASH_DATA Temp1 =3D 0; + FLASH_DATA Temp2 =3D 0; + + for (Count =3D 0; Count < Index; Count++) { + + NorFlashDevices[Count].DeviceBaseAddress =3D DeviceBaseAddress =3D Pcd= Get64 (PcdFlashDeviceBase64); + + // Reset flash first + NorFlashPlatformReset (DeviceBaseAddress); + + // Enter the CFI Query Mode + SEND_NOR_COMMAND (DeviceBaseAddress, ENTER_CFI_QUERY_MODE_ADDR, + ENTER_CFI_QUERY_MODE_CMD); + + ArmDataSynchronizationBarrier (); + + // Query the unique QRY + NorFlashReadCfiData (DeviceBaseAddress, + CFI_QUERY_UNIQUE_QRY_STRING, + 3, + &QryData); + if (QryData[0] !=3D (FLASH_DATA)CFI_QRY_Q || QryData[1] !=3D + (FLASH_DATA)CFI_QRY_R || QryData[2] !=3D (FLASH_DATA)CFI_QRY_Y= ) { + DEBUG ((DEBUG_ERROR, "Not a CFI flash (QRY not recvd): " + "Got =3D 0x%04x, 0x%04x, 0x%04x\n", + QryData[0], QryData[1], QryData[2])); + return EFI_DEVICE_ERROR; + } + + NorFlashReadCfiData (DeviceBaseAddress, CFI_QUERY_DEVICE_SIZE, + 1, &Size); + // Refer CFI Specification + NorFlashDevices[Count].Size =3D 1 << Size; + + NorFlashReadCfiData (DeviceBaseAddress, CFI_QUERY_BLOCK_SIZE, + 2, &BlockSize); + // Refer CFI Specification + NorFlashDevices[Count].BlockSize =3D 256 * ((FLASH_DATA) ((BlockSize[1= ] << + HighByteShift) | (BlockSize[0] & HighByteMask))); + + NorFlashReadCfiData (DeviceBaseAddress, + CFI_QUERY_MAX_NUM_BYTES_WRITE, 2, &MaxNumBytes); + // Refer CFI Specification + /* from CFI query we get the Max. number of BYTE in multi-byte write = =3D 2^N. + But our Flash Library is able to read/write in WORD size (2 bytes) = which + is why we need to CONVERT MAX BYTES TO MAX WORDS by diving it by + width of word size */ + NorFlashDevices[Count].MultiByteWordCount =3D\ + (1 << ((FLASH_DATA)((MaxNumBytes[1] << HighByteShift) | + (MaxNumBytes[0] & HighByteMask))))/sizeof(FLASH_DA= TA); + + NorFlashReadCfiData (DeviceBaseAddress, + CFI_QUERY_TYP_TIMEOUT_WORD_WRITE, 1, &Temp1); + NorFlashReadCfiData (DeviceBaseAddress, + CFI_QUERY_MAX_TIMEOUT_WORD_WRITE, 1, &Temp2); + NorFlashDevices[Count].WordWriteTimeOut =3D (1U << Temp1) * (1U << Tem= p2); + + NorFlashReadCfiData (DeviceBaseAddress, + CFI_QUERY_TYP_TIMEOUT_MAX_BUFFER_WRITE, 1, &Temp1); + NorFlashReadCfiData (DeviceBaseAddress, + CFI_QUERY_MAX_TIMEOUT_MAX_BUFFER_WRITE, 1, &Temp2); + NorFlashDevices[Count].BufferWriteTimeOut =3D (1U << Temp1) * (1U << T= emp2); + + NorFlashReadCfiData (DeviceBaseAddress, + CFI_QUERY_TYP_TIMEOUT_BLOCK_ERASE, 1, &Temp1); + NorFlashReadCfiData (DeviceBaseAddress, + CFI_QUERY_MAX_TIMEOUT_BLOCK_ERASE, 1, &Temp2); + NorFlashDevices[Count].BlockEraseTimeOut =3D + (1U << Temp1) * (1U << Temp2) * 1000; + + NorFlashReadCfiData (DeviceBaseAddress, + CFI_QUERY_TYP_TIMEOUT_CHIP_ERASE, 1, &Temp1); + NorFlashReadCfiData (DeviceBaseAddress, + CFI_QUERY_MAX_TIMEOUT_CHIP_ERASE, 1, &Temp2); + NorFlashDevices[Count].ChipEraseTimeOut =3D + (1U << Temp1) * (1U << Temp2) * 1000; + + // Put device back into Read Array mode (via Reset) + NorFlashPlatformReset (DeviceBaseAddress); + } + + return EFI_SUCCESS; +} diff --git a/Platform/NXP/Library/NorFlashLib/CfiNorFlashLib.h b/Platform/N= XP/Library/NorFlashLib/CfiNorFlashLib.h new file mode 100644 index 0000000..0b7a7ad --- /dev/null +++ b/Platform/NXP/Library/NorFlashLib/CfiNorFlashLib.h @@ -0,0 +1,54 @@ +/** @CfiNorFlashLib.h + + Copyright (c) 2015, Freescale Semiconductor, Inc. All rights reserved. + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#ifndef __CFI_NOR_FLASH_LIB_H__ +#define __CFI_NOR_FLASH_LIB_H__ + +#include +#include + +/* + * Values for the width of the port + */ +#define FLASH_CFI_8BIT 0x01 +#define FLASH_CFI_16BIT 0x02 +#define FLASH_CFI_32BIT 0x04 +#define FLASH_CFI_64BIT 0x08 + +#define NOR_FLASH_ERASE_RETRY 10 + +#define CREATE_BYTE_OFFSET(OffsetAddr) ((sizeof (FLASH_DATA)) * = (OffsetAddr)) +#define CREATE_NOR_ADDRESS(BaseAddr,OffsetAddr) ((BaseAddr) + (OffsetAddr= )) +#define FLASH_READ(Addr) FlashRead ((Addr)) +#define FLASH_WRITE(Addr, Val) FlashWrite ((Val), (Addr)) +#define FLASH_READ_DATA(Addr) FlashReadData ((Addr)) +#define FLASH_WRITE_DATA(Addr, Val) FlashWrite_Data ((Val), (= Addr)) + +#define SEND_NOR_COMMAND(BaseAddr,Offset,Cmd) FLASH_WRITE (CREATE_NOR_A= DDRESS (BaseAddr,CREATE_BYTE_OFFSET(Offset)), (Cmd)) + +#define GET_NOR_BLOCK_ADDRESS(BaseAddr,Lba,LbaSize) ( BaseAddr + (UINTN)(= (Lba) * LbaSize) ) + +VOID FlashWrite (FLASH_DATA Val, UINTN Addr); +FLASH_DATA FlashRead (UINTN Addr); + +VOID FlashWrite_Data (FLASH_DATA Val, UINTN Addr); +FLASH_DATA FlashReadData (UINTN Addr); + +EFI_STATUS +CfiNorFlashFlashGetAttributes ( + OUT NorFlashDescription *NorFlashDevices, + IN UINT32 Index + ); + +#endif /* __CFI_NOR_FLASH_LIB_H__ */ diff --git a/Platform/NXP/Library/NorFlashLib/IfcNorFlashLib.c b/Platform/N= XP/Library/NorFlashLib/IfcNorFlashLib.c new file mode 100644 index 0000000..f87ebc3 --- /dev/null +++ b/Platform/NXP/Library/NorFlashLib/IfcNorFlashLib.c @@ -0,0 +1,52 @@ +/** @IfcNorLib.c + + Copyright (c) 2017 NXP + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD= License + which accompanies this distribution. The full text of the license may be= found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPL= IED. + + **/ + +#include + +/* + Initialise Integrated flash controller(IFC) NOR flash +*/ +VOID +IfcNorInit ( + VOID + ) +{ + UINT32 NorCs; + NorFlashInfo NorFlashInfo; + IfcTimings NorIfcTimings; + + GetIfcNorFlashInfo (&NorFlashInfo); + NorCs =3D NorFlashInfo.ChipSelect; + + // Get Nor Flash Timings + GetIfcNorFlashTimings (&NorIfcTimings); + + // Tune IFC Nor Flash Timings + IfcNorWrite32 (&NorFlashInfo.IfcRegs->CsprCs[NorCs].CsprExt, + NorIfcTimings.CsprExt); + IfcNorWrite32 (&NorFlashInfo.IfcRegs->FtimCs[NorCs].Ftim[IFC_FTIM0], + NorIfcTimings.Ftim[0]); + IfcNorWrite32 (&NorFlashInfo.IfcRegs->FtimCs[NorCs].Ftim[IFC_FTIM1], + NorIfcTimings.Ftim[1]); + IfcNorWrite32 (&NorFlashInfo.IfcRegs->FtimCs[NorCs].Ftim[IFC_FTIM2], + NorIfcTimings.Ftim[2]); + IfcNorWrite32 (&NorFlashInfo.IfcRegs->FtimCs[NorCs].Ftim[IFC_FTIM3], + NorIfcTimings.Ftim[3]); + IfcNorWrite32 (&NorFlashInfo.IfcRegs->CsprCs[NorCs].Cspr, + NorIfcTimings.Cspr); + IfcNorWrite32 (&NorFlashInfo.IfcRegs->AmaskCs[NorCs].Amask, + NorIfcTimings.Amask); + IfcNorWrite32 (&NorFlashInfo.IfcRegs->CsorCs[NorCs].Csor, + NorIfcTimings.Csor); +} diff --git a/Platform/NXP/Library/NorFlashLib/NorFlashLib.c b/Platform/NXP/= Library/NorFlashLib/NorFlashLib.c new file mode 100644 index 0000000..e5e469f --- /dev/null +++ b/Platform/NXP/Library/NorFlashLib/NorFlashLib.c @@ -0,0 +1,658 @@ +/** @NorFlashLib.c + + Based on NorFlash implementation available in NorFlashDxe.c + + Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved. + Copyright (c) 2015, Freescale Semiconductor, Inc. All rights reserved. + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#include +#include +#include +#include + +#include "CfiCommand.h" +#include "CfiNorFlashLib.h" + +#define GET_BLOCK_OFFSET(Lba) ((Instance->RegionBaseAddress)-(Instance->De= viceBaseAddress)+((UINTN)((Lba) * Instance->Media.BlockSize))) + +NorFlashDescription mNorFlashDevices[NOR_FLASH_DEVICE_COUNT]; + +STATIC VOID +UnlockEraseAddress ( + IN UINTN DeviceBaseAddress + ) +{ // Issue the Unlock cmds + SEND_NOR_COMMAND (DeviceBaseAddress, CMD_UNLOCK_1_ADDR, + CMD_ERASE_FIRST); + + SEND_NOR_COMMAND (DeviceBaseAddress, CMD_UNLOCK_2_ADDR, + CMD_ERASE_SECOND); + + // Issue a setup command + SEND_NOR_COMMAND (DeviceBaseAddress, CMD_UNLOCK_1_ADDR, + CMD_ERASE_THIRD); + + // Issue the Unlock cmds + SEND_NOR_COMMAND (DeviceBaseAddress, CMD_UNLOCK_1_ADDR, + CMD_ERASE_FOURTH); + + SEND_NOR_COMMAND (DeviceBaseAddress, CMD_UNLOCK_2_ADDR, + CMD_ERASE_FIFTH); + + return; +} + +STATIC +UINT64 +ConvertMicroSecondsToTicks( + IN UINTN MicroSeconds +) +{ + UINT64 TimerTicks64; + + TimerTicks64 =3D 0; + + // Calculate counter ticks that represent requested delay: + // =3D MicroSeconds x TICKS_PER_MICRO_SEC + // =3D MicroSeconds x Timer Frequency(in Hz) x 10^-6 + // GetPerformanceCounterProperties =3D Get Arm Timer Frequency in Hz + TimerTicks64 =3D DivU64x32 ( + MultU64x64 ( + MicroSeconds, + GetPerformanceCounterProperties (NULL, NULL) + ), + 1000000U + ); + return TimerTicks64; +} + +/** + * The following function erases a NOR flash sector. + **/ +EFI_STATUS +NorFlashPlatformEraseSector ( + IN NOR_FLASH_INSTANCE *Instance, + IN UINTN SectorAddress + ) +{ + FLASH_DATA EraseStatus1; + FLASH_DATA EraseStatus2; + UINT64 Timeout; + UINT64 SystemCounterVal; + + EraseStatus1 =3D 0; + EraseStatus2 =3D 0; + Timeout =3D 0; + + Timeout =3D ConvertMicroSecondsToTicks ( + mNorFlashDevices[Instance->Media.MediaId].BlockEraseTim= eOut); + // Request a sector erase by writing two unlock cycles, followed by a + // setup command and two additional unlock cycles + + UnlockEraseAddress (Instance->DeviceBaseAddress); + + // Now send the address of the sector to be erased + SEND_NOR_COMMAND (SectorAddress, 0, CMD_SECTOR_ERASE_SIXTH); + + // Wait for erase to complete + // Read Sector start address twice to detect bit toggle and to + // determine ERASE DONE (all bits are 1) + // Get the maximum timer ticks needed to complete the operation + // Check if operation is complete or not in continous loop? + // if complete, exit from loop + // if not check the ticks that have been passed from the begining of loop + // if Maximum Ticks allocated for operation has passed exit from loop + + SystemCounterVal =3D GetPerformanceCounter (); + Timeout +=3D SystemCounterVal; + while (SystemCounterVal < Timeout) { + if ((EraseStatus1 =3D FLASH_READ(SectorAddress)) =3D=3D + (EraseStatus2 =3D FLASH_READ(SectorAddress))) { + if (0xFFFF =3D=3D FLASH_READ(SectorAddress)) { + break; + } + } + SystemCounterVal =3D GetPerformanceCounter (); + } + + if(SystemCounterVal >=3D Timeout) { + DEBUG((DEBUG_ERROR, "%a :Failed to Erase @ SectorAddress 0x%p, Timeout= \n", + __FUNCTION__, SectorAddress)); + return EFI_DEVICE_ERROR; + } else { + return EFI_SUCCESS; + } +} + +EFI_STATUS NorFlashPlatformWriteWord +( + IN NOR_FLASH_INSTANCE *Instance, + IN UINTN WordOffset, + IN FLASH_DATA Word +) +{ + UINT64 Timeout; + UINTN TargetAddress; + UINT64 SystemCounterVal; + FLASH_DATA Read1; + FLASH_DATA Read2; + + Timeout =3D 0; + + Timeout =3D ConvertMicroSecondsToTicks( + mNorFlashDevices[Instance->Media.MediaId].WordWriteTimeOut); + + TargetAddress =3D CREATE_NOR_ADDRESS(Instance->DeviceBaseAddress, + CREATE_BYTE_OFFSET(WordOffset)); + + // Issue the Unlock cmds + SEND_NOR_COMMAND (Instance->DeviceBaseAddress, CMD_UNLOCK_1_ADDR, + CMD_PROGRAM_FIRST); + + SEND_NOR_COMMAND (Instance->DeviceBaseAddress, CMD_UNLOCK_2_ADDR, + CMD_PROGRAM_SECOND); + + SEND_NOR_COMMAND (Instance->DeviceBaseAddress, CMD_UNLOCK_1_ADDR, + CMD_PROGRAM_THIRD); + + FLASH_WRITE_DATA (TargetAddress, Word); + + // Wait for Write to Complete + // Read the last written address twice to detect bit toggle and + // to determine if date is wriiten successfully or not ? + // Get the maximum timer ticks needed to complete the operation + // Check if operation is complete or not in continous loop? + // if complete, exit from loop + // if not check the ticks that have been passed from the begining of loop + // if Maximum Ticks allocated for operation has passed, then exit from l= oop + + SystemCounterVal =3D GetPerformanceCounter (); + Timeout +=3D SystemCounterVal; + while (SystemCounterVal < Timeout) { + if ((Read1 =3D FLASH_READ_DATA(TargetAddress)) =3D=3D + (Read2 =3D FLASH_READ_DATA(TargetAddress))) { + if (Word =3D=3D FLASH_READ_DATA(TargetAddress)) { + break; + } + } + SystemCounterVal =3D GetPerformanceCounter (); + } + + if(SystemCounterVal >=3D Timeout) { + DEBUG((DEBUG_ERROR, "%a: Failed to Write @ TargetAddress 0x%p, Timeou= t\n", + __FUNCTION__, TargetAddress)); + return EFI_DEVICE_ERROR; + } else { + return EFI_SUCCESS; + } +} + +EFI_STATUS NorFlashPlatformWritePageBuffer +( + IN NOR_FLASH_INSTANCE *Instance, + IN UINTN PageBufferOffset, + IN UINTN NumWords, + IN FLASH_DATA *Buffer +) +{ + UINT64 Timeout; + UINTN LastWrittenAddress; + FLASH_DATA LastWritenData; + UINTN current_offset; + UINTN end_offset; + UINTN TargetAddress; + UINT64 SystemCounterVal; + FLASH_DATA Read1; + FLASH_DATA Read2; + + // Initialize variables + Timeout =3D 0; + LastWrittenAddress =3D 0; + LastWritenData =3D 0; + current_offset =3D PageBufferOffset; + end_offset =3D PageBufferOffset + NumWords - 1; + Timeout =3D ConvertMicroSecondsToTicks ( + mNorFlashDevices[Instance->Media.MediaId].BufferWriteTim= eOut); + TargetAddress =3D CREATE_NOR_ADDRESS (Instance->DeviceBaseAddress, + CREATE_BYTE_OFFSET (current_offset)); + + // don't try with a count of zero + if (!NumWords) { + return EFI_SUCCESS; + } + else if (NumWords =3D=3D 1) { + return NorFlashPlatformWriteWord (Instance, PageBufferOffset, *Buffer); + } + + // Issue the Unlock cmds + SEND_NOR_COMMAND (Instance->DeviceBaseAddress, CMD_UNLOCK_1_ADDR, + CMD_WRITE_TO_BUFFER_FIRST); + + SEND_NOR_COMMAND (Instance->DeviceBaseAddress, CMD_UNLOCK_2_ADDR, + CMD_WRITE_TO_BUFFER_SECOND); + + // Write the buffer load + SEND_NOR_COMMAND (TargetAddress, 0, CMD_WRITE_TO_BUFFER_THIRD); + + // Write # of locations to program + SEND_NOR_COMMAND (TargetAddress, 0, (NumWords - 1)); + + // Load Data into Buffer + while (current_offset <=3D end_offset) { + LastWrittenAddress =3D CREATE_NOR_ADDRESS (Instance->DeviceBaseAddress, + CREATE_BYTE_OFFSET (current_offset++)); + LastWritenData =3D *Buffer++; + + // Write Data + FLASH_WRITE_DATA (LastWrittenAddress,LastWritenData); + } + + // Issue the Buffered Program Confirm command + SEND_NOR_COMMAND (TargetAddress, 0, CMD_WRITE_TO_BUFFER_CONFIRM); + + /* Wait for Write to Complete + Read the last written address twice to detect bit toggle and + to determine if date is wriiten successfully or not ? + Get the maximum timer ticks needed to complete the operation + Check if operation is complete or not in continous loop? + if complete, exit from loop + if not check the ticks that have been passed from the begining of loop + if Maximum Ticks allocated for operation has passed, then exit from l= oop **/ + SystemCounterVal =3D GetPerformanceCounter(); + Timeout +=3D SystemCounterVal; + while (SystemCounterVal < Timeout) { + if ((Read1 =3D FLASH_READ_DATA (LastWrittenAddress)) =3D=3D + (Read2 =3D FLASH_READ_DATA (LastWrittenAddress))) { + if (LastWritenData =3D=3D FLASH_READ_DATA (LastWrittenAddress)) { + break; + } + } + SystemCounterVal =3D GetPerformanceCounter (); + } + + if (SystemCounterVal >=3D Timeout) { + DEBUG((DEBUG_ERROR, "%a: Failed to Write @LastWrittenAddress 0x%p, Tim= eout\n", + __FUNCTION__, LastWrittenAddress)); + return EFI_DEVICE_ERROR; + } else { + return EFI_SUCCESS; + } +} + +EFI_STATUS NorFlashPlatformWriteWordAlignedAddressBuffer +( + IN NOR_FLASH_INSTANCE *Instance, + IN UINTN Offset, + IN UINTN NumWords, + IN FLASH_DATA *Buffer + ) +{ + UINTN MultiByteWordCount; + UINTN Mask; + UINTN IntWords; + EFI_STATUS Status; + + MultiByteWordCount =3D mNorFlashDevices[Instance->Media.MediaId].MultiBy= teWordCount; + Mask =3D MultiByteWordCount - 1; + IntWords =3D NumWords; + Status =3D EFI_SUCCESS; + + if (Offset & Mask) + { + // program only as much as necessary, so pick the lower of the two num= bers + if (NumWords < (MultiByteWordCount - (Offset & Mask))) { + IntWords =3D NumWords; + } + else { + IntWords =3D MultiByteWordCount - (Offset & Mask); + } + + // program the first few to get write buffer aligned + Status =3D NorFlashPlatformWritePageBuffer (Instance, Offset, IntWords= , Buffer); + if (EFI_ERROR (Status)) { + return Status; + } + + Offset +=3D IntWords; // adjust pointers and counter + NumWords -=3D IntWords; + Buffer +=3D IntWords; + + if (NumWords =3D=3D 0) { + return Status; + } + } + + while (NumWords >=3D MultiByteWordCount) // while big chunks to do + { + Status =3D NorFlashPlatformWritePageBuffer (Instance, Offset, + MultiByteWordCount, Buffer); + if (EFI_ERROR (Status)) { + return (Status); + } + + Offset +=3D MultiByteWordCount; // adjust pointers and counter + NumWords -=3D MultiByteWordCount; + Buffer +=3D MultiByteWordCount; + } + if (NumWords =3D=3D 0) { + return (Status); + } + + Status =3D NorFlashPlatformWritePageBuffer (Instance, Offset, NumWords, = Buffer); + return (Status); +} + +/* + * Writes data to the NOR Flash using the Buffered Programming method. + * + * Write Buffer Programming allows the system to write a maximum of 32 byt= es + * in one programming operation. Therefore this function will only handle + * buffers up to 32 bytes. + * To deal with larger buffers, call this function again. + */ +EFI_STATUS +NorFlashPlatformWriteBuffer ( + IN NOR_FLASH_INSTANCE *Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ) +{ + EFI_STATUS Status; + FLASH_DATA *pSrcBuffer; + UINTN TargetOffsetinBytes; + UINTN WordsToWrite; + UINTN Mask; + UINTN BufferSizeInBytes; + UINTN IntBytes; + UINT8 *CopyFrom, *CopyTo; + FLASH_DATA TempWrite =3D 0; + + pSrcBuffer =3D (FLASH_DATA *)Buffer; + TargetOffsetinBytes =3D 0; + WordsToWrite =3D 0; + Mask =3D sizeof(FLASH_DATA) - 1; + BufferSizeInBytes =3D *NumBytes; + IntBytes =3D BufferSizeInBytes; // Intermediate Bytes needed to copy for= alignment + TempWrite =3D 0; + + DEBUG ((DEBUG_BLKIO, "%a(Parameters: Lba=3D%ld, Offset=3D0x%x, " + "*NumBytes=3D0x%x, Buffer @ 0x%08x)\n", + __FUNCTION__, Lba, Offset, *NumBytes, Buffer)); + + TargetOffsetinBytes =3D GET_BLOCK_OFFSET (Lba) + (UINTN)(Offset); + + if (TargetOffsetinBytes & Mask) { + // Write only as much as necessary, so pick the lower of the two numbe= rs + // and call it Intermediate bytes to write to make alignment proper + if (BufferSizeInBytes < (sizeof(FLASH_DATA) - (TargetOffsetinBytes & M= ask))) { + IntBytes =3D BufferSizeInBytes; + } + else { + IntBytes =3D sizeof(FLASH_DATA) - (TargetOffsetinBytes & Mask); + } + + // Read the first few to get Read buffer aligned + NorFlashPlatformRead (Instance, Lba, (TargetOffsetinBytes & ~Mask) - + GET_BLOCK_OFFSET (Lba), sizeof(TempWrite), (UINT8*)&TempWrite); + + CopyTo =3D (UINT8*)&TempWrite; + CopyTo +=3D (TargetOffsetinBytes & Mask); + CopyFrom =3D (UINT8*)Buffer; + + InternalMemCopyMem (CopyTo, CopyFrom, IntBytes); + + Status =3D NorFlashPlatformWriteWordAlignedAddressBuffer (Instance, + (UINTN)((TargetOffsetinBytes & ~Mask)/size= of(FLASH_DATA)), + 1, &TempWrite); + if (EFI_ERROR (Status)) { + DEBUG((DEBUG_ERROR, "%a : Failed to Write @TargetOffset 0x%x (0x%x)\= n", + __FUNCTION__, TargetOffsetinBytes, Status)); + goto EXIT; + } + + TargetOffsetinBytes +=3D IntBytes; /* adjust pointers and counter */ + BufferSizeInBytes -=3D IntBytes; + Buffer +=3D IntBytes; + + if (BufferSizeInBytes =3D=3D 0) { + goto EXIT; + } + } + + // Write the bytes to CFI width aligned address. + // Note we can Write number of bytes=3DCFI width in one operation + WordsToWrite =3D BufferSizeInBytes/sizeof(FLASH_DATA); + pSrcBuffer =3D (FLASH_DATA*)Buffer; + + Status =3D NorFlashPlatformWriteWordAlignedAddressBuffer ( + Instance, + (UINTN)(TargetOffsetinBytes/sizeof(FLASH_DATA)), + WordsToWrite, + pSrcBuffer); + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR, "%a : Failed to Write @ TargetOffset 0x%x (0x%x)\n= ", + __FUNCTION__, TargetOffsetinBytes, Status)); + goto EXIT; + } + + BufferSizeInBytes -=3D (WordsToWrite*sizeof(FLASH_DATA)); + Buffer +=3D (WordsToWrite*sizeof(FLASH_DATA)); + TargetOffsetinBytes +=3D (WordsToWrite*sizeof(FLASH_DATA)); + + if (BufferSizeInBytes =3D=3D 0) { + goto EXIT; + } + + // Now Write bytes that are remaining and are less than CFI width. + // Read the first few to get Read buffer aligned + NorFlashPlatformRead (Instance, + Lba, + TargetOffsetinBytes - GET_BLOCK_OFFSET (Lba), + sizeof(TempWrite), + (UINT8*)&TempWrite); + + CopyFrom =3D (UINT8*)Buffer; + CopyTo =3D (UINT8*)&TempWrite; + + InternalMemCopyMem (CopyTo, CopyFrom, BufferSizeInBytes); + + Status =3D NorFlashPlatformWriteWordAlignedAddressBuffer (Instance, + (UINTN)(TargetOffsetinBytes/sizeof(FLASH_DATA)= ), + 1, + &TempWrite); + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR, "%a: Failed to Write @TargetOffset 0x%x Status=3D%= d\n", + __FUNCTION__, TargetOffsetinBytes, Status)); + goto EXIT; + } + +EXIT: + // Put device back into Read Array mode (via Reset) + NorFlashPlatformReset (Instance->DeviceBaseAddress); + return (Status); +} + +EFI_STATUS +NorFlashPlatformRead ( + IN NOR_FLASH_INSTANCE *Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN UINTN BufferSizeInBytes, + OUT UINT8 *Buffer + ) +{ + UINTN IntBytes; + UINTN Mask; + FLASH_DATA TempRead; + UINT8 *CopyFrom, *CopyTo; + UINTN TargetOffsetinBytes; + FLASH_DATA *pReadData; + UINTN BlockSize; + + IntBytes =3D BufferSizeInBytes; // Intermediate Bytes needed to copy for= alignment + Mask =3D sizeof(FLASH_DATA) - 1; + TempRead =3D 0; + TargetOffsetinBytes =3D (UINTN)(GET_BLOCK_OFFSET (Lba) + Offset); + BlockSize =3D Instance->Media.BlockSize; + + DEBUG ((DEBUG_BLKIO, "%a(Parameters: Lba=3D%ld, Offset=3D0x%x," + " BufferSizeInBytes=3D0x%x, Buffer @ 0x%p)\n", + __FUNCTION__, Lba, Offset, BufferSizeInBytes, Buffer)); + + // The buffer must be valid + if (Buffer =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + // Return if we have not any byte to read + if (BufferSizeInBytes =3D=3D 0) { + return EFI_SUCCESS; + } + + if (((Lba * BlockSize) + BufferSizeInBytes) > Instance->Size) { + DEBUG ((DEBUG_ERROR, "%a : Read will exceed device size.\n", __FUNCTIO= N__)); + return EFI_INVALID_PARAMETER; + } + + // Put device back into Read Array mode (via Reset) + NorFlashPlatformReset (Instance->DeviceBaseAddress); + + // First Read bytes to make buffer aligned to CFI width + if (TargetOffsetinBytes & Mask) { + // Read only as much as necessary, so pick the lower of the two numbers + if (BufferSizeInBytes < (sizeof(FLASH_DATA) - (TargetOffsetinBytes & M= ask))) { + IntBytes =3D BufferSizeInBytes; + } + else { + IntBytes =3D sizeof(FLASH_DATA) - (TargetOffsetinBytes & Mask); + } + + // Read the first few to get Read buffer aligned + TempRead =3D FLASH_READ_DATA (CREATE_NOR_ADDRESS ( + Instance->DeviceBaseAddress, + CREATE_BYTE_OFFSET ((TargetOffsetinBytes & ~Mask)/siz= eof(FLASH_DATA)))); + + CopyFrom =3D (UINT8*)&TempRead; + CopyFrom +=3D (TargetOffsetinBytes & Mask); + CopyTo =3D (UINT8*)Buffer; + + InternalMemCopyMem (CopyTo, CopyFrom, IntBytes); + + TargetOffsetinBytes +=3D IntBytes; // adjust pointers and counter + BufferSizeInBytes -=3D IntBytes; + Buffer +=3D IntBytes; + if (BufferSizeInBytes =3D=3D 0) { + return EFI_SUCCESS; + } + } + + pReadData =3D (FLASH_DATA*)Buffer; + + // Readout the bytes from CFI width aligned address. + // Note we can read number of bytes=3DCFI width in one operation + while (BufferSizeInBytes >=3D sizeof(FLASH_DATA)) { + *pReadData =3D FLASH_READ_DATA (CREATE_NOR_ADDRESS ( + Instance->DeviceBaseAddress, + CREATE_BYTE_OFFSET (TargetOffsetinBytes/sizeof(FLASH_= DATA)))); + pReadData +=3D 1; + BufferSizeInBytes -=3D sizeof(FLASH_DATA); + TargetOffsetinBytes +=3D sizeof(FLASH_DATA); + } + if (BufferSizeInBytes =3D=3D 0) { + return EFI_SUCCESS; + } + + // Now read bytes that are remaining and are less than CFI width. + CopyTo =3D (UINT8*)pReadData; + // Read the first few to get Read buffer aligned + TempRead =3D FLASH_READ_DATA (CREATE_NOR_ADDRESS ( + Instance->DeviceBaseAddress, + CREATE_BYTE_OFFSET (TargetOffsetinBytes/sizeof(FLASH_= DATA)))); + CopyFrom =3D (UINT8*)&TempRead; + + InternalMemCopyMem (CopyTo, CopyFrom, BufferSizeInBytes); + + return EFI_SUCCESS; +} + +EFI_STATUS +NorFlashPlatformReset ( + IN UINTN DeviceBaseAddress + ) +{ + SEND_NOR_COMMAND (DeviceBaseAddress, CMD_UNLOCK_1_ADDR, + CMD_RESET_FIRST); + + SEND_NOR_COMMAND (DeviceBaseAddress, CMD_UNLOCK_2_ADDR, + CMD_RESET_SECOND); + + SEND_NOR_COMMAND (DeviceBaseAddress, 0, CMD_RESET); + + return EFI_SUCCESS; +} + +EFI_STATUS +NorFlashPlatformGetDevices ( + OUT NorFlashDescription **NorFlashDevices, + OUT UINT32 *Count + ) +{ + if ((NorFlashDevices =3D=3D NULL) || (Count =3D=3D NULL)) { + return EFI_INVALID_PARAMETER; + } + + // Get the number of NOR flash devices supported + *NorFlashDevices =3D mNorFlashDevices; + *Count =3D NOR_FLASH_DEVICE_COUNT; + + return EFI_SUCCESS; +} + +EFI_STATUS +NorFlashPlatformFlashGetAttributes ( + OUT NorFlashDescription *NorFlashDevices, + IN UINT32 Count + ) +{ + EFI_STATUS Status; + UINT32 Index; + + if ((NorFlashDevices =3D=3D NULL) || (Count =3D=3D 0)) { + return EFI_INVALID_PARAMETER; + } + + // Check the attributes of the NOR flash slave we are connected to. + // Currently we support only CFI flash devices. Bail-out otherwise. + Status =3D CfiNorFlashFlashGetAttributes (NorFlashDevices, Count); + if (EFI_ERROR (Status)) { + return Status; + } + + // Limit the Size of Nor Flash that can be programmed + for (Index =3D 0; Index < Count; Index++) { + NorFlashDevices[Index].RegionBaseAddress =3D PcdGet64 (PcdFlashReserve= dRegionBase64); + NorFlashDevices[Index].Size -=3D (NorFlashDevices[Index].RegionBaseAdd= ress - + NorFlashDevices[Index].DeviceBaseAddre= ss); + if((NorFlashDevices[Index].RegionBaseAddress - NorFlashDevices[Index].= DeviceBaseAddress) % + NorFlashDevices[Index].BlockSize) { + DEBUG ((DEBUG_ERROR, "%a : Reserved Region(0x%p) doesn't start " + "from block boundry(0x%08x)\n", __FUNCTION__, + (UINTN)NorFlashDevices[Index].RegionBaseAddress, + (UINT32)NorFlashDevices[Index].BlockSize)); + return EFI_DEVICE_ERROR; + } + } + return Status; +} diff --git a/Platform/NXP/Library/NorFlashLib/NorFlashLib.inf b/Platform/NX= P/Library/NorFlashLib/NorFlashLib.inf new file mode 100644 index 0000000..14ca0ab --- /dev/null +++ b/Platform/NXP/Library/NorFlashLib/NorFlashLib.inf @@ -0,0 +1,42 @@ +#/** @NorFlashLib.inf +# +# Component description file for NorFlashLib module +# +# Copyright 2017 NXP +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the B= SD License +# which accompanies this distribution. The full text of the license may = be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IM= PLIED. +# +#**/ + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D NorFlashLib + FILE_GUID =3D f3176a49-dde1-450d-a909-8580c03b9ba8 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D NorFlashLib + +[Sources.common] + NorFlashLib.c + IfcNorFlashLib.c + CfiNorFlashLib.c + +[LibraryClasses] + ArmLib + IfcFlashLib + TimerLib + +[Packages] + ArmPkg/ArmPkg.dec + MdePkg/MdePkg.dec + Platform/NXP/NxpQoriqLs.dec + +[Pcd.common] + gNxpQoriqLsTokenSpaceGuid.PcdFlashDeviceBase64 + gNxpQoriqLsTokenSpaceGuid.PcdFlashReservedRegionBase64 --=20 1.9.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Tue Dec 24 13:12:53 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1513744933363462.21545114185733; Tue, 19 Dec 2017 20:42:13 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 6A123222447BA; Tue, 19 Dec 2017 20:37:22 -0800 (PST) Received: from NAM01-BY2-obe.outbound.protection.outlook.com (mail-by2nam01on0060.outbound.protection.outlook.com [104.47.34.60]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id A4106222447B7 for ; Tue, 19 Dec 2017 20:37:20 -0800 (PST) Received: from BN6PR03CA0052.namprd03.prod.outlook.com (10.173.137.14) by CY4PR03MB2693.namprd03.prod.outlook.com (10.173.43.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.323.15; Wed, 20 Dec 2017 04:42:06 +0000 Received: from BL2FFO11FD044.protection.gbl (2a01:111:f400:7c09::189) by BN6PR03CA0052.outlook.office365.com (2603:10b6:404:4c::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.345.14 via Frontend Transport; Wed, 20 Dec 2017 04:42:06 +0000 Received: from tx30smr01.am.freescale.net (192.88.168.50) by BL2FFO11FD044.mail.protection.outlook.com (10.173.161.140) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.302.6 via Frontend Transport; Wed, 20 Dec 2017 04:41:52 +0000 Received: from uefi-OptiPlex-790.ap.freescale.net ([10.232.132.56]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id vBK4fsdg019373; Tue, 19 Dec 2017 21:42:03 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.34.60; helo=nam01-by2-obe.outbound.protection.outlook.com; envelope-from=vabhav.sharma@nxp.com; receiver=edk2-devel@lists.01.org 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; From: Vabhav To: , , , Date: Tue, 19 Dec 2017 22:10:10 +0530 Message-ID: <1513701611-19990-4-git-send-email-vabhav.sharma@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1513701611-19990-1-git-send-email-vabhav.sharma@nxp.com> References: <1513701611-19990-1-git-send-email-vabhav.sharma@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131582185131494685; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(336005)(7966004)(39380400002)(39860400002)(376002)(346002)(396003)(2980300002)(1110001)(1109001)(339900001)(199004)(189003)(2906002)(36756003)(50466002)(53946003)(47776003)(6306002)(2950100002)(6666003)(53936002)(16200700003)(48376002)(104016004)(53376002)(4326008)(8936002)(51416003)(8656006)(106466001)(105606002)(5660300001)(86362001)(97736004)(81166006)(8676002)(966005)(81156014)(2201001)(76176011)(498600001)(15188155005)(16799955002)(85426001)(77096006)(68736007)(316002)(305945005)(54906003)(110136005)(356003)(16586007)(59450400001)(50226002)(579004)(559001)(569006); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR03MB2693; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD044; 1:mpy5JmW889v4ij6B9OHmHgltaLGVSED9G3QCgs/5EVT10sWQsatMG7pZGzjak/+n82RA2t9xb5rtiiPc+1Bhf9/t61OytLTr79PG2+Uwq5zCbmHct+7CTW+7wew2EkKQ MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 9bc10c8d-1234-4878-4d1d-08d54763fdff X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4628075)(201703131517081)(2017052603307); SRVR:CY4PR03MB2693; X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2693; 3:8tVM2CdbigoqRZH2gPo/BRbTHZQ0xJFJCdmzXqHqmOcU++16q5zJHE29ktaELHUi2UY1IACoQaweS/7UUkjClVPgj+yX5FuZA/wkIFXK1a2vAzOJTizxZBCIfDmslyuNJ85YQkmdKqtYmAA7KlcgVqAX2d/fSu2+OuJZ4HOLfafiaeVbuCsi9m7Jc0edTbpGt/oSljKJ/HKMuHYWQXjwBikfrJwxVlk0H9e1ous3Y/4j4RRW4Biq1FxbtPpd1cUS/jmBpPxPo2xLWgewEandnBvsp4cLd5J8/+pPlYfdgRAAInetY+8Syy0fm2UmeFF7QPXg8kd45iqcj6x+IvVhyrDud6tO4HtcCIz2rE2iBPY=; 25:FxFBsIdXYo+pYSpD5M6FkV6UxbnUPUOBjtH8F70HaYO8BDPkig0jBrYN6eZbg1iJ7VgMwC6l0MJ0F6W4B+afTi1Lj/r+K7YYUoQvF/kL3YbA/OFquDmScGeS4FK0JsXwQtzSBqEqyaL+sNl/d7px2QNI23A8EItxyfKSXE2UmP62v1GQ8nQ2Se6R1kyUEbSGHuwXWAewd2iJLnveyKeqrdQRwXHfbZ2oHQvxmxO4iN5xCKg9oM+R3MO/QhG9Jl24Sw6o/FIp/6uBNFOzdddlo6u2nwB3az4gb8v0eS8+ZqRr7iskkI0GraZnWawi6tgCwHah8b32YLOtssg3vmrvUg== X-MS-TrafficTypeDiagnostic: CY4PR03MB2693: X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2693; 31:3mVMklEuXbjxIVtek3IT8fA0p0cHQOMtC2AJZJpfeM4G+b74rjZbtOEOn52iDpMfVLW8UsldRNw6NKdc6hDlRSAgQi08V3fyGi/dceOU57XYfUUA88CzU89tPjeAMzUeUMhDeadxk6VGvOhHDeL+nOFqDIyIjgfX+j0kHusA4aF8ukk3nv0wLAF7djl/vo38lK3PCFvnQI7kbi9G1dpZmMQsZEyIkqSmija74hny6wk=; 4:ayvFfCxZvH7pTlay3k1lTNfHhgEWWjlbVL+YUdB25kidxhZ9wRbKdYkwzrmzEMpisWnJt+6Q3tZGMa2fV2KWqjS4Y4g7Z2hdQJASjJ5vajHVIVSAIu8w8yknESSIJSDXw66Sk+PM9qKjccd3qoOT6HS1J7CxeYTiHKF12zUJaltVLxPEk+3Vw1BoNk22MB1EQ3bredyvseZvgJWG/8KFbMewEYKUxc9vRb8BldxxAPFRF5YGM1a7EtpdpSQZMf7oDW3kDMRHaCo0Zh5WgaDKVAbSA0wI/+YqaYwmBc8wzP8l1EPCx4m0bINwAYapTVYm4ecV+NS804i2ODPsQimtYO2rJEA7Hf2ffbt7dK0KXqc= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(17755550239193); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(2401047)(5005006)(8121501046)(10201501046)(3002001)(3231023)(93006095)(93001095)(6055026)(6096035)(20161123559100)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150)(20161123556025)(20161123565025)(20161123563025)(20161123561025)(201708071742011); SRVR:CY4PR03MB2693; BCL:0; PCL:0; RULEID:(100000803101)(100110400095)(400006); SRVR:CY4PR03MB2693; X-Forefront-PRVS: 0527DFA348 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR03MB2693; 23:EA6y9TEkJpxvzv/2ypG7pxOFAhOn7S42IMVxBQlaD?= =?us-ascii?Q?3bv9qN4wbIJGQ0U7iwDGvzZqYTCLSJQmS21t9AVVPv5kVCbEVp7KAOn2Jybw?= =?us-ascii?Q?G+OQ+w5c0Q2pNpcscgjWV07bn4sw2c+wyINvR/4DtmWKS0RefkzvWIAhlpXS?= =?us-ascii?Q?T5jANsG4X/CyUZ+7AYgi1EEFoUupHm8LCNqNLi18ZMKje3+shMDl5V/E2kYq?= =?us-ascii?Q?ALtz8KjXYllfWBm43lD2nPXhVcK3a8zOY6t72dNbw9U10vfLgf96FRt3x2Q9?= =?us-ascii?Q?o0eeRJgYV1SypqAKVizpDGqalBOkIdEXSPe60VuKoIzis62QUAPPRHMVdinR?= =?us-ascii?Q?ohvCIuV13JmCPlPX6T1iK8Ui+vgLoT2XrJHNLZdQZTuWhb0cLnXkrC2ZZ3VE?= =?us-ascii?Q?z/EW06rTIqp21xr4a/32aDZ/pTb45Ra4B+mL82KkFK9803+FlaKfxoMCMbJi?= =?us-ascii?Q?OVzE3ruScGfQPpF5fc4F+9bOHhotjzgxgAKdoC1pyLJladVrRBdSWHblSU3n?= =?us-ascii?Q?qh4KN/IDUdRp4QNx67AxPIxzozhnuorkIYfMvHkO2cuEJgjOwGPkZ+PtRGKG?= =?us-ascii?Q?E/ImExtJ0/5YyWxAGuH4laX8qcBNwI0xHDtJIYvgwFL+b2lAZoT1XM9oIIxx?= =?us-ascii?Q?+id3xiDBTv+wyttv7r9OKSz0Xpv46KHzrKrouNERvwXuaCRmvXEuF5FncoL2?= =?us-ascii?Q?i3Chh4UkA58fyZkUy62dJC7K4P8ufbMBPKAv2Y2hDZh6+aEu2zlGrBOdOScI?= =?us-ascii?Q?pFDsBZDhUX2EUW1h5t2mdGA2V9zsFqRKAXa+nDi2FsiPdA+jnrvxyWuR18TH?= =?us-ascii?Q?A6qyx6fCbZEH+NCZ+aIJ3wLaOKfFLH0WI6YYH1CeBFFgVhBeJHKDao3MY3yu?= =?us-ascii?Q?K4WUnXJWbsecWY54JrQ3zOI5qzIzihsCSLDDVoRx6gLo+KSyiAljsAoIII+/?= =?us-ascii?Q?Juxa9s6csj1kZV+LV7/bpZUsLHCqIzedfpoJwRrW/REBY7VdXimps9XQPVEe?= =?us-ascii?Q?pJwb0FpTqn8+kOnUhOHVTDFMpirB12OSEKVwgM8PX818V69fHxtkrCg9BWpC?= =?us-ascii?Q?4Xc5FX7AxOk2v1rCCxd/AE2dNXtx4m3ofOfJwuLA56gVtvrs7NY9LfUc3j9m?= =?us-ascii?Q?TjyxfMtHB8e7tcQRu8ZWtJ1x12RFQMEygyo+Brev/RpoVcBJ1q4NsVjPsFCN?= =?us-ascii?Q?JeYkSb2jlsoK9OIAaOXXcYlEyJZptivJX8HvkYN5ERe77SgMoZPoxXEX+P3+?= =?us-ascii?Q?/lD+2L6vEP6q8BzLiXMzkn1F5Kq0AUm+oySLiNIj2AOYsYhkdk+ac9XDyai0?= =?us-ascii?Q?9ttFVhygk5CPxzJmRVoXXHvnIs4ANV7ztQuR23YdcqV?= X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2693; 6:WN6imwty5Azlbn/Oe6HbTUL3neeuVORuDbalHO0zyNKvMh7DPkiyBUJgYQkoZuFjFpw2Xv2pV/fjIHs5y3ZNjmRhOxsxw/CY9GTNc70GRErCUrZMQN7F+kr7wcOOEyO+VqN2JyXj0fVkpJ14JcPpg+K8RtEaHPLtKpCfE2RKTJgKTpb6Ih7Fb1Pwer67k3rvCObbiPlraljGLEPSwmibazpbLhYarCVZPJwtzu3bO50XhiZ2KbkzJihOKI6yU/YadzuKasZKfOrI2EdYET/tKkMyVIIceXMWUDn0+qs6EwhZMYIdy7LRpzE9R7vleKQqOAuVrk4G6BgELvi8+UDC18x1DMnOViPUk9Z/LOG0/YU=; 5:FzU9luhmpmzsrPgrMFTY7K/bo3RZoNb4BzjYfju+EHpW5q2wAZqj1OxOt+/QPvl/XkqhPQNPpURPHPFrz3JQFrXXTe9NwS4613WNrJvCEb2JQ4EO3PqPXW2IwkorUyNpUHIOyocNReSDF+hjq3bbhB/Mu1Z/32iWKCTaz+BbHzs=; 24:YdxpRbaaMbRGRGIxc95uPQvyF3tor7VncmBtipNQgnan/Dz76BKjbcJws8AgWQX29C1xs+BWedZni8Am+etThVn/P6taEgrt3/bEWu2GJXM=; 7:KInGeuZ8jwa1g75S4ilts3Dd6/St5qtrIiPJZIPgSKaEJ+47Y4d5L3q9wLtO7d+/dqN7/DJ0rXnRKkRuZFABFoGIy8/Fsnu+0F+FqnlrMr5Qnv9rPebQwRpz5QtKV6DYhevEryRtjY3AHcuh79EHDY9H1QI4FDkamNJY26LzcZ7PYpv9hUIdZE5reE98By1yHTTHe9OcTVPbbW6QRLhsi9hGN7cacqDGscJZQV7m2DEyqZ1l5EXmSZFkBbD9pDEi SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Dec 2017 04:41:52.9934 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9bc10c8d-1234-4878-4d1d-08d54763fdff 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: CY4PR03MB2693 Subject: [edk2] [PATCH edk2-platforms v2 3/4] Platform/NXP : Add Support for NOR Flash driver X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Adding support for NOR flash Driver Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Vabhav --- .../NXP/Drivers/NorFlashDxe/NorFlashBlockIoDxe.c | 254 +++++++ Platform/NXP/Drivers/NorFlashDxe/NorFlashDxe.c | 444 +++++++++++ Platform/NXP/Drivers/NorFlashDxe/NorFlashDxe.inf | 65 ++ Platform/NXP/Drivers/NorFlashDxe/NorFlashFvbDxe.c | 814 +++++++++++++++++= ++++ Platform/NXP/Include/Library/NorFlash.h | 222 ++++++ Silicon/NXP/Chassis/Chassis.c | 15 + Silicon/NXP/Chassis/Chassis.h | 7 + Silicon/NXP/Chassis/Chassis2/Soc.c | 1 + Silicon/NXP/Chassis/LS1043aSocLib.inf | 2 + 9 files changed, 1824 insertions(+) create mode 100644 Platform/NXP/Drivers/NorFlashDxe/NorFlashBlockIoDxe.c create mode 100644 Platform/NXP/Drivers/NorFlashDxe/NorFlashDxe.c create mode 100755 Platform/NXP/Drivers/NorFlashDxe/NorFlashDxe.inf create mode 100644 Platform/NXP/Drivers/NorFlashDxe/NorFlashFvbDxe.c create mode 100644 Platform/NXP/Include/Library/NorFlash.h diff --git a/Platform/NXP/Drivers/NorFlashDxe/NorFlashBlockIoDxe.c b/Platfo= rm/NXP/Drivers/NorFlashDxe/NorFlashBlockIoDxe.c new file mode 100644 index 0000000..bad397f --- /dev/null +++ b/Platform/NXP/Drivers/NorFlashDxe/NorFlashBlockIoDxe.c @@ -0,0 +1,254 @@ +/** @NorFlashBlockIoDxe.c + + Based on NorFlash implementation available in ArmPlatformPkg/Drivers/Nor= FlashDxe/NorFlashBlockIoDxe.c + + Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved. + Copyright 2017 NXP + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#include +#include + +// +// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.Reset +// +EFI_STATUS +EFIAPI +NorFlashBlockIoReset ( + IN EFI_BLOCK_IO_PROTOCOL *This, + IN BOOLEAN ExtendedVerification + ) +{ + NOR_FLASH_INSTANCE *Instance; + + Instance =3D INSTANCE_FROM_BLKIO_THIS (This); + + DEBUG ((DEBUG_INFO, "NorFlashBlockIoReset (MediaId=3D0x%x)\n", + This->Media->MediaId)); + + return NorFlashPlatformReset (Instance->DeviceBaseAddress); +} + +// +// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.ReadBlocks +// +EFI_STATUS +EFIAPI +NorFlashBlockIoReadBlocks ( + IN EFI_BLOCK_IO_PROTOCOL *This, + IN UINT32 MediaId, + IN EFI_LBA Lba, + IN UINTN BufferSizeInBytes, + OUT VOID *Buffer + ) +{ + NOR_FLASH_INSTANCE *Instance; + EFI_STATUS Status; + EFI_BLOCK_IO_MEDIA *Media; + UINTN NumBlocks; + UINT8 *pReadBuffer; + UINTN BlockCount; + UINTN BlockSizeInBytes; + EFI_LBA CurrentBlock; + + Status =3D EFI_SUCCESS; + + if ((This =3D=3D NULL) || (Buffer =3D=3D NULL)) { + return EFI_INVALID_PARAMETER; + } + + Instance =3D INSTANCE_FROM_BLKIO_THIS (This); + Media =3D This->Media; + + if (Media =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "%a : Media is NULL\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + NumBlocks =3D ((UINTN)BufferSizeInBytes) / Instance->Media.BlockSize ; + + DEBUG ((DEBUG_BLKIO, "%a : (MediaId=3D0x%x, Lba=3D%ld, " + "BufferSize=3D0x%x bytes (%d kB)" + ", BufferPtr @ 0x%p)\n", + __FUNCTION__,MediaId, Lba, + BufferSizeInBytes, Buffer)); + + if (!Media) { + Status =3D EFI_INVALID_PARAMETER; + } + else if (!Media->MediaPresent) { + Status =3D EFI_NO_MEDIA; + } + else if (Media->MediaId !=3D MediaId) { + Status =3D EFI_MEDIA_CHANGED; + } + else if ((Media->IoAlign >=3D 2) && + (((UINTN)Buffer & (Media->IoAlign - 1)) !=3D 0)) { + Status =3D EFI_INVALID_PARAMETER; + } + else if (BufferSizeInBytes =3D=3D 0) { + // Return if we have not any byte to read + Status =3D EFI_SUCCESS; + } + else if ((BufferSizeInBytes % Media->BlockSize) !=3D 0) { + // The size of the buffer must be a multiple of the block size + DEBUG ((DEBUG_ERROR, "%a : BlockSize in bytes =3D 0x%x\n",__FUNCTION__, + BufferSizeInBytes)); + Status =3D EFI_INVALID_PARAMETER; + } else if ((Lba + NumBlocks - 1) > Media->LastBlock) { + // All blocks must be within the device + DEBUG ((DEBUG_ERROR, "%a : Read will exceed last block %d, %d, %d \n", + __FUNCTION__, Lba, NumBlocks, Media->LastBlock)); + Status =3D EFI_INVALID_PARAMETER; + } else { + BlockSizeInBytes =3D Instance->Media.BlockSize; + + /* Because the target *Buffer is a pointer to VOID, + * we must put all the data into a pointer + * to a proper data type, so use *pReadBuffer */ + pReadBuffer =3D (UINT8 *)Buffer; + + CurrentBlock =3D Lba; + // Read data block by Block + for (BlockCount =3D 0; BlockCount < NumBlocks; BlockCount++, CurrentBl= ock++, + pReadBuffer =3D pReadBuffer + BlockSizeInBytes) { + DEBUG ((DEBUG_BLKIO, "%a: Reading block #%d\n", + __FUNCTION__,(UINTN)CurrentBlock)); + + Status =3D NorFlashPlatformRead (Instance, CurrentBlock, (UINTN)0 , + BlockSizeInBytes,pReadBuffer); + if (EFI_ERROR (Status)) { + break; + } + } + } + DEBUG ((DEBUG_BLKIO,"%a: Exit Status =3D \"%r\".\n",__FUNCTION__,Status)= ); + + return Status; +} + +// +// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.WriteBlocks +// +EFI_STATUS +EFIAPI +NorFlashBlockIoWriteBlocks ( + IN EFI_BLOCK_IO_PROTOCOL *This, + IN UINT32 MediaId, + IN EFI_LBA Lba, + IN UINTN BufferSizeInBytes, + IN VOID *Buffer + ) +{ + NOR_FLASH_INSTANCE *Instance; + EFI_STATUS Status; + EFI_BLOCK_IO_MEDIA *Media; + UINTN NumBlocks; + EFI_LBA CurrentBlock; + UINTN BlockSizeInBytes; + UINT32 BlockCount; + UINTN SectorAddress; + UINT8 *pWriteBuffer; + + Status =3D EFI_SUCCESS; + + if ((This =3D=3D NULL) || (Buffer =3D=3D NULL)) { + return EFI_INVALID_PARAMETER; + } + + Instance =3D INSTANCE_FROM_BLKIO_THIS (This); + Media =3D This->Media; + + if (Media =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "%a : Media is NULL\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + NumBlocks =3D ((UINTN)BufferSizeInBytes) / Instance->Media.BlockSize ; + + DEBUG ((DEBUG_BLKIO, "%a : (MediaId=3D0x%x, Lba=3D%ld, BufferSize=3D0x%x= " + "bytes (%d kB) BufferPtr @ 0x%08x)\n", + __FUNCTION__,MediaId, Lba,BufferSizeInBytes, Buffer)); + + if (!Media->MediaPresent) { + Status =3D EFI_NO_MEDIA; + } + else if (Media->MediaId !=3D MediaId) { + Status =3D EFI_MEDIA_CHANGED; + } + else if (Media->ReadOnly) { + Status =3D EFI_WRITE_PROTECTED; + } + else if (BufferSizeInBytes =3D=3D 0) { + Status =3D EFI_BAD_BUFFER_SIZE; + } + else if ((BufferSizeInBytes % Media->BlockSize) !=3D 0) { + // The size of the buffer must be a multiple of the block size + DEBUG ((DEBUG_ERROR, "%a : BlockSize in bytes =3D 0x%x\n",__FUNCTION__, + BufferSizeInBytes)); + Status =3D EFI_INVALID_PARAMETER; + } else if ((Lba + NumBlocks - 1) > Media->LastBlock) { + // All blocks must be within the device + DEBUG ((DEBUG_ERROR, "%a: Write will exceed last block %d, %d, %d \n", + __FUNCTION__,Lba, NumBlocks, Media->LastBlock)); + Status =3D EFI_INVALID_PARAMETER; + } else { + BlockSizeInBytes =3D Instance->Media.BlockSize; + + pWriteBuffer =3D (UINT8 *)Buffer; + + CurrentBlock =3D Lba; + // Program data block by Block + for (BlockCount =3D 0; BlockCount < NumBlocks; + BlockCount++, CurrentBlock++, + pWriteBuffer =3D (pWriteBuffer + BlockSizeInBytes)) { + DEBUG ((DEBUG_BLKIO, "%a: Writing block #%d\n", + __FUNCTION__,(UINTN)CurrentBlock)); + // Erase the Block(Sector) to be written to + SectorAddress =3D GET_NOR_BLOCK_ADDRESS ( + Instance->RegionBaseAddress, + CurrentBlock, + Instance->Media.BlockSize + ); + Status =3D NorFlashPlatformEraseSector (Instance, (UINTN)SectorAddre= ss); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to erase Target 0x%x (0x%x) \n", + __FUNCTION__,SectorAddress, Status)); + break; + } + // Program Block(Sector) to be written to + Status =3D NorFlashWrite (Instance, CurrentBlock, (UINTN)0, + &BlockSizeInBytes, pWriteBuffer); + if (EFI_ERROR (Status)) { + break; + } + } + } + DEBUG ((DEBUG_BLKIO, "%a: Exit Status =3D \"%r\".\n",__FUNCTION__,Status= )); + return Status; +} + +// +// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.FlushBlocks +// +EFI_STATUS +EFIAPI +NorFlashBlockIoFlushBlocks ( + IN EFI_BLOCK_IO_PROTOCOL *This + ) +{ + + DEBUG ((DEBUG_BLKIO, "%a NOT IMPLEMENTED (not required)\n", __FUNCTION__= )); + + // Nothing to do so just return without error + return EFI_SUCCESS; +} diff --git a/Platform/NXP/Drivers/NorFlashDxe/NorFlashDxe.c b/Platform/NXP/= Drivers/NorFlashDxe/NorFlashDxe.c new file mode 100644 index 0000000..ca17001 --- /dev/null +++ b/Platform/NXP/Drivers/NorFlashDxe/NorFlashDxe.c @@ -0,0 +1,444 @@ +/** @file NorFlashDxe.c + + Based on NorFlash implementation available in ArmPlatformPkg/Drivers/Nor= FlashDxe/NorFlashDxe.c + + Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved. + Copyright 2017 NXP + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#include +#include +#include +#include + +STATIC EFI_EVENT mNorFlashVirtualAddrChangeEvent; + +// +// Global variable declarations +// +NOR_FLASH_INSTANCE **mNorFlashInstances; +UINT32 mNorFlashDeviceCount; + +NOR_FLASH_INSTANCE mNorFlashInstanceTemplate =3D { + .Signature =3D NOR_FLASH_SIGNATURE, + .Initialized =3D FALSE, + .Initialize =3D NULL, + .StartLba =3D 0, + .BlockIoProtocol =3D { + .Revision =3D EFI_BLOCK_IO_PROTOCOL_REVISION2, + .Reset =3D NorFlashBlockIoReset, + .ReadBlocks =3D NorFlashBlockIoReadBlocks, + .WriteBlocks =3D NorFlashBlockIoWriteBlocks, + .FlushBlocks =3D NorFlashBlockIoFlushBlocks, + }, + + .Media =3D { + .RemovableMedia =3D FALSE, + .MediaPresent =3D TRUE, + .LogicalPartition =3D FALSE, + .ReadOnly =3D FALSE, + .WriteCaching =3D FALSE, + .IoAlign =3D 4, + .LowestAlignedLba =3D 0, + .LogicalBlocksPerPhysicalBlock =3D 1, + }, + + .FvbProtocol =3D { + .GetAttributes =3D FvbGetAttributes, + .SetAttributes =3D FvbSetAttributes, + .GetPhysicalAddress =3D FvbGetPhysicalAddress, + .GetBlockSize =3D FvbGetBlockSize, + .Read =3D FvbRead, + .Write =3D FvbWrite, + .EraseBlocks =3D FvbEraseBlocks, + .ParentHandle =3D NULL, + }, + .ShadowBuffer =3D NULL, + .DevicePath =3D { + .Vendor =3D { + .Header =3D { + .Type =3D HARDWARE_DEVICE_PATH, + .SubType =3D HW_VENDOR_DP, + .Length =3D {(UINT8)sizeof (VENDOR_DEVICE_PATH), + (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8) } + }, + .Guid =3D EFI_CALLER_ID_GUID, // GUID ... NEED TO BE FILLED + }, + .End =3D { + .Type =3D END_DEVICE_PATH_TYPE, + .SubType =3D END_ENTIRE_DEVICE_PATH_SUBTYPE, + .Length =3D { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 } + } + } +}; + +EFI_STATUS +NorFlashCreateInstance ( + IN UINTN NorFlashDeviceBase, + IN UINTN NorFlashRegionBase, + IN UINTN NorFlashSize, + IN UINT32 MediaId, + IN UINT32 BlockSize, + IN BOOLEAN SupportFvb, + OUT NOR_FLASH_INSTANCE** NorFlashInstance + ) +{ + EFI_STATUS Status; + NOR_FLASH_INSTANCE* Instance; + + ASSERT(NorFlashInstance !=3D NULL); + + Instance =3D AllocateRuntimeCopyPool (sizeof (NOR_FLASH_INSTANCE), + &mNorFlashInstanceTemplate); + if (Instance =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Instance->DeviceBaseAddress =3D NorFlashDeviceBase; + Instance->RegionBaseAddress =3D NorFlashRegionBase; + Instance->Size =3D NorFlashSize; + + Instance->BlockIoProtocol.Media =3D &Instance->Media; + Instance->Media.MediaId =3D MediaId; + Instance->Media.BlockSize =3D BlockSize; + Instance->Media.LastBlock =3D (NorFlashSize / BlockSize)-1; + + Instance->ShadowBuffer =3D AllocateRuntimePool (BlockSize); + if (Instance->ShadowBuffer =3D=3D NULL) { + FreePool (Instance); + return EFI_OUT_OF_RESOURCES; + } + + if (SupportFvb) { + Instance->SupportFvb =3D TRUE; + Instance->Initialize =3D NorFlashFvbInitialize; + + Status =3D gBS->InstallMultipleProtocolInterfaces ( + &Instance->Handle, + &gEfiDevicePathProtocolGuid, &Instance->DevicePath, + &gEfiBlockIoProtocolGuid, &Instance->BlockIoProtocol, + &gEfiFirmwareVolumeBlockProtocolGuid, &Instance->FvbProtocol, + NULL + ); + if (EFI_ERROR (Status)) { + FreePool (Instance->ShadowBuffer); + FreePool (Instance); + return Status; + } + } else { + Instance->Initialized =3D TRUE; + + Status =3D gBS->InstallMultipleProtocolInterfaces ( + &Instance->Handle, + &gEfiDevicePathProtocolGuid, &Instance->DevicePath, + &gEfiBlockIoProtocolGuid, &Instance->BlockIoProtocol, + NULL + ); + if (EFI_ERROR (Status)) { + FreePool (Instance->ShadowBuffer); + FreePool (Instance); + return Status; + } + } + + *NorFlashInstance =3D Instance; + + return Status; +} + +/* + Write a full or portion of a block. + It must not span block boundaries; that is, + Offset + NumBytes <=3D Instance->Media.BlockSize. + */ +EFI_STATUS +NorFlashWrite ( + IN NOR_FLASH_INSTANCE *Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer +) +{ + EFI_STATUS Status; + UINTN BlockSize; + BOOLEAN DoErase; + VOID *Source; + UINTN SectorAddress; + + Status =3D EFI_SUCCESS; + Source =3D NULL; + + DEBUG ((DEBUG_BLKIO, "%a(Parameters: Lba=3D%ld, Offset=3D0x%x, NumBytes= =3D0x%x, " + "Buffer @ 0x%08x)\n", __FUNCTION__, + Lba, Offset, *NumBytes, Buffer)); + + // The buffer must be valid + if (Buffer =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + + // Detect WriteDisabled state + if (Instance->Media.ReadOnly =3D=3D TRUE) { + DEBUG ((DEBUG_ERROR, "NorFlashWrite: ERROR - Can not write: " + "Device is in WriteDisabled state.\n")); + // It is in WriteDisabled state, return an error right away + return EFI_ACCESS_DENIED; + } + + // Cache the block size to avoid de-referencing pointers all the time + BlockSize =3D Instance->Media.BlockSize; + + // We must have some bytes to write + if ((*NumBytes =3D=3D 0) || (*NumBytes > BlockSize)) { + DEBUG ((DEBUG_ERROR, "NorFlashWrite: ERROR - EFI_BAD_BUFFER_SIZE: " + "(Offset=3D0x%x + NumBytes=3D0x%x) > BlockSize=3D0x%x\n", \ + Offset, *NumBytes, BlockSize )); + return EFI_BAD_BUFFER_SIZE; + } + + if (((Lba * BlockSize) + Offset + *NumBytes) > Instance->Size) { + DEBUG ((DEBUG_ERROR, "%a: ERROR - Write will exceed device size.\n", + __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + // Check we did get some memory. Buffer is BlockSize. + if (Instance->ShadowBuffer =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "FvbWrite: ERROR - Buffer not ready\n")); + return EFI_DEVICE_ERROR; + } + + SectorAddress =3D GET_NOR_BLOCK_ADDRESS ( + Instance->RegionBaseAddress, + Lba, + Instance->Media.BlockSize + ); + + // Pick 128bytes as a good start for word operations as opposed to erasi= ng the + // block and writing the data regardless if an erase is really needed. + // It looks like most individual NV variable writes are smaller than 128= bytes. + if (*NumBytes <=3D 128) { + Source =3D Instance->ShadowBuffer; + //First Read the data into shadow buffer from location where data is t= o be written + Status =3D NorFlashPlatformRead ( + Instance, + Lba, + Offset, + *NumBytes, + Source + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR - Failed to " + "Read @ %p Status=3D%d\n", __FUNCTION__, + Offset + SectorAddress, Status)); + return Status; + } + // Check to see if we need to erase before programming the data into N= orFlash. + // If the destination bits are only changing from 1s to 0s we can + // just write. After a block is erased all bits in the block is set to= 1. + // If any byte requires us to erase we just give up and rewrite all of= it. + DoErase =3D TestBitSetClear (Source, Buffer, *NumBytes, TRUE); + + // if we got here then write all the data. Otherwise do the + // Erase-Write cycle. + if (!DoErase) { + Status =3D NorFlashPlatformWriteBuffer ( + Instance, + Lba, + Offset, + NumBytes, + Buffer + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: ERROR - Failed to " + "Write @ %p Status=3D%d\n", __FUNCTION__, + Offset + SectorAddress, Status)); + return Status; + } + return EFI_SUCCESS; + } + } + + // If we are not going to write full block, read block and then update b= ytes in it + if (*NumBytes !=3D BlockSize) { + // Read NorFlash Flash data into shadow buffer + Status =3D NorFlashBlockIoReadBlocks ( + &(Instance->BlockIoProtocol), + Instance->Media.MediaId, + Lba, + BlockSize, + Instance->ShadowBuffer + ); + if (EFI_ERROR (Status)) { + // Return one of the pre-approved error statuses + return EFI_DEVICE_ERROR; + } + // Put the data at the appropriate location inside the buffer area + CopyMem ((VOID *)((UINTN)Instance->ShadowBuffer + Offset), Buffer, *Nu= mBytes); + } + //Erase Block + Status =3D NorFlashPlatformEraseSector (Instance, SectorAddress); + if (EFI_ERROR (Status)) { + // Return one of the pre-approved error statuses + return EFI_DEVICE_ERROR; + } + if (*NumBytes !=3D BlockSize) { + // Write the modified shadow buffer back to the NorFlash + Status =3D NorFlashPlatformWriteBuffer ( + Instance, + Lba, + 0, + &BlockSize, + Instance->ShadowBuffer + ); + } else { + // Write the Buffer to an entire block in NorFlash + Status =3D NorFlashPlatformWriteBuffer ( + Instance, + Lba, + 0, + &BlockSize, + Buffer + ); + } + if (EFI_ERROR (Status)) { + // Return one of the pre-approved error statuses + return EFI_DEVICE_ERROR; + } + + return EFI_SUCCESS; +} + +/** + Fixup internal data so that EFI can be call in virtual mode. + Call the passed in Child Notify event and convert any pointers in + lib to virtual mode. + + @param[in] Event The Event that is being processed + @param[in] Context Event Context +**/ +VOID +EFIAPI +NorFlashVirtualNotifyEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + UINTN Index; + + for (Index =3D 0; Index < mNorFlashDeviceCount; Index++) { + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->DeviceBase= Address); + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->RegionBase= Address); + + // Convert BlockIo protocol + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->BlockIoPro= tocol.FlushBlocks); + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->BlockIoPro= tocol.ReadBlocks); + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->BlockIoPro= tocol.Reset); + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->BlockIoPro= tocol.WriteBlocks); + + // Convert Fvb + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->FvbProtoco= l.EraseBlocks); + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->FvbProtoco= l.GetAttributes); + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->FvbProtoco= l.GetBlockSize); + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->FvbProtoco= l.GetPhysicalAddress); + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->FvbProtoco= l.Read); + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->FvbProtoco= l.SetAttributes); + EfiConvertPointer (0x0, (VOID**)&mNorFlashInstances[Index]->FvbProtoco= l.Write); + if (mNorFlashInstances[Index]->ShadowBuffer !=3D NULL) { + EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->ShadowB= uffer); + } + } + + return; +} + +EFI_STATUS +EFIAPI +NorFlashInitialise ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + UINT32 Index; + NorFlashDescription* NorFlashDevices; + BOOLEAN ContainVariableStorage; + + ContainVariableStorage =3D 0; + + Status =3D NorFlashPlatformGetDevices (&NorFlashDevices, &mNorFlashDevic= eCount); + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR,"%a : Failed to get Nor devices (0x%x)\n", + __FUNCTION__, Status)); + return Status; + } + + Status =3D NorFlashPlatformFlashGetAttributes (NorFlashDevices, + mNorFlashDeviceCount); + if (EFI_ERROR(Status)) { + DEBUG ((DEBUG_ERROR,"%a : Failed to get NOR device attributes (0x%x)\n= ", + __FUNCTION__, Status)); + ASSERT_EFI_ERROR (Status); /* System becomes unusable if NOR flash is = not detected */ + return Status; + } + + mNorFlashInstances =3D AllocateRuntimePool ( + sizeof(NOR_FLASH_INSTANCE*) * mNorFlashDeviceC= ount); + if (mNorFlashInstances =3D=3D NULL) { + DEBUG ((DEBUG_ERROR,"%a : Failed to allocate runtime memory \n")); + return EFI_OUT_OF_RESOURCES; + } + + for (Index =3D 0; Index < mNorFlashDeviceCount; Index++) { + // Check if this NOR Flash device contain the variable storage region + ContainVariableStorage =3D + (NorFlashDevices[Index].RegionBaseAddress <=3D PcdGet64 (PcdFlashNvS= torageVariableBase64)) && + (PcdGet64 (PcdFlashNvStorageVariableBase64) + PcdGet32 (PcdFlashNvSt= orageVariableSize) <=3D + NorFlashDevices[Index].RegionBaseAddress + NorFlashDevices[Index].S= ize); + + Status =3D NorFlashCreateInstance ( + NorFlashDevices[Index].DeviceBaseAddress, + NorFlashDevices[Index].RegionBaseAddress, + NorFlashDevices[Index].Size, + Index, + NorFlashDevices[Index].BlockSize, + ContainVariableStorage, + &mNorFlashInstances[Index] + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR,"%a : Failed to create instance for " + "NorFlash[%d] (0x%x)\n",Index, Status)); + } + + } + + // + // Register for the virtual address change event + // + Status =3D gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_NOTIFY, + NorFlashVirtualNotifyEvent, + NULL, + &gEfiEventVirtualAddressChangeGuid, + &mNorFlashVirtualAddrChangeEvent + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR,"Failed to create VirtualAddressChange event 0x%x\= n", + Status)); + } + + return Status; +} diff --git a/Platform/NXP/Drivers/NorFlashDxe/NorFlashDxe.inf b/Platform/NX= P/Drivers/NorFlashDxe/NorFlashDxe.inf new file mode 100755 index 0000000..2da8a51 --- /dev/null +++ b/Platform/NXP/Drivers/NorFlashDxe/NorFlashDxe.inf @@ -0,0 +1,65 @@ +#/** @file +# +# Component description file for NorFlashDxe module +# +# Copyright 2017 NXP +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the B= SD License +# which accompanies this distribution. The full text of the license may = be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IM= PLIED. +# +#**/ + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D NorFlashDxe + FILE_GUID =3D 616fe8d8-f4aa-42e0-a393-b332bdb2d3c1 + MODULE_TYPE =3D DXE_RUNTIME_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D NorFlashInitialise + +[Sources.common] + NorFlashDxe.c + NorFlashFvbDxe.c + NorFlashBlockIoDxe.c + +[Packages] + ArmPlatformPkg/ArmPlatformPkg.dec + Platform/NXP/NxpQoriqLs.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + DxeServicesTableLib + HobLib + NorFlashLib + UefiDriverEntryPoint + UefiRuntimeLib + +[Guids] + gEfiSystemNvDataFvGuid + gEfiVariableGuid + gEfiAuthenticatedVariableGuid + gEfiEventVirtualAddressChangeGuid + +[Protocols] + gEfiBlockIoProtocolGuid + gEfiFirmwareVolumeBlockProtocolGuid + +[Pcd.common] + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize + +[Depex] + # + # NorFlashDxe must be loaded before VariableRuntimeDxe in case empty fla= sh needs populating with default values + # + BEFORE gVariableRuntimeDxeFileGuid diff --git a/Platform/NXP/Drivers/NorFlashDxe/NorFlashFvbDxe.c b/Platform/N= XP/Drivers/NorFlashDxe/NorFlashFvbDxe.c new file mode 100644 index 0000000..f74ffc9 --- /dev/null +++ b/Platform/NXP/Drivers/NorFlashDxe/NorFlashFvbDxe.c @@ -0,0 +1,814 @@ +/*@NorFlashFvbDxe.c + + Based on NorFlash implementation available in ArmPlatformPkg/Drivers/NorF= lashDxe/NorFlashFvbDxe.c + + Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved. + Copyright 2017 NXP + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD= License + which accompanies this distribution. The full text of the license may be= found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPL= IED. + + --*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +STATIC EFI_EVENT mFvbVirtualAddrChangeEvent; +STATIC UINTN mFlashNvStorageVariableBase; + +/// +/// The Firmware Volume Block Protocol is the low-level interface +/// to a firmware volume. File-level access to a firmware volume +/// should not be done using the Firmware Volume Block Protocol. +/// Normal access to a firmware volume must use the Firmware +/// Volume Protocol. Typically, only the file system driver that +/// produces the Firmware Volume Protocol will bind to the +/// Firmware Volume Block Protocol. +/// + +/** + Initialises the FV Header and Variable Store Header + to support variable operations. + + @param[in] Ptr - Location to initialise the headers + +**/ +EFI_STATUS +InitializeFvAndVariableStoreHeaders ( + IN NOR_FLASH_INSTANCE *Instance + ) +{ + EFI_STATUS Status; + VOID* Headers; + UINTN HeadersLength; + EFI_FIRMWARE_VOLUME_HEADER *FirmwareVolumeHeader; + VARIABLE_STORE_HEADER *VariableStoreHeader; + + if (!Instance->Initialized && Instance->Initialize) { + Instance->Initialize (Instance); + } + + HeadersLength =3D sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_B= LOCK_MAP_ENTRY) + sizeof (VARIABLE_STORE_HEADER); + Headers =3D AllocateZeroPool (HeadersLength); + if (Headers =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "Memory allocation failed for Headers \n")); + return EFI_OUT_OF_RESOURCES; + } + + // FirmwareVolumeHeader->FvLength is declared to have the Variable area = AND the FTW working area AND the FTW Spare contiguous. + ASSERT (PcdGet64 (PcdFlashNvStorageVariableBase64) + PcdGet32 (PcdFlashN= vStorageVariableSize) =3D=3D PcdGet64 (PcdFlashNvStorageFtwWorkingBase64)); + ASSERT (PcdGet64 (PcdFlashNvStorageFtwWorkingBase64) + PcdGet32 (PcdFlas= hNvStorageFtwWorkingSize) =3D=3D PcdGet64 (PcdFlashNvStorageFtwSpareBase64)= ); + + // Check if the size of the area is at least one block size + ASSERT ((PcdGet32 (PcdFlashNvStorageVariableSize) > 0) && (PcdGet32 (Pcd= FlashNvStorageVariableSize) / Instance->Media.BlockSize > 0)); + ASSERT ((PcdGet32 (PcdFlashNvStorageFtwWorkingSize) > 0) && (PcdGet32 (P= cdFlashNvStorageFtwWorkingSize) / Instance->Media.BlockSize > 0)); + ASSERT ((PcdGet32 (PcdFlashNvStorageFtwSpareSize) > 0) && (PcdGet32 (Pcd= FlashNvStorageFtwSpareSize) / Instance->Media.BlockSize > 0)); + + // Ensure the Variable area Base Addresses are aligned on a block size b= oundaries + ASSERT (PcdGet64 (PcdFlashNvStorageVariableBase64) % Instance->Media.Blo= ckSize =3D=3D 0); + ASSERT (PcdGet64 (PcdFlashNvStorageFtwWorkingBase64) % Instance->Media.B= lockSize =3D=3D 0); + ASSERT (PcdGet64 (PcdFlashNvStorageFtwSpareBase64) % Instance->Media.Blo= ckSize =3D=3D 0); + + // + // EFI_FIRMWARE_VOLUME_HEADER + // + FirmwareVolumeHeader =3D (EFI_FIRMWARE_VOLUME_HEADER*)Headers; + CopyGuid (&FirmwareVolumeHeader->FileSystemGuid, &gEfiSystemNvDataFvGuid= ); + FirmwareVolumeHeader->FvLength =3D + PcdGet32 (PcdFlashNvStorageVariableSize) + + PcdGet32 (PcdFlashNvStorageFtwWorkingSize) + + PcdGet32 (PcdFlashNvStorageFtwSpareSize); + FirmwareVolumeHeader->Signature =3D EFI_FVH_SIGNATURE; + FirmwareVolumeHeader->Attributes =3D (EFI_FVB_ATTRIBUTES_2) ( + EFI_FVB2_READ_ENABLED_CAP | //= Reads may be enabled + EFI_FVB2_READ_STATUS | //= Reads are currently enabled + EFI_FVB2_STICKY_WRITE | //= A block erase is required to flip bits into EFI_FVB2_ERASE_POLARITY + EFI_FVB2_MEMORY_MAPPED | //= It is memory mapped + EFI_FVB2_ERASE_POLARITY | //= After erasure all bits take this value (i.e. '1') + EFI_FVB2_WRITE_STATUS | //= Writes are currently enabled + EFI_FVB2_WRITE_ENABLED_CAP //= Writes may be enabled + ); + FirmwareVolumeHeader->HeaderLength =3D sizeof (EFI_FIRMWARE_VOLUME_HEADE= R) + sizeof (EFI_FV_BLOCK_MAP_ENTRY); + FirmwareVolumeHeader->Revision =3D EFI_FVH_REVISION; + //i.e. if blocks are 0-5 then last block =3D 5, total blocks =3D 6 + FirmwareVolumeHeader->BlockMap[0].NumBlocks =3D Instance->Media.LastBloc= k + 1; + FirmwareVolumeHeader->BlockMap[0].Length =3D Instance->Media.BlockS= ize; + FirmwareVolumeHeader->BlockMap[1].NumBlocks =3D 0; + FirmwareVolumeHeader->BlockMap[1].Length =3D 0; + FirmwareVolumeHeader->Checksum =3D CalculateCheckSum16 ((UINT16*)Firmwar= eVolumeHeader,FirmwareVolumeHeader->HeaderLength); + + // + // VARIABLE_STORE_HEADER + // + VariableStoreHeader =3D (VARIABLE_STORE_HEADER*)((UINTN)Headers + Firmwa= reVolumeHeader->HeaderLength); + CopyGuid (&VariableStoreHeader->Signature, &gEfiAuthenticatedVariableGui= d); + VariableStoreHeader->Size =3D PcdGet32(PcdFlashNvStorageVariableSize) - = FirmwareVolumeHeader->HeaderLength; + VariableStoreHeader->Format =3D VARIABLE_STORE_FORMATTED; + VariableStoreHeader->State =3D VARIABLE_STORE_HEALTHY; + + // Install the combined super-header in the NorFlash + Status =3D FvbWrite (&Instance->FvbProtocol, 0, 0, &HeadersLength, Heade= rs); + + FreePool (Headers); + return Status; +} + +/** + Check the integrity of firmware volume header. + + @param[in] FwVolHeader - A pointer to a firmware volume header + + @retval EFI_SUCCESS - The firmware volume is consistent + @retval EFI_NOT_FOUND - The firmware volume has been corrupted. + +**/ +EFI_STATUS +ValidateFvHeader ( + IN NOR_FLASH_INSTANCE *Instance + ) +{ + UINT16 Checksum; + EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader; + VARIABLE_STORE_HEADER *VariableStoreHeader; + UINTN VariableStoreLength; + UINTN FvLength; + + FwVolHeader =3D (EFI_FIRMWARE_VOLUME_HEADER*)mFlashNvStorageVariableBase; + + FvLength =3D PcdGet32 (PcdFlashNvStorageVariableSize) + PcdGet32 (PcdFla= shNvStorageFtwWorkingSize) + + PcdGet32 (PcdFlashNvStorageFtwSpareSize); + + // + // Verify the header revision, header signature, length + // Length of FvBlock cannot be 2**64-1 + // HeaderLength cannot be an odd number + // + if ( (FwVolHeader->Revision !=3D EFI_FVH_REVISION) + || (FwVolHeader->Signature !=3D EFI_FVH_SIGNATURE) + || (FwVolHeader->FvLength !=3D FvLength) + ) + { + DEBUG ((DEBUG_ERROR, "%a: No Firmware Volume header present\n", + __FUNCTION__)); + return EFI_NOT_FOUND; + } + + // Check the Firmware Volume Guid + if( CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiSystemNvDataFvGuid) = =3D=3D FALSE ) { + DEBUG ((DEBUG_ERROR, "%a: Firmware Volume Guid non-compatible\n", + __FUNCTION__)); + return EFI_NOT_FOUND; + } + + // Verify the header checksum + Checksum =3D CalculateSum16 ((UINT16*)FwVolHeader, FwVolHeader->HeaderLe= ngth); + if (Checksum !=3D 0) { + DEBUG ((DEBUG_ERROR, "%a: FV checksum is invalid (Checksum:0x%X)\n", + __FUNCTION__, Checksum)); + return EFI_NOT_FOUND; + } + + VariableStoreHeader =3D (VARIABLE_STORE_HEADER*)((UINTN)FwVolHeader + + FwVolHeader->HeaderLength); + + // Check the Variable Store Guid + if (!CompareGuid (&VariableStoreHeader->Signature, &gEfiVariableGuid) && + !CompareGuid (&VariableStoreHeader->Signature, &gEfiAuthenticatedVar= iableGuid)) { + DEBUG ((DEBUG_ERROR, "%a: Variable Store Guid non-compatible\n", + __FUNCTION__)); + return EFI_NOT_FOUND; + } + + VariableStoreLength =3D PcdGet32 (PcdFlashNvStorageVariableSize) - FwVol= Header->HeaderLength; + if (VariableStoreHeader->Size !=3D VariableStoreLength) { + DEBUG ((DEBUG_ERROR, "%a: Variable Store Length does not match\n", + __FUNCTION__)); + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} + +/** + The GetAttributes() function retrieves the attributes and + current settings of the block. + + @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL ins= tance. + + @param Attributes Pointer to EFI_FVB_ATTRIBUTES_2 in which the attribut= es and + current settings are returned. + Type EFI_FVB_ATTRIBUTES_2 is defined in EFI_FIRMWARE_= VOLUME_HEADER. + + @retval EFI_SUCCESS The firmware volume attributes were returned. + + **/ +EFI_STATUS +EFIAPI +FvbGetAttributes( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + OUT EFI_FVB_ATTRIBUTES_2 *Attributes + ) +{ + EFI_FVB_ATTRIBUTES_2 FlashFvbAttributes; + NOR_FLASH_INSTANCE *Instance; + + Instance =3D INSTANCE_FROM_FVB_THIS (This); + + FlashFvbAttributes =3D (EFI_FVB_ATTRIBUTES_2) ( + + EFI_FVB2_READ_ENABLED_CAP | // Reads may be enabled + EFI_FVB2_READ_STATUS | // Reads are currently enabled + EFI_FVB2_STICKY_WRITE | // A block erase is required to flip bit= s into EFI_FVB2_ERASE_POLARITY + EFI_FVB2_MEMORY_MAPPED | // It is memory mapped + EFI_FVB2_ERASE_POLARITY // After erasure all bits take this valu= e (i.e. '1') + + ); + + // Check if it is write protected + if (Instance->Media.ReadOnly !=3D TRUE) { + + FlashFvbAttributes =3D FlashFvbAttributes | + EFI_FVB2_WRITE_STATUS | // Writes are curren= tly enabled + EFI_FVB2_WRITE_ENABLED_CAP; // Writes may be ena= bled + } + + *Attributes =3D FlashFvbAttributes; + + DEBUG ((DEBUG_BLKIO, "FvbGetAttributes(0x%X)\n", *Attributes)); + + return EFI_SUCCESS; +} + +/** + The SetAttributes() function sets configurable firmware volume attributes + and returns the new settings of the firmware volume. + + + @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_= PROTOCOL instance. + + @param Attributes On input, Attributes is a pointer to EFI_= FVB_ATTRIBUTES_2 + that contains the desired firmware volume= settings. + On successful return, it contains the new= settings of + the firmware volume. + Type EFI_FVB_ATTRIBUTES_2 is defined in E= FI_FIRMWARE_VOLUME_HEADER. + + @retval EFI_SUCCESS The firmware volume attributes were retur= ned. + + @retval EFI_INVALID_PARAMETER The attributes requested are in conflict = with the capabilities + as declared in the firmware volume header. + + **/ +EFI_STATUS +EFIAPI +FvbSetAttributes( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes + ) +{ + DEBUG ((DEBUG_BLKIO, "FvbSetAttributes(0x%X) is not supported\n",*Attrib= utes)); + return EFI_UNSUPPORTED; +} + +/** + The GetPhysicalAddress() function retrieves the base address of + a memory-mapped firmware volume. This function should be called + only for memory-mapped firmware volumes. + + @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOC= OL instance. + + @param Address Pointer to a caller-allocated + EFI_PHYSICAL_ADDRESS that, on successful + return from GetPhysicalAddress(), contains the + base address of the firmware volume. + + @retval EFI_SUCCESS The firmware volume base address was returned. + + @retval EFI_NOT_SUPPORTED The firmware volume is not memory mapped. + + **/ +EFI_STATUS +EFIAPI +FvbGetPhysicalAddress ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + OUT EFI_PHYSICAL_ADDRESS *Address + ) +{ + *Address =3D mFlashNvStorageVariableBase; + return EFI_SUCCESS; +} + +/** + The GetBlockSize() function retrieves the size of the requested + block. It also returns the number of additional blocks with + the identical size. The GetBlockSize() function is used to + retrieve the block map (see EFI_FIRMWARE_VOLUME_HEADER). + + + @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_= PROTOCOL instance. + + @param Lba Indicates the block for which to return t= he size. + + @param BlockSize Pointer to a caller-allocated UINTN in wh= ich + the size of the block is returned. + + @param NumberOfBlocks Pointer to a caller-allocated UINTN in + which the number of consecutive blocks, + starting with Lba, is returned. All + blocks in this range have a size of + BlockSize. + + + @retval EFI_SUCCESS The firmware volume base address was retu= rned. + + @retval EFI_INVALID_PARAMETER The requested LBA is out of range. + + **/ +EFI_STATUS +EFIAPI +FvbGetBlockSize ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN EFI_LBA Lba, + OUT UINTN *BlockSize, + OUT UINTN *NumberOfBlocks + ) +{ + EFI_STATUS Status; + NOR_FLASH_INSTANCE *Instance; + + Instance =3D INSTANCE_FROM_FVB_THIS(This); + + DEBUG ((DEBUG_BLKIO, "FvbGetBlockSize(Lba=3D%ld, BlockSize=3D0x%x, LastB= lock=3D%ld)\n", + Lba, Instance->Media.BlockSize, Instance->Media.LastBlock)); + + if (Lba > Instance->Media.LastBlock) { + DEBUG ((DEBUG_ERROR, "%a : Parameter LBA %ld is beyond the last Lba (%= ld)\n", + __FUNCTION__, Lba, Instance->Media.LastBlock)); + Status =3D EFI_INVALID_PARAMETER; + } else { + // In this platform each NorFlash device has equal sized blocks. + *BlockSize =3D (UINTN) Instance->Media.BlockSize; + *NumberOfBlocks =3D (UINTN) (Instance->Media.LastBlock - Lba + 1); + + DEBUG ((DEBUG_BLKIO, "%a : *BlockSize=3D0x%x, *NumberOfBlocks=3D0x%x.\= n", + __FUNCTION__, *BlockSize, *NumberOfBlocks)); + + Status =3D EFI_SUCCESS; + } + + return Status; +} + +/** + Reads the specified number of bytes into a buffer from the specified bloc= k. + + The Read() function reads the requested number of bytes from the + requested block and stores them in the provided buffer. + Implementations should be mindful that the firmware volume + might be in the ReadDisabled state. If it is in this state, + the Read() function must return the status code + EFI_ACCESS_DENIED without modifying the contents of the + buffer. The Read() function must also prevent spanning block + boundaries. If a read is requested that would span a block + boundary, the read must read up to the boundary but not + beyond. The output parameter NumBytes must be set to correctly + indicate the number of bytes actually read. The caller must be + aware that a read may be partially completed. + + @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROT= OCOL instance. + + @param Lba The starting logical block index from which t= o read. + + @param Offset Offset into the block at which to begin readi= ng. + + @param NumBytes Pointer to a UINTN. + At entry, *NumBytes contains the total size o= f the buffer. + At exit, *NumBytes contains the total number = of bytes read. + + @param Buffer Pointer to a caller-allocated buffer that wil= l be used + to hold the data that is read. + + @retval EFI_SUCCESS The firmware volume was read successfully, a= nd contents are + in Buffer. + + @retval EFI_BAD_BUFFER_SIZE Read attempted across an LBA boundary. + On output, NumBytes contains the total number= of bytes + returned in Buffer. + + @retval EFI_ACCESS_DENIED The firmware volume is in the ReadDisabled st= ate. + + @retval EFI_DEVICE_ERROR The block device is not functioning correctly= and could not be read. + + **/ +EFI_STATUS +EFIAPI +FvbRead ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN OUT UINT8 *Buffer + ) +{ + UINTN BlockSize; + NOR_FLASH_INSTANCE *Instance; + + Instance =3D INSTANCE_FROM_FVB_THIS (This); + + DEBUG ((DEBUG_BLKIO, "FvbRead(Parameters: Lba=3D%ld, Offset=3D0x%x, " + "*NumBytes=3D0x%x, Buffer @ 0x%08x)\n", + Instance->StartLba + Lba, Offset, *NumBytes, Buffer)); + + if (!Instance->Initialized && Instance->Initialize) { + Instance->Initialize(Instance); + } + + // Cache the block size to avoid de-referencing pointers all the time + BlockSize =3D Instance->Media.BlockSize; + + DEBUG ((DEBUG_BLKIO, "FvbRead: Check if (Offset=3D0x%x + NumBytes=3D0x%x= ) <=3D " + "BlockSize=3D0x%x\n", Offset, *NumBytes, BlockSize )); + + // The read must not span block boundaries. + while (Offset >=3D BlockSize) { + Offset -=3D BlockSize; + Lba++; + } + + if ((Instance->StartLba + Lba) > Instance->Media.LastBlock) { + DEBUG ((DEBUG_ERROR, "%a : Parameter LBA %ld is beyond the last Lba (%= ld)\n", + __FUNCTION__, Lba, Instance->Media.LastBlock)); + return EFI_INVALID_PARAMETER; + } + + if ((Offset + *NumBytes) > BlockSize) { + *NumBytes =3D BlockSize-Offset; + } + + return NorFlashPlatformRead (Instance, Instance->StartLba + Lba, + Offset, *NumBytes, Buffer); +} + +/** + Writes the specified number of bytes from the input buffer to the block. + + The Write() function writes the specified number of bytes from + the provided buffer to the specified block and offset. If the + firmware volume is sticky write, the caller must ensure that + all the bits of the specified range to write are in the + EFI_FVB_ERASE_POLARITY state before calling the Write() + function, or else the result will be unpredictable. This + unpredictability arises because, for a sticky-write firmware + volume, a write may negate a bit in the EFI_FVB_ERASE_POLARITY + state but cannot flip it back again. Before calling the + Write() function, it is recommended for the caller to first call + the EraseBlocks() function to erase the specified block to + write. A block erase cycle will transition bits from the + (NOT)EFI_FVB_ERASE_POLARITY state back to the + EFI_FVB_ERASE_POLARITY state. Implementations should be + mindful that the firmware volume might be in the WriteDisabled + state. If it is in this state, the Write() function must + return the status code EFI_ACCESS_DENIED without modifying the + contents of the firmware volume. The Write() function must + also prevent spanning block boundaries. If a write is + requested that spans a block boundary, the write must store up + to the boundary but not beyond. The output parameter NumBytes + must be set to correctly indicate the number of bytes actually + written. The caller must be aware that a write may be + partially completed. All writes, partial or otherwise, must be + fully flushed to the hardware before the Write() service + returns. + + @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROT= OCOL instance. + + @param Lba The starting logical block index to write to. + + @param Offset Offset into the block at which to begin writi= ng. + + @param NumBytes The pointer to a UINTN. + At entry, *NumBytes contains the total size o= f the buffer. + At exit, *NumBytes contains the total number = of bytes actually written. + + @param Buffer The pointer to a caller-allocated buffer that= contains the source for the write. + + @retval EFI_SUCCESS The firmware volume was written successfully. + + @retval EFI_BAD_BUFFER_SIZE The write was attempted across an LBA boundar= y. + On output, NumBytes contains the total number= of bytes + actually written. + + @retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabled s= tate. + + @retval EFI_DEVICE_ERROR The block device is malfunctioning and could = not be written. + + + **/ +EFI_STATUS +EFIAPI +FvbWrite ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ) +{ + NOR_FLASH_INSTANCE *Instance; + UINTN BlockSize; + + Instance =3D INSTANCE_FROM_FVB_THIS (This); + // Cache the block size to avoid de-referencing pointers all the time + BlockSize =3D Instance->Media.BlockSize; + + if (!Instance->Initialized && Instance->Initialize) { + Instance->Initialize(Instance); + } + + // The write must not span block boundaries. + while(Offset >=3D BlockSize) { + Offset -=3D BlockSize; + Lba++; + } + + if ((Instance->StartLba + Lba) > Instance->Media.LastBlock) { + DEBUG ((DEBUG_ERROR, "%a : Parameter LBA %ld is beyond the last Lba (%= ld)\n", + __FUNCTION__, Lba, Instance->Media.LastBlock)); + return EFI_INVALID_PARAMETER; + } + + if ((Offset + *NumBytes) > BlockSize) { + *NumBytes =3D BlockSize-Offset; + } + + return NorFlashWrite (Instance, Instance->StartLba + Lba, + Offset, NumBytes, Buffer); +} + +/** + Erases and initialises a firmware volume block. + + The EraseBlocks() function erases one or more blocks as denoted + by the variable argument list. The entire parameter list of + blocks must be verified before erasing any blocks. If a block is + requested that does not exist within the associated firmware + volume (it has a larger index than the last block of the + firmware volume), the EraseBlocks() function must return the + status code EFI_INVALID_PARAMETER without modifying the contents + of the firmware volume. Implementations should be mindful that + the firmware volume might be in the WriteDisabled state. If it + is in this state, the EraseBlocks() function must return the + status code EFI_ACCESS_DENIED without modifying the contents of + the firmware volume. All calls to EraseBlocks() must be fully + flushed to the hardware before the EraseBlocks() service + returns. + + @param This Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_= PROTOCOL + instance. + + @param ... The variable argument list is a list of t= uples. + Each tuple describes a range of LBAs to e= rase + and consists of the following: + - An EFI_LBA that indicates the starting = LBA + - A UINTN that indicates the number of bl= ocks to erase. + + The list is terminated with an EFI_LBA_LI= ST_TERMINATOR. + For example, the following indicates that= two ranges of blocks + (5-7 and 10-11) are to be erased: + EraseBlocks (This, 5, 3, 10, 2, EFI_LBA_L= IST_TERMINATOR); + + @retval EFI_SUCCESS The erase request successfully completed. + + @retval EFI_ACCESS_DENIED The firmware volume is in the WriteDisabl= ed state. + + @retval EFI_DEVICE_ERROR The block device is not functioning corre= ctly and could not be written. + The firmware device may have been partial= ly erased. + + @retval EFI_INVALID_PARAMETER One or more of the LBAs listed in the var= iable argument list do + not exist in the firmware volume. + + **/ +EFI_STATUS +EFIAPI +FvbEraseBlocks ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + ... + ) +{ + EFI_STATUS Status; + VA_LIST Args; + UINTN BlockAddress; // Physical address of Lba to erase + EFI_LBA StartingLba; // Lba from which we start erasing + UINTN NumOfLba; // Number of Lba blocks to erase + NOR_FLASH_INSTANCE *Instance; + + Instance =3D INSTANCE_FROM_FVB_THIS (This); + + DEBUG ((DEBUG_BLKIO, "FvbEraseBlocks()\n")); + + Status =3D EFI_SUCCESS; + + // Detect WriteDisabled state + if (Instance->Media.ReadOnly =3D=3D TRUE) { + // Firmware volume is in WriteDisabled state + DEBUG ((DEBUG_ERROR, "%a : Device is in WriteDisabled state\n")); + return EFI_ACCESS_DENIED; + } + + // Before erasing, check the entire list of parameters to + // ensure all specified blocks are valid + + VA_START (Args, This); + do { + // Get the Lba from which we start erasing + StartingLba =3D VA_ARG (Args, EFI_LBA); + + // Have we reached the end of the list? + if (StartingLba =3D=3D EFI_LBA_LIST_TERMINATOR) { + //Exit the while loop + break; + } + + // How many Lba blocks are we requested to erase? + NumOfLba =3D VA_ARG (Args, UINT32); + + // All blocks must be within range + DEBUG ((DEBUG_BLKIO, "FvbEraseBlocks: Check if: ( StartingLba=3D%ld + " + "NumOfLba=3D%d - 1 ) > LastBlock=3D%ld.\n", + Instance->StartLba + StartingLba, NumOfLba, + Instance->Media.LastBlock)); + if ((NumOfLba =3D=3D 0) || + ((Instance->StartLba + StartingLba + NumOfLba - 1) > + Instance->Media.LastBlock)) { + VA_END (Args); + DEBUG ((DEBUG_ERROR, "%a : Lba range goes past the last Lba\n")); + Status =3D EFI_INVALID_PARAMETER; + goto EXIT; + } + } while (TRUE); + VA_END (Args); + + // + // To get here, all must be ok, so start erasing + // + VA_START (Args, This); + do { + // Get the Lba from which we start erasing + StartingLba =3D VA_ARG (Args, EFI_LBA); + + // Have we reached the end of the list? + if (StartingLba =3D=3D EFI_LBA_LIST_TERMINATOR) { + // Exit the while loop + break; + } + + // How many Lba blocks are we requested to erase? + NumOfLba =3D VA_ARG (Args, UINT32); + + // Go through each one and erase it + while (NumOfLba > 0) { + + // Get the physical address of Lba to erase + BlockAddress =3D GET_NOR_BLOCK_ADDRESS ( + Instance->RegionBaseAddress, + Instance->StartLba + StartingLba, + Instance->Media.BlockSize + ); + + // Erase it + DEBUG ((DEBUG_BLKIO, "FvbEraseBlocks: Erasing Lba=3D%ld @ 0x%08x.\n", + Instance->StartLba + StartingLba, BlockAddress)); + Status =3D NorFlashPlatformEraseSector(Instance, BlockAddress); + if (EFI_ERROR (Status)) { + VA_END (Args); + Status =3D EFI_DEVICE_ERROR; + goto EXIT; + } + + // Move to the next Lba + StartingLba++; + NumOfLba--; + } + } while (TRUE); + VA_END (Args); + +EXIT: + return Status; +} + +/** + Fixup internal data so that EFI can be call in virtual mode. + Call the passed in Child Notify event and convert any pointers in + lib to virtual mode. + + @param[in] Event The Event that is being processed + @param[in] Context Event Context +**/ +VOID +EFIAPI +FvbVirtualNotifyEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EfiConvertPointer (0x0, (VOID**)&mFlashNvStorageVariableBase); + return; +} + +EFI_STATUS +EFIAPI +NorFlashFvbInitialize ( + IN NOR_FLASH_INSTANCE* Instance + ) +{ + EFI_STATUS Status; + UINT32 FvbNumLba; + EFI_BOOT_MODE BootMode; + UINTN RuntimeMmioRegionSize; + + DEBUG ((DEBUG_BLKIO,"NorFlashFvbInitialize\n")); + + Instance->Initialized =3D TRUE; + mFlashNvStorageVariableBase =3D FixedPcdGet64 (PcdFlashNvStorageVariable= Base64); + + // Set the index of the first LBA for the FVB + Instance->StartLba =3D (PcdGet64 (PcdFlashNvStorageVariableBase64) - Ins= tance->RegionBaseAddress) / Instance->Media.BlockSize; + + BootMode =3D GetBootModeHob (); + if (BootMode =3D=3D BOOT_WITH_DEFAULT_SETTINGS) { + Status =3D EFI_INVALID_PARAMETER; + } + else { + // Determine if there is a valid header at the beginning of the NorFla= sh + Status =3D ValidateFvHeader (Instance); + } + + // Install the Default FVB header if required + if (EFI_ERROR (Status)) { + // There is no valid header, so time to install one. + DEBUG ((DEBUG_INFO, "%a: The FVB Header is not valid.\n", __FUNCTION__= )); + DEBUG ((DEBUG_INFO, "%a: Installing a correct one for this volume.\n", + __FUNCTION__)); + + // Erase all the NorFlash that is reserved for variable storage + FvbNumLba =3D (PcdGet32 (PcdFlashNvStorageVariableSize) + PcdGet32 (Pc= dFlashNvStorageFtwWorkingSize) + PcdGet32 (PcdFlashNvStorageFtwSpareSize)) = / Instance->Media.BlockSize; + + Status =3D FvbEraseBlocks (&Instance->FvbProtocol, (EFI_LBA)0, FvbNumL= ba, EFI_LBA_LIST_TERMINATOR); + if (EFI_ERROR (Status)) + return Status; + + // Install all appropriate headers + Status =3D InitializeFvAndVariableStoreHeaders (Instance); + if (EFI_ERROR (Status)) { + return Status; + } + } + + // + // Declare the Non-Volatile storage as EFI_MEMORY_RUNTIME + // + + // Note: all the NOR Flash region needs to be reserved into the UEFI Run= time memory; + // even if we only use the small block region at the top of the NO= R Flash. + // The reason is when the NOR Flash memory is set into program mod= e, the command + // is written as the base of the flash region (ie: Instance->Devic= eBaseAddress) + RuntimeMmioRegionSize =3D (Instance->RegionBaseAddress - Instance->Devic= eBaseAddress) + Instance->Size; + + Status =3D gDS->AddMemorySpace ( + EfiGcdMemoryTypeMemoryMappedIo, + Instance->DeviceBaseAddress, RuntimeMmioRegionSize, + EFI_MEMORY_UC | EFI_MEMORY_RUNTIME + ); + ASSERT_EFI_ERROR (Status); + + Status =3D gDS->SetMemorySpaceAttributes ( + Instance->DeviceBaseAddress, RuntimeMmioRegionSize, + EFI_MEMORY_UC | EFI_MEMORY_RUNTIME); + ASSERT_EFI_ERROR (Status); + + // + // Register for the virtual address change event + // + Status =3D gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_NOTIFY, + FvbVirtualNotifyEvent, + NULL, + &gEfiEventVirtualAddressChangeGuid, + &mFvbVirtualAddrChangeEvent + ); + ASSERT_EFI_ERROR (Status); + + return Status; +} diff --git a/Platform/NXP/Include/Library/NorFlash.h b/Platform/NXP/Include= /Library/NorFlash.h new file mode 100644 index 0000000..37099ff --- /dev/null +++ b/Platform/NXP/Include/Library/NorFlash.h @@ -0,0 +1,222 @@ +/** @NorFlash.h + + Based on NOR flash access APIs used in ArmPlatformPkg/Drivers/NorFlashDx= e/NorFlashDxe.h + + Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved. + Copyright 2017 NXP + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#ifndef __NOR_FLASH_H__ +#define __NOR_FLASH_H__ + +#include +#include + +#define NOR_FLASH_ERASE_RETRY 10 + +#define GET_NOR_BLOCK_ADDRESS(BaseAddr,Lba,LbaSize) ( BaseAddr + (UINTN)((= Lba) * LbaSize) ) + +#define NOR_FLASH_SIGNATURE SIGNATURE_32('n', 'o', '= r', '0') +#define INSTANCE_FROM_FVB_THIS(a) CR(a, NOR_FLASH_INSTANCE= , FvbProtocol, NOR_FLASH_SIGNATURE) +#define INSTANCE_FROM_BLKIO_THIS(a) CR(a, NOR_FLASH_INSTANCE= , BlockIoProtocol, NOR_FLASH_SIGNATURE) + +typedef struct _NOR_FLASH_INSTANCE NOR_FLASH_INSTANCE; + +typedef EFI_STATUS (*NOR_FLASH_INITIALIZE) (NOR_FLASH_INSTANCE* Ins= tance); + +typedef struct { + VENDOR_DEVICE_PATH Vendor; + EFI_DEVICE_PATH_PROTOCOL End; +} NOR_FLASH_DEVICE_PATH; + +struct _NOR_FLASH_INSTANCE { + UINT32 Signature; + EFI_HANDLE Handle; + BOOLEAN Initialized; + NOR_FLASH_INITIALIZE Initialize; + UINTN DeviceBaseAddress; + UINTN RegionBaseAddress; + UINTN Size; + EFI_LBA StartLba; + EFI_BLOCK_IO_PROTOCOL BlockIoProtocol; + EFI_BLOCK_IO_MEDIA Media; + BOOLEAN SupportFvb; + EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol; + VOID* ShadowBuffer; + NOR_FLASH_DEVICE_PATH DevicePath; +}; + +// +// NorFlashLib.c related +// + +EFI_STATUS +NorFlashPlatformWriteBuffer ( + IN NOR_FLASH_INSTANCE *Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ); + +EFI_STATUS +NorFlashPlatformEraseSector ( + IN NOR_FLASH_INSTANCE *Instance, + IN UINTN SectorAddress + ); + +EFI_STATUS +NorFlashPlatformControllerInitialization ( + VOID + ); + +EFI_STATUS +NorFlashPlatformRead ( + IN NOR_FLASH_INSTANCE *Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN UINTN BufferSizeInBytes, + OUT UINT8 *Buffer + ); + +EFI_STATUS +NorFlashPlatformReset ( + IN UINTN Instance + ); + +extern CONST EFI_GUID* CONST mNorFlashVariableGuid; + +// +// NorFlashFvbDxe.c +// + +EFI_STATUS +EFIAPI +NorFlashFvbInitialize ( + IN NOR_FLASH_INSTANCE* Instance + ); + +EFI_STATUS +EFIAPI +FvbGetAttributes( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + OUT EFI_FVB_ATTRIBUTES_2 *Attributes + ); + +EFI_STATUS +EFIAPI +FvbSetAttributes( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes + ); + +EFI_STATUS +EFIAPI +FvbGetPhysicalAddress( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + OUT EFI_PHYSICAL_ADDRESS *Address + ); + +EFI_STATUS +EFIAPI +FvbGetBlockSize( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN EFI_LBA Lba, + OUT UINTN *BlockSize, + OUT UINTN *NumberOfBlocks + ); + +EFI_STATUS +EFIAPI +FvbRead( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN OUT UINT8 *Buffer + ); + +EFI_STATUS +EFIAPI +FvbWrite( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ); + +EFI_STATUS +EFIAPI +FvbEraseBlocks( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + ... + ); +// +// NorFlashBlockIoDxe.c +// + +// +// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.Reset +// +EFI_STATUS +EFIAPI +NorFlashBlockIoReset ( + IN EFI_BLOCK_IO_PROTOCOL *This, + IN BOOLEAN ExtendedVerification + ); + +// +// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.ReadBlocks +// +EFI_STATUS +EFIAPI +NorFlashBlockIoReadBlocks ( + IN EFI_BLOCK_IO_PROTOCOL *This, + IN UINT32 MediaId, + IN EFI_LBA Lba, + IN UINTN BufferSizeInBytes, + OUT VOID *Buffer +); + +// +// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.WriteBlocks +// +EFI_STATUS +EFIAPI +NorFlashBlockIoWriteBlocks ( + IN EFI_BLOCK_IO_PROTOCOL *This, + IN UINT32 MediaId, + IN EFI_LBA Lba, + IN UINTN BufferSizeInBytes, + IN VOID *Buffer +); + +// +// BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.FlushBlocks +// +EFI_STATUS +EFIAPI +NorFlashBlockIoFlushBlocks ( + IN EFI_BLOCK_IO_PROTOCOL *This +); + +EFI_STATUS +NorFlashWrite ( + IN NOR_FLASH_INSTANCE *Instance, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer +); + +#endif /* __NOR_FLASH_DXE_H__ */ diff --git a/Silicon/NXP/Chassis/Chassis.c b/Silicon/NXP/Chassis/Chassis.c index a6a77c2..ab0076f 100644 --- a/Silicon/NXP/Chassis/Chassis.c +++ b/Silicon/NXP/Chassis/Chassis.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -411,3 +412,17 @@ CalculateI2cClockRate ( =20 return SocSysInfo.FreqSystemBus; } + +/** + Initialize IFC device timings +**/ +VOID +IfcInit ( + VOID + ) +{ + // NOR Init + if (FixedPcdGet64 (PcdIfcNorEnabled)) { + IfcNorInit (); + } +} diff --git a/Silicon/NXP/Chassis/Chassis.h b/Silicon/NXP/Chassis/Chassis.h index 4bdb4d0..c8057f0 100644 --- a/Silicon/NXP/Chassis/Chassis.h +++ b/Silicon/NXP/Chassis/Chassis.h @@ -141,4 +141,11 @@ CpuNumCores ( VOID ); =20 +/** + Initialize IFC Device timings + **/ +VOID +IfcInit ( + VOID + ); #endif /* __CHASSIS_H__ */ diff --git a/Silicon/NXP/Chassis/Chassis2/Soc.c b/Silicon/NXP/Chassis/Chass= is2/Soc.c index 2f57929..847bbc2 100644 --- a/Silicon/NXP/Chassis/Chassis2/Soc.c +++ b/Silicon/NXP/Chassis/Chassis2/Soc.c @@ -140,6 +140,7 @@ SocInit ( =20 PrintCpuInfo (); PrintRCW (); + IfcInit (); =20 return; } diff --git a/Silicon/NXP/Chassis/LS1043aSocLib.inf b/Silicon/NXP/Chassis/LS= 1043aSocLib.inf index e6e7ac4..b11fdc2 100644 --- a/Silicon/NXP/Chassis/LS1043aSocLib.inf +++ b/Silicon/NXP/Chassis/LS1043aSocLib.inf @@ -32,6 +32,7 @@ BeIoLib DebugLib SerialPortLib + NorFlashLib =20 [Sources.common] Chassis.c @@ -45,3 +46,4 @@ gNxpQoriqLsTokenSpaceGuid.PcdSerdes2Enabled gNxpQoriqLsTokenSpaceGuid.PcdGurBigEndian gNxpQoriqLsTokenSpaceGuid.PcdClkBaseAddr + gNxpQoriqLsTokenSpaceGuid.PcdIfcNorEnabled --=20 1.9.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Tue Dec 24 13:12:53 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1513744936445747.7361226529504; Tue, 19 Dec 2017 20:42:16 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id C394B222447C7; Tue, 19 Dec 2017 20:37:24 -0800 (PST) Received: from NAM01-BY2-obe.outbound.protection.outlook.com (mail-by2nam01on0072.outbound.protection.outlook.com [104.47.34.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 4B56321CB8665 for ; Tue, 19 Dec 2017 20:37:23 -0800 (PST) Received: from BN6PR03CA0088.namprd03.prod.outlook.com (10.164.122.154) by CY4PR03MB2696.namprd03.prod.outlook.com (10.173.43.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.323.15; Wed, 20 Dec 2017 04:42:09 +0000 Received: from BY2FFO11FD004.protection.gbl (2a01:111:f400:7c0c::158) by BN6PR03CA0088.outlook.office365.com (2603:10b6:405:6f::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.323.15 via Frontend Transport; Wed, 20 Dec 2017 04:42:08 +0000 Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11FD004.mail.protection.outlook.com (10.1.14.158) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.302.6 via Frontend Transport; Wed, 20 Dec 2017 04:41:55 +0000 Received: from uefi-OptiPlex-790.ap.freescale.net ([10.232.132.56]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id vBK4fsdh019373; Tue, 19 Dec 2017 21:42:05 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.34.72; helo=nam01-by2-obe.outbound.protection.outlook.com; envelope-from=vabhav.sharma@nxp.com; receiver=edk2-devel@lists.01.org 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; From: Vabhav To: , , , Date: Tue, 19 Dec 2017 22:10:11 +0530 Message-ID: <1513701611-19990-5-git-send-email-vabhav.sharma@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1513701611-19990-1-git-send-email-vabhav.sharma@nxp.com> References: <1513701611-19990-1-git-send-email-vabhav.sharma@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131582185160800977; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(336005)(7966004)(396003)(346002)(39860400002)(39380400002)(376002)(2980300002)(1110001)(1109001)(339900001)(199004)(189003)(5660300001)(85426001)(106466001)(966005)(305945005)(53936002)(16586007)(47776003)(316002)(2906002)(77096006)(104016004)(105606002)(6306002)(6666003)(356003)(4326008)(53376002)(2950100002)(86362001)(15188155005)(50466002)(16799955002)(97736004)(54906003)(575784001)(81166006)(8676002)(2201001)(68736007)(50226002)(114624004)(48376002)(36756003)(110136005)(8656006)(81156014)(51416003)(8936002)(76176011)(498600001)(59450400001)(142933001)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR03MB2696; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD004; 1:9mDi7juO/lkLm9GWRdKhCN/WnAuzYC7RZEmWv7lYanX+G77uZtJsS+nFx0rcOEKIR5tszXtpFcOjwS4uLiE1JLN/6U7FRSOd9QKhAr9rEiUjt3bwI4UVx+Okos88bIx1 MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 566f59ea-10b6-493c-1972-08d54763ffbc X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4628075)(201703131517081)(2017052603307); SRVR:CY4PR03MB2696; X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2696; 3:huAYeccRQImluv37wK8Pvu/rNJP6OoHIDvCgUmHN0HjE+Z2UJE0TiTjgXpSwUEosKrt5OSoGKKREy968+5m/VSVfCrHCk6Koz/kF790t1P2BCtobr2BuJiMfH/bHML8ALuX6nL4ST5iu4/mY9qmpdyOgo4kyCnvd5nu+I8NXg4jk+2z5bgKv6HZGvYa53cehIIfDbY7feelEuXuLY2xMpf3A6ddWlNVcn3VMadd2dgkiAnTejH1+IWCC9Qq/4maR5qsv9jFoi7jFORHUs2ubqI0s89klEjj3ZS85dSqvONbakBzWIH16gAKRCgUwHULWBeGkchlpUTjpa/Md0KLM/6m2U92Yh4Z2dNEhY6zXsGo=; 25:Rh70xyAxSdglB5vx5lgVUlq+OtXlxq+jV+heY+iR0ZPruPQzAnO1QFV2KW624fjMQtGnwopZ9+6cl7zW4RCjsllkbuwr75Axtq4/7evhAyxlcW5DTlETnTSuyA/sVkLCvM0zf/7qJZeBZA+t4e2sIf+QscwPbbrwAqf7Ufz50bjqITA0nbV2CkA6nSjDisFvh2QNpai5OfpInw5X7YGw2ONLpay0HTTKu6mzKFxdk6ExUPrrxm0W4/HGDa+e6DuUCimmghsNJygnJ1w4UdNuny73jVV4pja/t7uZxtSvRdaFRaOCW4TD49fvw/iQYUNxYJGRh0CITVCdyNB7cL9cew== X-MS-TrafficTypeDiagnostic: CY4PR03MB2696: X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2696; 31:LaOHUSro5JuQWtzfH7NXfrqSkZrC1gouMq5wgKJ151fQIiP4YafRKJbM4emMPXtdMaHqnTLAuVKV4NBB0I5fBJfq6lHyk2zJNZkbhpn4xbNoMBPnCeHEQAou7kRCpq1dw/zElPH0VIwMZVfxOaNr1j5dQK2vaixjiL6/+onWDhl5ILY+5PtPKKxNP6I3tXSeVZPUAfUmPGxCYpeLeUBWxJ5KSBFJ2bog2e7Fe4my7Ac=; 4:FVh2ukGEVfveUYIcfuLNHAL55SzQxFxahhp/TwOuzKtAfBzmUnemf2Eq7FcG8JnIm/DQEtTmxy3Fh6vi2ycZsCf3SNdfsRtYH7NEDwlSpRx2oa2ntLw72286T2RwvkgIMzGWOLQy4ejwRgNvj/ZAkYnW6fyORZEf5EodWLXjhdVkgc1WhgaN3cqrAN6D97wRmqy8kdQUMj/xZG0TNKwGR+pXdoA0AGqrYfdRF1ndcTRM0fibBiwf8zQV4W6N3RA43mrTjYZTWMc9s1I2cIjFBEfmllzoCY5/FZG3V5GOyG8ogs7fD1rOLheT8ugfvDhx X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(2401047)(5005006)(8121501046)(10201501046)(93006095)(93001095)(3231023)(3002001)(6055026)(6096035)(20161123563025)(20161123565025)(20161123556025)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150)(20161123559100)(20161123561025)(201708071742011); SRVR:CY4PR03MB2696; BCL:0; PCL:0; RULEID:(100000803101)(100110400095)(400006); SRVR:CY4PR03MB2696; X-Forefront-PRVS: 0527DFA348 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR03MB2696; 23:PPcwu0yJmQkvLnLKWEZSXYZhMGVitYE65kAnVjB0m?= =?us-ascii?Q?WOVeF//3PAwPb4Ws9EfRV/hpgmFESqlCSfUZOseZTydDLruxULxYm+RmVBkw?= =?us-ascii?Q?HZxoGNzm1HrJ/x+sCPTJm1p+8A9kFMWr6x24fjoMl3ST6exRL06GPa5H9/VX?= =?us-ascii?Q?A8qvHVuUYjbZHTq0K4zlZgWABNyTIHDxQHN2nA1yynJkrRmnfno3yRafi+rF?= =?us-ascii?Q?IiMVIHKpRSEqgS2JbbWt3yNf5tyBa2674j/Y2xTkeLDxYPx3yzlCp6S7ywro?= =?us-ascii?Q?dqq1nNmSr3w7q0DU8FKqlzoem8gIsF5gIPlGOzv5diFhgjmxcsNLPK8PO3iG?= =?us-ascii?Q?EJbfhJKjTA7feiHxfZAAYeCDr4WFNRWVZGf3j5r0MEKmOA1YN3zdI6Wb6jdZ?= =?us-ascii?Q?vCbrq3q4qc7YMAOX5FntCm5q2on100t96TuUG2ktVvcadiDj63g89PcunPQF?= =?us-ascii?Q?dcpmw9AfMAZ7ZiH0ozeeosL+lGjJL1naochRZaBPVRnV/LA55t+jQgXFU+sh?= =?us-ascii?Q?RKkXBf09OSY9GBMZJVeo5OMMtirWUTxmipcsAFORsd06WBfFudi4ro3Q9ypN?= =?us-ascii?Q?L/fRM1p0OKQwrjBKH1YWCNgl3xUyxqYTNIluMjiTQ799i8B5R2afd4V1Hf9d?= =?us-ascii?Q?I/XmKgiZyKF2SRb/PLQqch8xFuXpLCB9uCPpnqYaffoZgoT4/23VN2d/5ec9?= =?us-ascii?Q?YOEsczM+g3ye4Hps1sQMhcGjU/adw8R1hTsRrkS6UxeEOhLXaS1iTxo7edag?= =?us-ascii?Q?wDJx3s/WggYoQCElDF3b+jEEu4LxfD0MKFRtiIfKO4gfw515e6bbtGEjuUHO?= =?us-ascii?Q?rEFnZvOhP6gq+mZ1K9mVXwtmWbN9LGyhzlXSnStSrFLPcpQ/iNj6iNe/eWmp?= =?us-ascii?Q?V0HCGTP2Dgos9sSOZk/W0G0KTmpaD4RA5qLxb5WT4iBF6j7w5B/YMdbagawj?= =?us-ascii?Q?BXHAOtH0LvZ8GJ4lNOGecFcwzWpGtqGv0k3okAmOEc6lXElBVbIFy/bWpprK?= =?us-ascii?Q?fTS/gP52tOqFuN/R9RxabV3WbIWme0ufDoSXw14iOi/34dToIsrut1TuwR2N?= =?us-ascii?Q?JiEAjWBNleNjdGY2f3x9Qo68gUfto4c5UVBjcAovwKwW8mGgE1Vq8+T9ys+8?= =?us-ascii?Q?siT34ItG+rkYPLibzhDuVPY/oRHjRS1f1hNnaad8R7gyCtJQPJu9YZCDCca2?= =?us-ascii?Q?sqKCOM2p30JivF/c4+gr05oua09KHM6OI9LVZldsakgcCy2BRtB6zJfbkwQ0?= =?us-ascii?Q?7zx/bIqYxAFtXxBhXYpnvMOWznTCmMWRDDUiuHT5pPWVxCLU6uGxxEXUNl65?= =?us-ascii?Q?hs86/ztRX/TA7+VnLrmnLzI+XfYF8HFZbhtv5EvkjEy?= X-Microsoft-Exchange-Diagnostics: 1; CY4PR03MB2696; 6:a8S9tuagvivR3tuE60tbKRkZtwJ+jnYs1V9fijJ3Mxuwn/8tcB5yO9EMhWwLJ1vy6Q2dNj0NKPlmNUivWJBRavPRwyvfc08X9yOX69J8oa1eFPjD22p4yvzcF9VNNEAeT69W350C9BeVAqLEwfNHQTwm0hVpiIAHgFn+BrM1X+RaJ6tS/pvWhi5MQTZf7OFhg+yy0KlUzI4/sDxqMi+xRdXnEl3NvYCuFeElMtHcepdv4Dy5Sv8nOSn2KgUZeSLM1F6crZVCNbrv84QB+esDiWnjTDihTU2Rhlfmvv4u+vTn2M4TvlXRs3QOKKwcPRliZqsm1dqYej/+rCP9NEAWv6cnziXIEpNA6wRwb8Fwuqo=; 5:4CF2BJSVilehklj5Q7RAtPKJMCrYqgDlwwshKHMXtlJK/yFlFJpbBxStl8O9VeyPyTIsdyQGi4VLdCQYypyZ9wdHdracE0xoQTqNNumE2OqwQDTh5ukunBCjyz8hwEc/BPrHeSd0H8Jfl/OfnyOeM4NmnRzEj4ePNuO502YCBT8=; 24:gEETi1BT28pVgcHP6wvJi8eOaEO4s3cIIR3+ee+3PbPCKczWQOfdXa1WUHIMEUKhQIvZn3e3CYkgKF28XzssW1X85xgzjBLpOmj9cSH2Hds=; 7:WqUxTj3XIJQAh0qxHFstIAPBYOoZN3tO1yEq/rN6XKV3oX9Vi1Q+GGWLlGBOnBY8/P5C/HDxtH1zErJIw5guVAN2Wl+zg9Jdv64V6NPezRJqqdv/xznBcAf+v7PuQUWJD7AiB+L3g5F3DFyoT4NvawoDjFVWTKr8IlJyUSJcd9jLqhezFIKAjUl60jDISQOk24d2rMP51towViUKSjnTnWlDkA+ZxCWhjAyMWhZQetWH/ptUJ3xwAh3QnN5zpSaN SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Dec 2017 04:41:55.8772 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 566f59ea-10b6-493c-1972-08d54763ffbc 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: CY4PR03MB2696 Subject: [edk2] [PATCH edk2-platforms v2 4/4] Compilation:Modify dsc, fdf files and add inc file X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Enabling support for compilation of IfcFlashLib, NorFlashLib,Nor flash Driver and include runtime variable support Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Vabhav --- Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc | 22 +++++++ Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf | 9 ++- Platform/NXP/LS1043aRdbPkg/VarStore.fdf.inc | 98 ++++++++++++++++++++++++= ++++ Platform/NXP/NxpQoriqLs.dsc | 5 ++ 4 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 Platform/NXP/LS1043aRdbPkg/VarStore.fdf.inc diff --git a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc b/Platform/NXP/LS= 1043aRdbPkg/LS1043aRdbPkg.dsc index 7a72338..e0c02b1 100644 --- a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc +++ b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.dsc @@ -39,6 +39,16 @@ SocLib|edk2-platforms/Silicon/NXP/Chassis/LS1043aSocLib.inf RealTimeClockLib|edk2-platforms/Silicon/Maxim/Library/Ds1307RtcLib/Ds130= 7RtcLib.inf =20 + # + # Nor Lib + # + NorFlashLib|edk2-platforms/Platform/NXP/Library/NorFlashLib/NorFlashLib.= inf + + # + # IFC FLASH Lib + # + IfcFlashLib|edk2-platforms/Platform/NXP/Library/IfcFlashLib/IfcFlashLib.= inf + [PcdsFixedAtBuild.common] gArmPlatformTokenSpaceGuid.PcdFirmwareVendor|"LS1043a RDB board" =20 @@ -57,6 +67,13 @@ gNxpQoriqLsTokenSpaceGuid.PcdIfcBigEndian|TRUE =20 # + # NV Storage PCDs. + # + gArmTokenSpaceGuid.PcdVFPEnabled|1 + gNxpQoriqLsTokenSpaceGuid.PcdFlashDeviceBase64|0x060000000 + gNxpQoriqLsTokenSpaceGuid.PcdFlashReservedRegionBase64|0x60300000 + + # # I2C controller Pcds # gNxpQoriqLsTokenSpaceGuid.PcdI2cBus|0 @@ -76,4 +93,9 @@ edk2-platforms/Platform/NXP/Drivers/WatchDog/WatchDogDxe.inf edk2-platforms/Platform/NXP/Drivers/I2cDxe/I2cDxe.inf =20 + # + # NOR + # + edk2-platforms/Platform/NXP/Drivers/NorFlashDxe/NorFlashDxe.inf + ## diff --git a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf b/Platform/NXP/LS= 1043aRdbPkg/LS1043aRdbPkg.fdf index 44f452a..7d69624 100644 --- a/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf +++ b/Platform/NXP/LS1043aRdbPkg/LS1043aRdbPkg.fdf @@ -54,6 +54,7 @@ NumBlocks =3D 0xEC890 gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize FV =3D FVMAIN_COMPACT =20 +!include VarStore.fdf.inc =20 ##########################################################################= ###### # @@ -103,7 +104,8 @@ READ_LOCK_STATUS =3D TRUE INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf INF EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf - INF MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.= inf + INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf + INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.i= nf INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.i= nf INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf =20 @@ -120,6 +122,11 @@ READ_LOCK_STATUS =3D TRUE INF EmbeddedPkg/SimpleTextInOutSerial/SimpleTextInOutSerial.inf =20 # + # NOR Driver + # + INF edk2-platforms/Platform/NXP/Drivers/NorFlashDxe/NorFlashDxe.inf + + # # Network modules # INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf diff --git a/Platform/NXP/LS1043aRdbPkg/VarStore.fdf.inc b/Platform/NXP/LS1= 043aRdbPkg/VarStore.fdf.inc new file mode 100644 index 0000000..8fb8e42 --- /dev/null +++ b/Platform/NXP/LS1043aRdbPkg/VarStore.fdf.inc @@ -0,0 +1,98 @@ +## @file +# FDF include file with FD definition that defines an empty variable stor= e. +# +# Copyright (c) 2016, Freescale Semiconductor. All rights reserved. +# Copyright (c) 2016, Linaro, Ltd. All rights reserved. +# Copyright (C) 2014, Red Hat, Inc. +# Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved. +# +# This program and the accompanying materials are licensed and made avail= able +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR +# IMPLIED. +# +## + +[FD.LS1043aRdbNv_EFI] + +BaseAddress =3D 0x60300000|gNxpQoriqLsTokenSpaceGuid.PcdNvFdBase #The base= address of the FLASH device +Size =3D 0x000C0000|gNxpQoriqLsTokenSpaceGuid.PcdNvFdSize #The size in by= tes of the FLASH device +ErasePolarity =3D 1 +BlockSize =3D 0x1 +NumBlocks =3D 0xC0000 + +# +# Place NV Storage just above Platform Data Base +# +DEFINE NVRAM_AREA_VARIABLE_BASE =3D 0x00000000 +DEFINE NVRAM_AREA_VARIABLE_SIZE =3D 0x00040000 +DEFINE FTW_WORKING_BASE =3D $(NVRAM_AREA_VARIABLE_B= ASE) + $(NVRAM_AREA_VARIABLE_SIZE) +DEFINE FTW_WORKING_SIZE =3D 0x00040000 +DEFINE FTW_SPARE_BASE =3D $(FTW_WORKING_BASE) + $= (FTW_WORKING_SIZE) +DEFINE FTW_SPARE_SIZE =3D 0x00040000 + +##########################################################################= ### +# LS1043ARDB NVRAM Area +# LS1043ARDB NVRAM Area contains: Variable + FTW Working + FTW Spare +##########################################################################= ### + + +$(NVRAM_AREA_VARIABLE_BASE)|$(NVRAM_AREA_VARIABLE_SIZE) +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|gEfiMdeModu= lePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize +#NV_VARIABLE_STORE +DATA =3D { + ## This is the EFI_FIRMWARE_VOLUME_HEADER + # ZeroVector [] + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + # FileSystemGuid: gEfiSystemNvDataFvGuid =3D + # { 0xFFF12B8D, 0x7696, 0x4C8B, + # { 0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50 }} + 0x8D, 0x2B, 0xF1, 0xFF, 0x96, 0x76, 0x8B, 0x4C, + 0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50, + # FvLength: 0xC0000 + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, + # Signature "_FVH" # Attributes + 0x5f, 0x46, 0x56, 0x48, 0x36, 0x0E, 0x00, 0x00, + # HeaderLength # CheckSum # ExtHeaderOffset #Reserved #Revision + 0x48, 0x00, 0xC2, 0xF9, 0x00, 0x00, 0x00, 0x02, + # Blockmap[0]: 0x3 Blocks * 0x40000 Bytes / Block + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, + # Blockmap[1]: End + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ## This is the VARIABLE_STORE_HEADER + # It is compatible with SECURE_BOOT_ENABLE =3D=3D FALSE as well. + # Signature: gEfiAuthenticatedVariableGuid =3D + # { 0xaaf32c78, 0x947b, 0x439a, + # { 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92 }} + 0x78, 0x2c, 0xf3, 0xaa, 0x7b, 0x94, 0x9a, 0x43, + 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92, + # Size: 0x40000 (gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariabl= eSize) - + # 0x48 (size of EFI_FIRMWARE_VOLUME_HEADER) =3D 0x3ffb8 + # This can speed up the Variable Dispatch a bit. + 0xB8, 0xFF, 0x03, 0x00, + # FORMATTED: 0x5A #HEALTHY: 0xFE #Reserved: UINT16 #Reserved1: UINT32 + 0x5A, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +} + +$(FTW_WORKING_BASE)|$(FTW_WORKING_SIZE) +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|gEfiMdeMo= dulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize +#NV_FTW_WORKING +DATA =3D { + # EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER->Signature =3D gEdkiiWorkingBl= ockSignatureGuid =3D + # { 0x9e58292b, 0x7c68, 0x497d, { 0xa0, 0xce, 0x65, 0x0, 0xfd, 0x9f, 0= x1b, 0x95 }} + 0x2b, 0x29, 0x58, 0x9e, 0x68, 0x7c, 0x7d, 0x49, + 0xa0, 0xce, 0x65, 0x0, 0xfd, 0x9f, 0x1b, 0x95, + # Crc:UINT32 #WorkingBlockValid:1, WorkingBlockInvalid:1, Res= erved + 0x5b, 0xe7, 0xc6, 0x86, 0xFE, 0xFF, 0xFF, 0xFF, + # WriteQueueSize: UINT64 + 0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 +} + +$(FTW_SPARE_BASE)|$(FTW_SPARE_SIZE) +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|gEfiMdeModu= lePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize +#NV_FTW_SPARE diff --git a/Platform/NXP/NxpQoriqLs.dsc b/Platform/NXP/NxpQoriqLs.dsc index 768a9e8..30f1c29 100644 --- a/Platform/NXP/NxpQoriqLs.dsc +++ b/Platform/NXP/NxpQoriqLs.dsc @@ -350,6 +350,11 @@ MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.inf + MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf{ + + NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf + } + MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf --=20 1.9.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel