From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail05.groups.io (mail05.groups.io [45.79.224.7]) by spool.mail.gandi.net (Postfix) with ESMTPS id B2AD2D81113 for ; Thu, 16 May 2024 15:19:11 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=ev5gxzjXOFge4bP2C01vnUG6Mc/FiU7io2DJ5RIDhKc=; c=relaxed/simple; d=groups.io; h=Received-SPF:Authentication-Results-Original:Message-ID:Date:User-Agent:Subject:To:Cc:References:From:In-Reply-To:MIME-Version:NoDisclaimer:Original-Authentication-Results:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Resent-Date:Resent-From:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Language:Content-Type:Content-Transfer-Encoding; s=20240206; t=1715872750; v=1; b=n6BmEGRw1vy+e4OM/WXP15e7HZ+Pa+9T446pUe68P8fXx31cou0Nnfiwb++wiUPYdy2+OMGC pjSVKLiqK7vrC87PA4rWmWuSA2ZO0Sx4xp9CDE4igpPj7JLLSqk0H58n0ryibJyHJKdF0zpJDWv KttVifs9Uab+HRc4JUwdpPVTlxqMEz2qM1dIk0kyVfxEn+xWUNDTwHc/+IRtRYlqyN4ldURw9fh RLskhZ+MxRiFhUGpVkC+/Oaa01kXOwCeyEvzbyHiSyGf1zW/l2DzxWt/f7oumQ3l3OYNbTj6HwN XmjneQ6kGaq0NTSPPCL665y7ON/PeH9Lm7NyWnefp2zmQ== X-Received: by 127.0.0.2 with SMTP id 5Pn6YY7687511xyCPo6jMQfG; Thu, 16 May 2024 08:19:10 -0700 X-Received: from EUR05-DB8-obe.outbound.protection.outlook.com (EUR05-DB8-obe.outbound.protection.outlook.com [40.107.20.66]) by mx.groups.io with SMTP id smtpd.web11.16899.1715872749064001832 for ; Thu, 16 May 2024 08:19:09 -0700 X-Received: from AM0PR06CA0141.eurprd06.prod.outlook.com (2603:10a6:208:ab::46) by AS8PR08MB8420.eurprd08.prod.outlook.com (2603:10a6:20b:566::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7587.27; Thu, 16 May 2024 15:19:05 +0000 X-Received: from AMS0EPF00000192.eurprd05.prod.outlook.com (2603:10a6:208:ab:cafe::bc) by AM0PR06CA0141.outlook.office365.com (2603:10a6:208:ab::46) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7587.28 via Frontend Transport; Thu, 16 May 2024 15:19:05 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=arm.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C X-Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AMS0EPF00000192.mail.protection.outlook.com (10.167.16.218) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.7587.21 via Frontend Transport; Thu, 16 May 2024 15:19:05 +0000 X-Received: ("Tessian outbound b7675f20d34d:v315"); Thu, 16 May 2024 15:19:04 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 297b916a04b12958 X-CR-MTA-TID: 64aa7808 X-Received: from fe63bd3eca90.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 8D5E7761-EECA-4566-B52A-57A895E0B013.1; Thu, 16 May 2024 15:18:59 +0000 X-Received: from EUR05-DB8-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id fe63bd3eca90.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Thu, 16 May 2024 15:18:59 +0000 Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-Received: from AS8PR08MB6806.eurprd08.prod.outlook.com (2603:10a6:20b:39b::12) by DBBPR08MB10604.eurprd08.prod.outlook.com (2603:10a6:10:536::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7587.27; Thu, 16 May 2024 15:18:57 +0000 X-Received: from AS8PR08MB6806.eurprd08.prod.outlook.com ([fe80::1e13:dc65:224e:219c]) by AS8PR08MB6806.eurprd08.prod.outlook.com ([fe80::1e13:dc65:224e:219c%5]) with mapi id 15.20.7587.028; Thu, 16 May 2024 15:18:57 +0000 Message-ID: Date: Thu, 16 May 2024 16:18:54 +0100 User-Agent: Mozilla Thunderbird Subject: Re: [edk2-devel] [PATCH RESEND edk2-platforms][PATCH V2 07/14] Platform/ARM/NorFlashDxe: Switch from NorFlash.c to NorFlashDeviceLib To: Sahil Kaushal , devel@edk2.groups.io Cc: Ard Biesheuvel , Leif Lindholm , sahil , "nd@arm.com" References: <20240423055638.1271531-1-Sahil.Kaushal@arm.com> <20240423055638.1271531-8-Sahil.Kaushal@arm.com> From: "Sami Mujawar" In-Reply-To: <20240423055638.1271531-8-Sahil.Kaushal@arm.com> X-ClientProxiedBy: LO4P123CA0318.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:197::17) To AS8PR08MB6806.eurprd08.prod.outlook.com (2603:10a6:20b:39b::12) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: AS8PR08MB6806:EE_|DBBPR08MB10604:EE_|AMS0EPF00000192:EE_|AS8PR08MB8420:EE_ X-MS-Office365-Filtering-Correlation-Id: 8c05dc29-4334-4ae1-0e7b-08dc75bb8641 x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0;ARA:13230031|376005|1800799015|366007; X-Microsoft-Antispam-Message-Info-Original: =?utf-8?B?eGtJZjMrc1FyeVBndXd2QXQ3RVk1bXc3QytQUjBQWms1emo1WXVGdG0rNDlI?= =?utf-8?B?OHo3SW1waVN5MzRLWjJJR0pkRHNlRXhvYlhkODVwSHFjMGRseFdHME9BZHY4?= =?utf-8?B?OXR2YUlJTzlCRGphNVZpejdoMVppdmFnalYzelgzSGxac01rRzdMYUdZdC83?= =?utf-8?B?ODdOWFo5UjdRajFsdFk4eEU5UlhLTHFBREcxM0xuL2MyQ3RML0MvODBjS2ZO?= =?utf-8?B?TkQ2Qi9wbVlDZmtJZWROd0lNZ2djZWd2VktIalV1eUtHNmJJK2xISVBtemFI?= =?utf-8?B?eis2SjY2VDRGcFpaTmJ3WVpVcmRBVlFxdFJ3dUU1bVQwcFJIbzFtTEx1SExj?= =?utf-8?B?QW9iSmpCbW9haDRMR1NwWG1FUGZVRlYyRjM4MEhpSUtncm5kTW9PMjFaTG1z?= =?utf-8?B?aTNxL2ltRVJuWmtmTkFjRUw1WWxTWnlRZHA1Z09WNWEzM3lEc05zMEJ3MEJv?= =?utf-8?B?WDBhbkRpZy9FaWNvL2dDQkpjNlFpYityV0M2VFZjTVBDNzM4bW1OeFJYakU1?= =?utf-8?B?SHBaeHdnUDkxSVlHUjdTL2E3ZkJ5SXQ3Tm5WTDZhRy9ETm41WERJU3BSNzBt?= =?utf-8?B?cFdHL1lUQ1krNjBYQmp1SndWVTQzdlFzUm02UWQ2NXNhODdwV0ZEUUNUaEk1?= =?utf-8?B?N0dBSytxS3h4SUc3ekVxVmVSUmM2OHMyeHlYbjdRTDdkTDA0TE9ERk1rY1kw?= =?utf-8?B?T21ManNpUjc5cXhpYjFsK2h1b0tDbEFCM2hFaDVrUWpMSmlmUzdpczVSNkV0?= =?utf-8?B?Mi96VGlCV2lvdUxpbFp6U2ZMR2Rma2toWStoQ1ZxbU5XUnppVVFZMlR0V3Z5?= =?utf-8?B?YVZMQnZjOWg4aVlMV0twYnlEV1pTVkljUVo5dGUzdVBtNGgzdXRSNUxkUUQy?= =?utf-8?B?ckRva2hXOXg2Sm1jOE9PR2tEdWxXY2t4bEpPMy94UG82aVFmQzVUVHlublB1?= =?utf-8?B?QVUxbDVYT2pIamp1M05lNTNYSHE0akFZRVc1V24zN0NHRTJjWFV1STZCOEU2?= =?utf-8?B?RDdEbkU4OGUvVkpKc2VGVHgxZWlvOFFjSVk2TFNHa1piTVJQZEFhbHJOa0No?= =?utf-8?B?aFZITDAxVGxXdHpMcU1hRTRVbWEySjJVd01uNW1XWExJN0d0c2JiSXZhdkdj?= =?utf-8?B?UytnVHlkNjdQSXo5TVh3alByemNQSzcwakcxakxZeVVXdmZEYnhkTGF3c2h6?= =?utf-8?B?QjJPMUFSY2NiTTVWeUhVMTRYaGE1RDN1aVFWSk53YzhoMVYxNUpGWmNZR0Iy?= =?utf-8?B?TktWUjZ2VTl0YXVrOUZvRzRXVzQvZUZDNWd3WkpjWTJFT3RadHBDcisxenpQ?= =?utf-8?B?K3lKUi9ycStOelFxVU14czBXaWU3ejJLc2JaQmJGTDAyOE9CbW9wcVh1YkZV?= =?utf-8?B?WHkxUlNsM2V1d0pCblNoV0ZhbjB4eDJrV1g3QmFqWkNQYld4VDdjVWhBdWNU?= =?utf-8?B?Zm1sOXZmTjBZY0pGOXBKZUFPM1JRR01BekFhZDZISWxQMXloTUZJVHl2dXpl?= =?utf-8?B?OVR3ek1YWTlWL2diTko5RERjVzhqazRPQ09MODZtQnNoU2k0U3NVZi9GMW9S?= =?utf-8?B?a1NoY1RMbWJUOU1PRWxueXQ2Y2YzTFpVR3laWjNnMzhaZy8vNDMwZEI3cmlv?= =?utf-8?B?dDZHZVo5V0wwZVFHYlcyYkI1YWV2dWgra2V6RG9ET1Q2RVBmNjFOd1FpVmlW?= =?utf-8?B?RkRvUlhqcGV4cWhOKzJCRDdkbmdDUzIwdmg2aXZ0b2ptVUtMSll4TytRPT0=?= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR08MB6806.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(376005)(1800799015)(366007);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR08MB10604 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AMS0EPF00000192.eurprd05.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 736aa946-c1a3-4703-13be-08dc75bb8176 X-Microsoft-Antispam-Message-Info: =?utf-8?B?eG5Zb3JlMFNJbjRZYTZnY3dETDNTSkJ5ZVVpa0JXaklSRU8zRS90WFp0V3Ft?= =?utf-8?B?TWZUZThnK3RrVVFUWC9DR2ZDT2txdmVMZDNzNTQ5am9yeDNzSUM4emh5WktY?= =?utf-8?B?TnRDWWZDRHBqRHRHSk01QzBJbHdNSmU0bHNlRWd4cEFnbVc4VkxjQmROZkRX?= =?utf-8?B?bWlVWXRMMHcxeFh1Z0NSVXJCVVRkZlJZSTI0cHJ5cS9ZQkp1V3ZGcHl6NTlh?= =?utf-8?B?b0FQVVA3a2JIQUlkSlNzLzBCaVVOdE5sVnlISHRtb3M4SzhCZXl6VHEvNkxC?= =?utf-8?B?WXlZVWtqS3RPT2RyQTB5bkVzMVpsSW94M2pHbFpzenQ5VmJGTHlndmF2U2NB?= =?utf-8?B?eFhTOFUyc1RNMGdLVXpSSGhrK3A3VFdVakp3UlloVmVCeC8yRXVPN1hjNXVS?= =?utf-8?B?K3RuZzVHVUcvQjluWWpXTEp6cEFRdS9EUlJhd244YUliLzJDUGNYWVNNbWda?= =?utf-8?B?M3cza3V5TGVheFl5clUvNU1KYmJHNkFVNCswS3VrUEtValMwdzdXb29LTDRk?= =?utf-8?B?ODFobDZjV3dqUS9TOGpVRDlJVUVTWmNaSXJGeTdCUG1jSjVTY1BuTjBUSE9s?= =?utf-8?B?TEVPcUJXaS81QzlBUzlkaWJ2WmxtRm5Rc3FjaGV1T2FjTUZic3ZMb0ZNb200?= =?utf-8?B?V2xUcm5jUU5pQ0pGNzJ2aWdmN2NFK05jNVFTbnZLeGxZaDdHb2JOVnJwRDUw?= =?utf-8?B?b1lwMER0R0tvV2xsQXNhZmdmQi9LM1U2ZWtQQzJFRkFnQ3puRDVFRld1T0hV?= =?utf-8?B?UW5NTDdTRmwyOG5pNTlwcU12ODhkd2FMYmRnRWdZeXZ0SUpqUWMxeWZJUVd5?= =?utf-8?B?bUY0WmdPamZieGM0OGVlczgyMWdGTGd6azlsWWx2UCtzZFF5ZUVYWVFraEpZ?= =?utf-8?B?L0JoZGNtdzczSnBwYXhwQTZ6RDlHdFhXVk9uNTFjUTNZR2l6WmlYbHA5VnFW?= =?utf-8?B?cjY0aXpnZXFpdDZ6RVFIcWVmaFIwVHdTR1NlM2lRM1J3T3ZCZmNPTXUrTldD?= =?utf-8?B?SlVhMk9BMzBuYzIxRHM1QURPLzFMbUx0LzNMZ1hGZjJYTmtqbG5jUlZrN3lM?= =?utf-8?B?bWtYL2ZKcHhRLy9FUndDMTVrN2V1OFpBcWNRM051b3JaRTgvZ0swa0kxdWZK?= =?utf-8?B?SGJRNG9XOHlhN2p0NGdzTlBQTmxLbVRvN2E1ZlhaQ2pTYXJjSzV2cUZyWEJ3?= =?utf-8?B?SmRoVU1ENElVZ2NDWEJFZElaUE4wdDViYy9FcVJrUWIrMVdCNjQ1ZmRqbWl4?= =?utf-8?B?RGdTR0h5NEZhMlpoaGZ6OVh0K01MTlJSTk9FV3BZMllsYmgweXhBaW1wMTNQ?= =?utf-8?B?RjFDclVCOWtBc3ZHcENwWDc2bTE5V3J6MWdwVXZtZXJia29ZQytPTWlBWkZO?= =?utf-8?B?WnhDWGQ1am80ZkF4NWdIVUMwejFoMU9ybFlLa2R3UExzSnY4V0pNM3UwNkVU?= =?utf-8?B?WWFZd0IwejJOcXZwdjUyU3FTeXorejdyRG1QVDJ0NkN2T2ZyR0tCaUtMcy9v?= =?utf-8?B?YXVmR3NFemFUMU1HdUhMTGxpeGgxTGxEU0w0SEFSMEtqMkJxQm5rcm9lUzRn?= =?utf-8?B?RVVBTnYxUVcvbFkzek44L3JYTTB1VGRrN1MwcnhLbVRzUHB3UHBycVRKaUV2?= =?utf-8?B?Ylc1ZVBPQURtRDlMb3VXU05QVWtCMm1PaXRrb25NcU5nTHU4U0VkcGFYYUpo?= =?utf-8?B?cGRRS0liSVhuaUlETUR0ZVRXQ1BDMktqU3kya0xOMVZ3QlVLUGx5cHpMbk1w?= =?utf-8?B?bFlsd2NkQzdpdENJYTVHdnVWVm9NRU9jR0NvbUd6ZEt5bU9hVklQc20rM0ZE?= =?utf-8?Q?/BeFXqceoZj1OPy2thDXnlypA1BNidsErS/B8=3D?= X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2024 15:19:05.0887 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8c05dc29-4334-4ae1-0e7b-08dc75bb8641 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: AMS0EPF00000192.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB8420 Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Resent-Date: Thu, 16 May 2024 08:19:09 -0700 Resent-From: sami.mujawar@arm.com Reply-To: devel@edk2.groups.io,sami.mujawar@arm.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: LDrUeG99VwIpBJhRNSIr5pi0x7686176AA= Content-Language: en-GB Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240206 header.b=n6BmEGRw; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 45.79.224.7 as permitted sender) smtp.mailfrom=bounce@groups.io; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=arm.com (policy=none) Hi Sahil, Thank you for this patch. These changes look good to me. Reviewed-by: Sami Mujawar Regards, Sami Mujawar On 23/04/2024 06:56 am, Sahil Kaushal wrote: > From: sahil > > NorFlashDeviceLib can be used to provide implementations of different > NOR Flash to NorFlashDxe, i.e. NorFlashDxe links with NorFlashDeviceLib > and the platforms can specify their respective NorFlashDeviceLib > instances. > > This patch adds the following major changes: > > 1. Adds changes in NorFlashDxe to look for NorFlashDeviceLib instead of > NorFlash.c for flash specific implementation > > 2. Remove NorFlash.c and NorFlash.h as they are no longer required. > > 3. Add changes to platform description files to provide > P30NorFlashDeviceLib as NorFlashDeviceLib > > Signed-off-by: sahil > --- > Platform/ARM/SgiPkg/SgiPlatform.dsc.inc | 1 + > Platform/ARM/SgiPkg/SgiPlatformMm.dsc.inc | 1 + > Platform/ARM/VExpressPkg/ArmVExpress.dsc.inc | 1 + > Platform/ARM/JunoPkg/ArmJuno.dsc | 1 + > Platform/ARM/VExpressPkg/PlatformStandaloneMm.dsc | 1 + > Platform/ARM/Drivers/NorFlashDxe/NorFlashDxe.inf | 5 +- > Platform/ARM/Drivers/NorFlashDxe/NorFlashStandaloneMm.inf | 6 +- > Platform/ARM/Drivers/NorFlashDxe/NorFlash.h | 108 --- > Platform/ARM/Drivers/NorFlashDxe/NorFlash.c | 953 -------= ------------- > Platform/ARM/Drivers/NorFlashDxe/NorFlashBlockIoDxe.c | 1 - > Platform/ARM/Drivers/NorFlashDxe/NorFlashDxe.c | 1 - > Platform/ARM/Drivers/NorFlashDxe/NorFlashFvb.c | 1 - > Platform/ARM/Drivers/NorFlashDxe/NorFlashStandaloneMm.c | 1 - > 13 files changed, 7 insertions(+), 1074 deletions(-) > > diff --git a/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc b/Platform/ARM/SgiPk= g/SgiPlatform.dsc.inc > index 1bf489ffeb39..3dcf422eab4b 100644 > --- a/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc > +++ b/Platform/ARM/SgiPkg/SgiPlatform.dsc.inc > @@ -34,6 +34,7 @@ > BasePathLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf > > LcdHwLib|ArmPlatformPkg/Library/HdLcd/HdLcd.inf > > LcdPlatformLib|Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi= Lib.inf > > + NorFlashDeviceLib|Platform/ARM/Library/P30NorFlashDeviceLib/P30NorFlas= hDeviceLib.inf > > NorFlashPlatformLib|Platform/ARM/SgiPkg/Library/NorFlashLib/NorFlashL= ib.inf > > HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf > > ResetSystemLib|ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciRese= tSystemLib.inf > > diff --git a/Platform/ARM/SgiPkg/SgiPlatformMm.dsc.inc b/Platform/ARM/Sgi= Pkg/SgiPlatformMm.dsc.inc > index 0dd9ebbfc16c..ab0e2a957a1b 100644 > --- a/Platform/ARM/SgiPkg/SgiPlatformMm.dsc.inc > +++ b/Platform/ARM/SgiPkg/SgiPlatformMm.dsc.inc > @@ -63,6 +63,7 @@ > AuthVariableLib|SecurityPkg/Library/AuthVariableLib/AuthVariableLib.i= nf > > BaseCryptLib|CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf > > IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf > > + NorFlashDeviceLib|Platform/ARM/Library/P30NorFlashDeviceLib/P30NorFlas= hDeviceLib.inf > > NorFlashPlatformLib|Platform/ARM/SgiPkg/Library/NorFlashLib/Standalon= eMmNorFlashLib.inf > > OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf > > RngLib|MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf > > diff --git a/Platform/ARM/VExpressPkg/ArmVExpress.dsc.inc b/Platform/ARM/= VExpressPkg/ArmVExpress.dsc.inc > index 9f51e05af561..70ff049d3248 100644 > --- a/Platform/ARM/VExpressPkg/ArmVExpress.dsc.inc > +++ b/Platform/ARM/VExpressPkg/ArmVExpress.dsc.inc > @@ -93,6 +93,7 @@ > # Versatile Express Specific Libraries > > PlatformPeiLib|ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf > > ArmPlatformSysConfigLib|Platform/ARM/VExpressPkg/Library/ArmVExpressS= ysConfigLib/ArmVExpressSysConfigLib.inf > > + NorFlashDeviceLib|Platform/ARM/Library/P30NorFlashDeviceLib/P30NorFlas= hDeviceLib.inf > > NorFlashPlatformLib|Platform/ARM/VExpressPkg/Library/NorFlashArmVExpr= essLib/NorFlashArmVExpressLib.inf > > ResetSystemLib|ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciRese= tSystemLib.inf > > =20 > > diff --git a/Platform/ARM/JunoPkg/ArmJuno.dsc b/Platform/ARM/JunoPkg/ArmJ= uno.dsc > index 7fe796a53433..81d2cbe4359f 100644 > --- a/Platform/ARM/JunoPkg/ArmJuno.dsc > +++ b/Platform/ARM/JunoPkg/ArmJuno.dsc > @@ -40,6 +40,7 @@ > ArmPlatformLib|Platform/ARM/JunoPkg/Library/ArmJunoLib/ArmJunoLib.inf > > ArmSmcLib|ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf > > =20 > > + NorFlashDeviceLib|Platform/ARM/Library/P30NorFlashDeviceLib/P30NorFlas= hDeviceLib.inf > > NorFlashPlatformLib|Platform/ARM/JunoPkg/Library/NorFlashJunoLib/NorF= lashJunoLib.inf > > =20 > > CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.i= nf > > diff --git a/Platform/ARM/VExpressPkg/PlatformStandaloneMm.dsc b/Platform= /ARM/VExpressPkg/PlatformStandaloneMm.dsc > index 0e77b76cae69..a5805da49c92 100644 > --- a/Platform/ARM/VExpressPkg/PlatformStandaloneMm.dsc > +++ b/Platform/ARM/VExpressPkg/PlatformStandaloneMm.dsc > @@ -100,6 +100,7 @@ > =20 > > # STMM for Variable runtime service. > > !if $(ENABLE_UEFI_SECURE_VARIABLE) =3D=3D TRUE > > + NorFlashDeviceLib|Platform/ARM/Library/P30NorFlashDeviceLib/P30NorFlas= hDeviceLib.inf > > NorFlashPlatformLib|Platform/ARM/VExpressPkg/Library/NorFlashArmVExpr= essLib/NorFlashStMmLib.inf > > VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf > > VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/Ba= seVariableFlashInfoLib.inf > > diff --git a/Platform/ARM/Drivers/NorFlashDxe/NorFlashDxe.inf b/Platform/= ARM/Drivers/NorFlashDxe/NorFlashDxe.inf > index 18e99bac8888..de160025b632 100644 > --- a/Platform/ARM/Drivers/NorFlashDxe/NorFlashDxe.inf > +++ b/Platform/ARM/Drivers/NorFlashDxe/NorFlashDxe.inf > @@ -17,8 +17,6 @@ > ENTRY_POINT =3D NorFlashInitialise > > =20 > > [Sources.common] > > - NorFlash.c > > - NorFlash.h > > NorFlashBlockIoDxe.c > > NorFlashDxe.c > > NorFlashCommon.h > > @@ -36,6 +34,7 @@ > DxeServicesTableLib > > HobLib > > IoLib > > + NorFlashDeviceLib > > NorFlashPlatformLib > > UefiBootServicesTableLib > > UefiDriverEntryPoint > > @@ -66,7 +65,5 @@ > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize > > =20 > > - gPlatformArmTokenSpaceGuid.PcdNorFlashCheckBlockLocked > > - > > [Depex] > > gEfiCpuArchProtocolGuid > > diff --git a/Platform/ARM/Drivers/NorFlashDxe/NorFlashStandaloneMm.inf b/= Platform/ARM/Drivers/NorFlashDxe/NorFlashStandaloneMm.inf > index 69c40ccf9c27..d9e7de07165c 100644 > --- a/Platform/ARM/Drivers/NorFlashDxe/NorFlashStandaloneMm.inf > +++ b/Platform/ARM/Drivers/NorFlashDxe/NorFlashStandaloneMm.inf > @@ -19,8 +19,6 @@ > ENTRY_POINT =3D NorFlashInitialise > > =20 > > [Sources.common] > > - NorFlash.c > > - NorFlash.h > > NorFlashFvb.c > > NorFlashCommon.h > > NorFlashStandaloneMm.c > > @@ -38,6 +36,7 @@ > IoLib > > MemoryAllocationLib > > MmServicesTableLib > > + NorFlashDeviceLib > > NorFlashPlatformLib > > StandaloneMmDriverEntryPoint > > =20 > > @@ -60,8 +59,5 @@ > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase > > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize > > =20 > > -[FeaturePcd] > > - gPlatformArmTokenSpaceGuid.PcdNorFlashCheckBlockLocked > > - > > [Depex] > > TRUE > > diff --git a/Platform/ARM/Drivers/NorFlashDxe/NorFlash.h b/Platform/ARM/D= rivers/NorFlashDxe/NorFlash.h > deleted file mode 100644 > index 6cb1f64b9875..000000000000 > --- a/Platform/ARM/Drivers/NorFlashDxe/NorFlash.h > +++ /dev/null > @@ -1,108 +0,0 @@ > -/** @file NorFlash.h > > - > > - Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.
> > - > > - SPDX-License-Identifier: BSD-2-Clause-Patent > > - > > -**/ > > - > > -#ifndef __NOR_FLASH_H__ > > -#define __NOR_FLASH_H__ > > - > > -#include > > -#include > > - > > -#include > > - > > -#include > > -#include > > -#include > > - > > -#include > > -#include > > -#include > > - > > -#define NOR_FLASH_ERASE_RETRY 10 > > - > > -// Device access macros > > -// These are necessary because we use 2 x 16bit parts to make up 32bit d= ata > > - > > -#define HIGH_16_BITS 0xFFFF0000 > > -#define LOW_16_BITS 0x0000FFFF > > -#define LOW_8_BITS 0x000000FF > > - > > -#define FOLD_32BIT_INTO_16BIT(value) ( ( value >> 16 ) | ( value & LOW_= 16_BITS ) ) > > - > > -#define GET_LOW_BYTE(value) ( value & LOW_8_BITS ) > > -#define GET_HIGH_BYTE(value) ( GET_LOW_BYTE( value >> 16 ) ) > > - > > -// Each command must be sent simultaneously to both chips, > > -// i.e. at the lower 16 bits AND at the higher 16 bits > > -#define CREATE_NOR_ADDRESS(BaseAddr, OffsetAddr) ((BaseAddr) + ((O= ffsetAddr) << 2)) > > -#define CREATE_DUAL_CMD(Cmd) ( ( Cmd << 16) | = ( Cmd & LOW_16_BITS) ) > > -#define SEND_NOR_COMMAND(BaseAddr, Offset, Cmd) MmioWrite32 (CREA= TE_NOR_ADDRESS(BaseAddr,Offset), CREATE_DUAL_CMD(Cmd)) > > - > > -// Status Register Bits > > -#define P30_SR_BIT_WRITE (BIT7 << 16 | BIT7) > > -#define P30_SR_BIT_ERASE_SUSPEND (BIT6 << 16 | BIT6) > > -#define P30_SR_BIT_ERASE (BIT5 << 16 | BIT5) > > -#define P30_SR_BIT_PROGRAM (BIT4 << 16 | BIT4) > > -#define P30_SR_BIT_VPP (BIT3 << 16 | BIT3) > > -#define P30_SR_BIT_PROGRAM_SUSPEND (BIT2 << 16 | BIT2) > > -#define P30_SR_BIT_BLOCK_LOCKED (BIT1 << 16 | BIT1) > > -#define P30_SR_BIT_BEFP (BIT0 << 16 | BIT0) > > - > > -// Device Commands for Intel StrataFlash(R) Embedded Memory (P30) Family > > - > > -// On chip buffer size for buffered programming operations > > -// There are 2 chips, each chip can buffer up to 32 (16-bit)words, and e= ach word is 2 bytes. > > -// Therefore the total size of the buffer is 2 x 32 x 2 =3D 128 bytes > > -#define P30_MAX_BUFFER_SIZE_IN_BYTES ((UINTN)128) > > -#define P30_MAX_BUFFER_SIZE_IN_WORDS (P30_MAX_BUFFER_SIZE_IN_BYTES/((UI= NTN)4)) > > -#define MAX_BUFFERED_PROG_ITERATIONS 10000000 > > -#define BOUNDARY_OF_32_WORDS 0x7F > > - > > -// CFI Addresses > > -#define P30_CFI_ADDR_QUERY_UNIQUE_QRY 0x10 > > -#define P30_CFI_ADDR_VENDOR_ID 0x13 > > - > > -// CFI Data > > -#define CFI_QRY 0x00595251 > > - > > -// READ Commands > > -#define P30_CMD_READ_DEVICE_ID 0x0090 > > -#define P30_CMD_READ_STATUS_REGISTER 0x0070 > > -#define P30_CMD_CLEAR_STATUS_REGISTER 0x0050 > > -#define P30_CMD_READ_ARRAY 0x00FF > > -#define P30_CMD_READ_CFI_QUERY 0x0098 > > - > > -// WRITE Commands > > -#define P30_CMD_WORD_PROGRAM_SETUP 0x0040 > > -#define P30_CMD_ALTERNATE_WORD_PROGRAM_SETUP 0x0010 > > -#define P30_CMD_BUFFERED_PROGRAM_SETUP 0x00E8 > > -#define P30_CMD_BUFFERED_PROGRAM_CONFIRM 0x00D0 > > -#define P30_CMD_BEFP_SETUP 0x0080 > > -#define P30_CMD_BEFP_CONFIRM 0x00D0 > > - > > -// ERASE Commands > > -#define P30_CMD_BLOCK_ERASE_SETUP 0x0020 > > -#define P30_CMD_BLOCK_ERASE_CONFIRM 0x00D0 > > - > > -// SUSPEND Commands > > -#define P30_CMD_PROGRAM_OR_ERASE_SUSPEND 0x00B0 > > -#define P30_CMD_SUSPEND_RESUME 0x00D0 > > - > > -// BLOCK LOCKING / UNLOCKING Commands > > -#define P30_CMD_LOCK_BLOCK_SETUP 0x0060 > > -#define P30_CMD_LOCK_BLOCK 0x0001 > > -#define P30_CMD_UNLOCK_BLOCK 0x00D0 > > -#define P30_CMD_LOCK_DOWN_BLOCK 0x002F > > - > > -// PROTECTION Commands > > -#define P30_CMD_PROGRAM_PROTECTION_REGISTER_SETUP 0x00C0 > > - > > -// CONFIGURATION Commands > > -#define P30_CMD_READ_CONFIGURATION_REGISTER_SETUP 0x0060 > > -#define P30_CMD_READ_CONFIGURATION_REGISTER 0x0003 > > - > > -#endif /* __NOR_FLASH_H__ */ > > diff --git a/Platform/ARM/Drivers/NorFlashDxe/NorFlash.c b/Platform/ARM/D= rivers/NorFlashDxe/NorFlash.c > deleted file mode 100644 > index 15000a692b02..000000000000 > --- a/Platform/ARM/Drivers/NorFlashDxe/NorFlash.c > +++ /dev/null > @@ -1,953 +0,0 @@ > -/** @file NorFlash.c > > - > > - Copyright (c) 2011 - 2020, Arm Limited. All rights reserved.
> > - Copyright (c) 2020, Linaro, Ltd. All rights reserved.
> > - > > - SPDX-License-Identifier: BSD-2-Clause-Patent > > - > > -**/ > > - > > -#include > > - > > -#include "NorFlash.h" > > - > > -// > > -// Global variable declarations > > -// > > -extern NOR_FLASH_INSTANCE **mNorFlashInstances; > > -extern UINT32 mNorFlashDeviceCount; > > - > > -UINT32 > > -NorFlashReadStatusRegister ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN UINTN SR_Address > > - ) > > -{ > > - // Prepare to read the status register > > - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_STATUS_= REGISTER); > > - return MmioRead32 (Instance->DeviceBaseAddress); > > -} > > - > > -STATIC > > -BOOLEAN > > -NorFlashBlockIsLocked ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN UINTN BlockAddress > > - ) > > -{ > > - UINT32 LockStatus; > > - > > - // Send command for reading device id > > - SEND_NOR_COMMAND (BlockAddress, 2, P30_CMD_READ_DEVICE_ID); > > - > > - // Read block lock status > > - LockStatus =3D MmioRead32 (CREATE_NOR_ADDRESS (BlockAddress, 2)); > > - > > - // Decode block lock status > > - LockStatus =3D FOLD_32BIT_INTO_16BIT (LockStatus); > > - > > - if ((LockStatus & 0x2) !=3D 0) { > > - DEBUG ((DEBUG_ERROR, "NorFlashBlockIsLocked: WARNING: Block LOCKED D= OWN\n")); > > - } > > - > > - return ((LockStatus & 0x1) !=3D 0); > > -} > > - > > -STATIC > > -EFI_STATUS > > -NorFlashUnlockSingleBlock ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN UINTN BlockAddress > > - ) > > -{ > > - UINT32 LockStatus; > > - > > - // Raise the Task Priority Level to TPL_NOTIFY to serialise all its op= erations > > - // and to protect shared data structures. > > - > > - if (FeaturePcdGet (PcdNorFlashCheckBlockLocked) =3D=3D TRUE) { > > - do { > > - // Request a lock setup > > - SEND_NOR_COMMAND (BlockAddress, 0, P30_CMD_LOCK_BLOCK_SETUP); > > - > > - // Request an unlock > > - SEND_NOR_COMMAND (BlockAddress, 0, P30_CMD_UNLOCK_BLOCK); > > - > > - // Send command for reading device id > > - SEND_NOR_COMMAND (BlockAddress, 2, P30_CMD_READ_DEVICE_ID); > > - > > - // Read block lock status > > - LockStatus =3D MmioRead32 (CREATE_NOR_ADDRESS (BlockAddress, 2)); > > - > > - // Decode block lock status > > - LockStatus =3D FOLD_32BIT_INTO_16BIT (LockStatus); > > - } while ((LockStatus & 0x1) =3D=3D 1); > > - } else { > > - // Request a lock setup > > - SEND_NOR_COMMAND (BlockAddress, 0, P30_CMD_LOCK_BLOCK_SETUP); > > - > > - // Request an unlock > > - SEND_NOR_COMMAND (BlockAddress, 0, P30_CMD_UNLOCK_BLOCK); > > - > > - // Wait until the status register gives us the all clear > > - do { > > - LockStatus =3D NorFlashReadStatusRegister (Instance, BlockAddress)= ; > > - } while ((LockStatus & P30_SR_BIT_WRITE) !=3D P30_SR_BIT_WRITE); > > - } > > - > > - // Put device back into Read Array mode > > - SEND_NOR_COMMAND (BlockAddress, 0, P30_CMD_READ_ARRAY); > > - > > - DEBUG ((DEBUG_BLKIO, "UnlockSingleBlock: BlockAddress=3D0x%08x\n", Blo= ckAddress)); > > - > > - return EFI_SUCCESS; > > -} > > - > > -EFI_STATUS > > -NorFlashUnlockSingleBlockIfNecessary ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN UINTN BlockAddress > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - Status =3D EFI_SUCCESS; > > - > > - if (NorFlashBlockIsLocked (Instance, BlockAddress)) { > > - Status =3D NorFlashUnlockSingleBlock (Instance, BlockAddress); > > - } > > - > > - return Status; > > -} > > - > > -/** > > - * The following function presumes that the block has already been unloc= ked. > > - **/ > > -EFI_STATUS > > -NorFlashEraseSingleBlock ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN UINTN BlockAddress > > - ) > > -{ > > - EFI_STATUS Status; > > - UINT32 StatusRegister; > > - > > - Status =3D EFI_SUCCESS; > > - > > - // Request a block erase and then confirm it > > - SEND_NOR_COMMAND (BlockAddress, 0, P30_CMD_BLOCK_ERASE_SETUP); > > - SEND_NOR_COMMAND (BlockAddress, 0, P30_CMD_BLOCK_ERASE_CONFIRM); > > - > > - // Wait until the status register gives us the all clear > > - do { > > - StatusRegister =3D NorFlashReadStatusRegister (Instance, BlockAddres= s); > > - } while ((StatusRegister & P30_SR_BIT_WRITE) !=3D P30_SR_BIT_WRITE); > > - > > - if (StatusRegister & P30_SR_BIT_VPP) { > > - DEBUG ((DEBUG_ERROR, "EraseSingleBlock(BlockAddress=3D0x%08x: VPP Ra= nge Error\n", BlockAddress)); > > - Status =3D EFI_DEVICE_ERROR; > > - } > > - > > - if ((StatusRegister & (P30_SR_BIT_ERASE | P30_SR_BIT_PROGRAM)) =3D=3D = (P30_SR_BIT_ERASE | P30_SR_BIT_PROGRAM)) { > > - DEBUG ((DEBUG_ERROR, "EraseSingleBlock(BlockAddress=3D0x%08x: Comman= d Sequence Error\n", BlockAddress)); > > - Status =3D EFI_DEVICE_ERROR; > > - } > > - > > - if (StatusRegister & P30_SR_BIT_ERASE) { > > - DEBUG ((DEBUG_ERROR, "EraseSingleBlock(BlockAddress=3D0x%08x: Block = Erase Error StatusRegister:0x%X\n", BlockAddress, StatusRegister)); > > - Status =3D EFI_DEVICE_ERROR; > > - } > > - > > - if (StatusRegister & P30_SR_BIT_BLOCK_LOCKED) { > > - // The debug level message has been reduced because a device lock mi= ght happen. In this case we just retry it ... > > - DEBUG ((DEBUG_INFO, "EraseSingleBlock(BlockAddress=3D0x%08x: Block L= ocked Error\n", BlockAddress)); > > - Status =3D EFI_WRITE_PROTECTED; > > - } > > - > > - if (EFI_ERROR (Status)) { > > - // Clear the Status Register > > - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_CLEAR_STAT= US_REGISTER); > > - } > > - > > - // Put device back into Read Array mode > > - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); > > - > > - return Status; > > -} > > - > > -EFI_STATUS > > -NorFlashWriteSingleWord ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN UINTN WordAddress, > > - IN UINT32 WriteData > > - ) > > -{ > > - EFI_STATUS Status; > > - UINT32 StatusRegister; > > - > > - Status =3D EFI_SUCCESS; > > - > > - // Request a write single word command > > - SEND_NOR_COMMAND (WordAddress, 0, P30_CMD_WORD_PROGRAM_SETUP); > > - > > - // Store the word into NOR Flash; > > - MmioWrite32 (WordAddress, WriteData); > > - > > - // Wait for the write to complete and then check for any errors; i.e. = check the Status Register > > - do { > > - // Prepare to read the status register > > - StatusRegister =3D NorFlashReadStatusRegister (Instance, WordAddress= ); > > - // The chip is busy while the WRITE bit is not asserted > > - } while ((StatusRegister & P30_SR_BIT_WRITE) !=3D P30_SR_BIT_WRITE); > > - > > - // Perform a full status check: > > - // Mask the relevant bits of Status Register. > > - // Everything should be zero, if not, we have a problem > > - > > - if (StatusRegister & P30_SR_BIT_VPP) { > > - DEBUG ((DEBUG_ERROR, "NorFlashWriteSingleWord(WordAddress:0x%X): VPP= Range Error\n", WordAddress)); > > - Status =3D EFI_DEVICE_ERROR; > > - } > > - > > - if (StatusRegister & P30_SR_BIT_PROGRAM) { > > - DEBUG ((DEBUG_ERROR, "NorFlashWriteSingleWord(WordAddress:0x%X): Pro= gram Error\n", WordAddress)); > > - Status =3D EFI_DEVICE_ERROR; > > - } > > - > > - if (StatusRegister & P30_SR_BIT_BLOCK_LOCKED) { > > - DEBUG ((DEBUG_ERROR, "NorFlashWriteSingleWord(WordAddress:0x%X): Dev= ice Protect Error\n", WordAddress)); > > - Status =3D EFI_DEVICE_ERROR; > > - } > > - > > - if (!EFI_ERROR (Status)) { > > - // Clear the Status Register > > - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_CLEAR_STAT= US_REGISTER); > > - } > > - > > - // Put device back into Read Array mode > > - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); > > - > > - return Status; > > -} > > - > > -/* > > - * Writes data to the NOR Flash using the Buffered Programming method. > > - * > > - * The maximum size of the on-chip buffer is 32-words, because of hardwa= re restrictions. > > - * Therefore this function will only handle buffers up to 32 words or 12= 8 bytes. > > - * To deal with larger buffers, call this function again. > > - * > > - * This function presumes that both the TargetAddress and the TargetAddr= ess+BufferSize > > - * exist entirely within the NOR Flash. Therefore these conditions will = not be checked here. > > - * > > - * In buffered programming, if the target address not at the beginning o= f a 32-bit word boundary, > > - * then programming time is doubled and power consumption is increased. > > - * Therefore, it is a requirement to align buffer writes to 32-bit word = boundaries. > > - * i.e. the last 4 bits of the target start address must be zero: 0x....= ..00 > > - */ > > -EFI_STATUS > > -NorFlashWriteBuffer ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN UINTN TargetAddress, > > - IN UINTN BufferSizeInBytes, > > - IN UINT32 *Buffer > > - ) > > -{ > > - EFI_STATUS Status; > > - UINTN BufferSizeInWords; > > - UINTN Count; > > - volatile UINT32 *Data; > > - UINTN WaitForBuffer; > > - BOOLEAN BufferAvailable; > > - UINT32 StatusRegister; > > - > > - WaitForBuffer =3D MAX_BUFFERED_PROG_ITERATIONS; > > - BufferAvailable =3D FALSE; > > - > > - // Check that the target address does not cross a 32-word boundary. > > - if ((TargetAddress & BOUNDARY_OF_32_WORDS) !=3D 0) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - // Check there are some data to program > > - if (BufferSizeInBytes =3D=3D 0) { > > - return EFI_BUFFER_TOO_SMALL; > > - } > > - > > - // Check that the buffer size does not exceed the maximum hardware buf= fer size on chip. > > - if (BufferSizeInBytes > P30_MAX_BUFFER_SIZE_IN_BYTES) { > > - return EFI_BAD_BUFFER_SIZE; > > - } > > - > > - // Check that the buffer size is a multiple of 32-bit words > > - if ((BufferSizeInBytes % 4) !=3D 0) { > > - return EFI_BAD_BUFFER_SIZE; > > - } > > - > > - // Pre-programming conditions checked, now start the algorithm. > > - > > - // Prepare the data destination address > > - Data =3D (UINT32 *)TargetAddress; > > - > > - // Check the availability of the buffer > > - do { > > - // Issue the Buffered Program Setup command > > - SEND_NOR_COMMAND (TargetAddress, 0, P30_CMD_BUFFERED_PROGRAM_SETUP); > > - > > - // Read back the status register bit#7 from the same address > > - if (((*Data) & P30_SR_BIT_WRITE) =3D=3D P30_SR_BIT_WRITE) { > > - BufferAvailable =3D TRUE; > > - } > > - > > - // Update the loop counter > > - WaitForBuffer--; > > - } while ((WaitForBuffer > 0) && (BufferAvailable =3D=3D FALSE)); > > - > > - // The buffer was not available for writing > > - if (WaitForBuffer =3D=3D 0) { > > - Status =3D EFI_DEVICE_ERROR; > > - goto EXIT; > > - } > > - > > - // From now on we work in 32-bit words > > - BufferSizeInWords =3D BufferSizeInBytes / (UINTN)4; > > - > > - // Write the word count, which is (buffer_size_in_words - 1), > > - // because word count 0 means one word. > > - SEND_NOR_COMMAND (TargetAddress, 0, (BufferSizeInWords - 1)); > > - > > - // Write the data to the NOR Flash, advancing each address by 4 bytes > > - for (Count =3D 0; Count < BufferSizeInWords; Count++, Data++, Buffer++= ) { > > - MmioWrite32 ((UINTN)Data, *Buffer); > > - } > > - > > - // Issue the Buffered Program Confirm command, to start the programmin= g operation > > - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_BUFFERED_PRO= GRAM_CONFIRM); > > - > > - // Wait for the write to complete and then check for any errors; i.e. = check the Status Register > > - do { > > - StatusRegister =3D NorFlashReadStatusRegister (Instance, TargetAddre= ss); > > - // The chip is busy while the WRITE bit is not asserted > > - } while ((StatusRegister & P30_SR_BIT_WRITE) !=3D P30_SR_BIT_WRITE); > > - > > - // Perform a full status check: > > - // Mask the relevant bits of Status Register. > > - // Everything should be zero, if not, we have a problem > > - > > - Status =3D EFI_SUCCESS; > > - > > - if (StatusRegister & P30_SR_BIT_VPP) { > > - DEBUG ((DEBUG_ERROR, "NorFlashWriteBuffer(TargetAddress:0x%X): VPP R= ange Error\n", TargetAddress)); > > - Status =3D EFI_DEVICE_ERROR; > > - } > > - > > - if (StatusRegister & P30_SR_BIT_PROGRAM) { > > - DEBUG ((DEBUG_ERROR, "NorFlashWriteBuffer(TargetAddress:0x%X): Progr= am Error\n", TargetAddress)); > > - Status =3D EFI_DEVICE_ERROR; > > - } > > - > > - if (StatusRegister & P30_SR_BIT_BLOCK_LOCKED) { > > - DEBUG ((DEBUG_ERROR, "NorFlashWriteBuffer(TargetAddress:0x%X): Devic= e Protect Error\n", TargetAddress)); > > - Status =3D EFI_DEVICE_ERROR; > > - } > > - > > - if (!EFI_ERROR (Status)) { > > - // Clear the Status Register > > - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_CLEAR_STAT= US_REGISTER); > > - } > > - > > -EXIT: > > - // Put device back into Read Array mode > > - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); > > - > > - return Status; > > -} > > - > > -EFI_STATUS > > -NorFlashWriteBlocks ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN EFI_LBA Lba, > > - IN UINTN BufferSizeInBytes, > > - IN VOID *Buffer > > - ) > > -{ > > - UINT32 *pWriteBuffer; > > - EFI_STATUS Status; > > - EFI_LBA CurrentBlock; > > - UINT32 BlockSizeInWords; > > - UINT32 NumBlocks; > > - UINT32 BlockCount; > > - > > - Status =3D EFI_SUCCESS; > > - > > - // The buffer must be valid > > - if (Buffer =3D=3D NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (Instance->Media.ReadOnly =3D=3D TRUE) { > > - return EFI_WRITE_PROTECTED; > > - } > > - > > - // We must have some bytes to read > > - DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: BufferSizeInBytes=3D0x%x\n"= , BufferSizeInBytes)); > > - if (BufferSizeInBytes =3D=3D 0) { > > - return EFI_BAD_BUFFER_SIZE; > > - } > > - > > - // The size of the buffer must be a multiple of the block size > > - DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: BlockSize in bytes =3D0x%x\= n", Instance->Media.BlockSize)); > > - if ((BufferSizeInBytes % Instance->Media.BlockSize) !=3D 0) { > > - return EFI_BAD_BUFFER_SIZE; > > - } > > - > > - // All blocks must be within the device > > - NumBlocks =3D ((UINT32)BufferSizeInBytes) / Instance->Media.BlockSize; > > - > > - DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: NumBlocks=3D%d, LastBlock= =3D%ld, Lba=3D%ld.\n", NumBlocks, Instance->Media.LastBlock, Lba)); > > - > > - if ((Lba + NumBlocks) > (Instance->Media.LastBlock + 1)) { > > - DEBUG ((DEBUG_ERROR, "NorFlashWriteBlocks: ERROR - Write will exceed= last block.\n")); > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - BlockSizeInWords =3D Instance->Media.BlockSize / 4; > > - > > - // Because the target *Buffer is a pointer to VOID, we must put all th= e data into a pointer > > - // to a proper data type, so use *ReadBuffer > > - pWriteBuffer =3D (UINT32 *)Buffer; > > - > > - CurrentBlock =3D Lba; > > - for (BlockCount =3D 0; BlockCount < NumBlocks; BlockCount++, CurrentBl= ock++, pWriteBuffer =3D pWriteBuffer + BlockSizeInWords) { > > - DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: Writing block #%d\n", (UI= NTN)CurrentBlock)); > > - > > - Status =3D NorFlashWriteFullBlock (Instance, CurrentBlock, pWriteBuf= fer, BlockSizeInWords); > > - > > - if (EFI_ERROR (Status)) { > > - break; > > - } > > - } > > - > > - DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: Exit Status =3D \"%r\".\n",= Status)); > > - return Status; > > -} > > - > > -#define BOTH_ALIGNED(a, b, align) ((((UINTN)(a) | (UINTN)(b)) & ((align= ) - 1)) =3D=3D 0) > > - > > -/** > > - Copy Length bytes from Source to Destination, using aligned accesses o= nly. > > - Note that this implementation uses memcpy() semantics rather then memm= ove() > > - semantics, i.e., SourceBuffer and DestinationBuffer should not overlap= . > > - > > - @param DestinationBuffer The target of the copy request. > > - @param SourceBuffer The place to copy from. > > - @param Length The number of bytes to copy. > > - > > - @return Destination > > - > > -**/ > > -STATIC > > -VOID * > > -AlignedCopyMem ( > > - OUT VOID *DestinationBuffer, > > - IN CONST VOID *SourceBuffer, > > - IN UINTN Length > > - ) > > -{ > > - UINT8 *Destination8; > > - CONST UINT8 *Source8; > > - UINT32 *Destination32; > > - CONST UINT32 *Source32; > > - UINT64 *Destination64; > > - CONST UINT64 *Source64; > > - > > - if (BOTH_ALIGNED (DestinationBuffer, SourceBuffer, 8) && (Length >=3D = 8)) { > > - Destination64 =3D DestinationBuffer; > > - Source64 =3D SourceBuffer; > > - while (Length >=3D 8) { > > - *Destination64++ =3D *Source64++; > > - Length -=3D 8; > > - } > > - > > - Destination8 =3D (UINT8 *)Destination64; > > - Source8 =3D (CONST UINT8 *)Source64; > > - } else if (BOTH_ALIGNED (DestinationBuffer, SourceBuffer, 4) && (Lengt= h >=3D 4)) { > > - Destination32 =3D DestinationBuffer; > > - Source32 =3D SourceBuffer; > > - while (Length >=3D 4) { > > - *Destination32++ =3D *Source32++; > > - Length -=3D 4; > > - } > > - > > - Destination8 =3D (UINT8 *)Destination32; > > - Source8 =3D (CONST UINT8 *)Source32; > > - } else { > > - Destination8 =3D DestinationBuffer; > > - Source8 =3D SourceBuffer; > > - } > > - > > - while (Length-- !=3D 0) { > > - *Destination8++ =3D *Source8++; > > - } > > - > > - return DestinationBuffer; > > -} > > - > > -EFI_STATUS > > -NorFlashReadBlocks ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN EFI_LBA Lba, > > - IN UINTN BufferSizeInBytes, > > - OUT VOID *Buffer > > - ) > > -{ > > - UINT32 NumBlocks; > > - UINTN StartAddress; > > - > > - DEBUG (( > > - DEBUG_BLKIO, > > - "NorFlashReadBlocks: BufferSize=3D0x%xB BlockSize=3D0x%xB LastBlock= =3D%ld, Lba=3D%ld.\n", > > - BufferSizeInBytes, > > - Instance->Media.BlockSize, > > - Instance->Media.LastBlock, > > - Lba > > - )); > > - > > - // 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; > > - } > > - > > - // The size of the buffer must be a multiple of the block size > > - if ((BufferSizeInBytes % Instance->Media.BlockSize) !=3D 0) { > > - return EFI_BAD_BUFFER_SIZE; > > - } > > - > > - // All blocks must be within the device > > - NumBlocks =3D ((UINT32)BufferSizeInBytes) / Instance->Media.BlockSize; > > - > > - if ((Lba + NumBlocks) > (Instance->Media.LastBlock + 1)) { > > - DEBUG ((DEBUG_ERROR, "NorFlashReadBlocks: ERROR - Read will exceed l= ast block\n")); > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - // Get the address to start reading from > > - StartAddress =3D GET_NOR_BLOCK_ADDRESS ( > > - Instance->RegionBaseAddress, > > - Lba, > > - Instance->Media.BlockSize > > - ); > > - > > - // Put the device into Read Array mode > > - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); > > - > > - // Readout the data > > - AlignedCopyMem (Buffer, (VOID *)StartAddress, BufferSizeInBytes); > > - > > - return EFI_SUCCESS; > > -} > > - > > -EFI_STATUS > > -NorFlashRead ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN EFI_LBA Lba, > > - IN UINTN Offset, > > - IN UINTN BufferSizeInBytes, > > - OUT VOID *Buffer > > - ) > > -{ > > - UINTN StartAddress; > > - > > - // 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 * Instance->Media.BlockSize) + Offset + BufferSizeInBytes) >= Instance->Size) { > > - DEBUG ((DEBUG_ERROR, "NorFlashRead: ERROR - Read will exceed device = size.\n")); > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - // Get the address to start reading from > > - StartAddress =3D GET_NOR_BLOCK_ADDRESS ( > > - Instance->RegionBaseAddress, > > - Lba, > > - Instance->Media.BlockSize > > - ); > > - > > - // Put the device into Read Array mode > > - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); > > - > > - // Readout the data > > - AlignedCopyMem (Buffer, (VOID *)(StartAddress + Offset), BufferSizeInB= ytes); > > - > > - return EFI_SUCCESS; > > -} > > - > > -/* > > - Write a full or portion of a block. It must not span block boundaries;= that is, > > - Offset + *NumBytes <=3D Instance->Media.BlockSize. > > -*/ > > -EFI_STATUS > > -NorFlashWriteSingleBlock ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN EFI_LBA Lba, > > - IN UINTN Offset, > > - IN OUT UINTN *NumBytes, > > - IN UINT8 *Buffer > > - ) > > -{ > > - EFI_STATUS TempStatus; > > - UINT32 Tmp; > > - UINT32 TmpBuf; > > - UINT32 WordToWrite; > > - UINT32 Mask; > > - BOOLEAN DoErase; > > - UINTN BytesToWrite; > > - UINTN CurOffset; > > - UINTN WordAddr; > > - UINTN BlockSize; > > - UINTN BlockAddress; > > - UINTN PrevBlockAddress; > > - > > - PrevBlockAddress =3D 0; > > - > > - DEBUG ((DEBUG_BLKIO, "NorFlashWriteSingleBlock(Parameters: Lba=3D%ld, = Offset=3D0x%x, *NumBytes=3D0x%x, Buffer @ 0x%08x)\n", Lba, Offset, *NumByte= s, Buffer)); > > - > > - // Detect WriteDisabled state > > - if (Instance->Media.ReadOnly =3D=3D TRUE) { > > - DEBUG ((DEBUG_ERROR, "NorFlashWriteSingleBlock: ERROR - Can not writ= e: 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; > > - > > - // The write must not span block boundaries. > > - // We need to check each variable individually because adding two larg= e values together overflows. > > - if ((Offset >=3D BlockSize) || > > - (*NumBytes > BlockSize) || > > - ((Offset + *NumBytes) > BlockSize)) > > - { > > - DEBUG ((DEBUG_ERROR, "NorFlashWriteSingleBlock: ERROR - EFI_BAD_BUFF= ER_SIZE: (Offset=3D0x%x + NumBytes=3D0x%x) > BlockSize=3D0x%x\n", Offset, *= NumBytes, BlockSize)); > > - return EFI_BAD_BUFFER_SIZE; > > - } > > - > > - // We must have some bytes to write > > - if (*NumBytes =3D=3D 0) { > > - DEBUG ((DEBUG_ERROR, "NorFlashWriteSingleBlock: ERROR - EFI_BAD_BUFF= ER_SIZE: (Offset=3D0x%x + NumBytes=3D0x%x) > BlockSize=3D0x%x\n", Offset, *= NumBytes, BlockSize)); > > - return EFI_BAD_BUFFER_SIZE; > > - } > > - > > - // Pick 128bytes as a good start for word operations as opposed to era= sing the > > - // block and writing the data regardless if an erase is really needed. > > - // It looks like most individual NV variable writes are smaller than 1= 28bytes. > > - if (*NumBytes <=3D 128) { > > - // Check to see if we need to erase before programming the data into= NOR. > > - // If the destination bits are only changing from 1s to 0s we can ju= st 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 FALSE; > > - BytesToWrite =3D *NumBytes; > > - CurOffset =3D Offset; > > - > > - while (BytesToWrite > 0) { > > - // Read full word from NOR, splice as required. A word is the smal= lest > > - // unit we can write. > > - TempStatus =3D NorFlashRead (Instance, Lba, CurOffset & ~(0x3), si= zeof (Tmp), &Tmp); > > - if (EFI_ERROR (TempStatus)) { > > - return EFI_DEVICE_ERROR; > > - } > > - > > - // Physical address of word in NOR to write. > > - WordAddr =3D (CurOffset & ~(0x3)) + GET_NOR_BLOCK_ADDRESS ( > > - Instance->RegionBaseAddress, > > - Lba, > > - BlockSize > > - ); > > - // The word of data that is to be written. > > - TmpBuf =3D *((UINT32 *)(Buffer + (*NumBytes - BytesToWrite))); > > - > > - // First do word aligned chunks. > > - if ((CurOffset & 0x3) =3D=3D 0) { > > - if (BytesToWrite >=3D 4) { > > - // Is the destination still in 'erased' state? > > - if (~Tmp !=3D 0) { > > - // Check to see if we are only changing bits to zero. > > - if ((Tmp ^ TmpBuf) & TmpBuf) { > > - DoErase =3D TRUE; > > - break; > > - } > > - } > > - > > - // Write this word to NOR > > - WordToWrite =3D TmpBuf; > > - CurOffset +=3D sizeof (TmpBuf); > > - BytesToWrite -=3D sizeof (TmpBuf); > > - } else { > > - // BytesToWrite < 4. Do small writes and left-overs > > - Mask =3D ~((~0) << (BytesToWrite * 8)); > > - // Mask out the bytes we want. > > - TmpBuf &=3D Mask; > > - // Is the destination still in 'erased' state? > > - if ((Tmp & Mask) !=3D Mask) { > > - // Check to see if we are only changing bits to zero. > > - if ((Tmp ^ TmpBuf) & TmpBuf) { > > - DoErase =3D TRUE; > > - break; > > - } > > - } > > - > > - // Merge old and new data. Write merged word to NOR > > - WordToWrite =3D (Tmp & ~Mask) | TmpBuf; > > - CurOffset +=3D BytesToWrite; > > - BytesToWrite =3D 0; > > - } > > - } else { > > - // Do multiple words, but starting unaligned. > > - if (BytesToWrite > (4 - (CurOffset & 0x3))) { > > - Mask =3D ((~0) << ((CurOffset & 0x3) * 8)); > > - // Mask out the bytes we want. > > - TmpBuf &=3D Mask; > > - // Is the destination still in 'erased' state? > > - if ((Tmp & Mask) !=3D Mask) { > > - // Check to see if we are only changing bits to zero. > > - if ((Tmp ^ TmpBuf) & TmpBuf) { > > - DoErase =3D TRUE; > > - break; > > - } > > - } > > - > > - // Merge old and new data. Write merged word to NOR > > - WordToWrite =3D (Tmp & ~Mask) | TmpBuf; > > - BytesToWrite -=3D (4 - (CurOffset & 0x3)); > > - CurOffset +=3D (4 - (CurOffset & 0x3)); > > - } else { > > - // Unaligned and fits in one word. > > - Mask =3D (~((~0) << (BytesToWrite * 8))) << ((CurOffset & 0x3)= * 8); > > - // Mask out the bytes we want. > > - TmpBuf =3D (TmpBuf << ((CurOffset & 0x3) * 8)) & Mask; > > - // Is the destination still in 'erased' state? > > - if ((Tmp & Mask) !=3D Mask) { > > - // Check to see if we are only changing bits to zero. > > - if ((Tmp ^ TmpBuf) & TmpBuf) { > > - DoErase =3D TRUE; > > - break; > > - } > > - } > > - > > - // Merge old and new data. Write merged word to NOR > > - WordToWrite =3D (Tmp & ~Mask) | TmpBuf; > > - CurOffset +=3D BytesToWrite; > > - BytesToWrite =3D 0; > > - } > > - } > > - > > - // > > - // Write the word to NOR. > > - // > > - > > - BlockAddress =3D GET_NOR_BLOCK_ADDRESS (Instance->RegionBaseAddres= s, Lba, BlockSize); > > - if (BlockAddress !=3D PrevBlockAddress) { > > - TempStatus =3D NorFlashUnlockSingleBlockIfNecessary (Instance, B= lockAddress); > > - if (EFI_ERROR (TempStatus)) { > > - return EFI_DEVICE_ERROR; > > - } > > - > > - PrevBlockAddress =3D BlockAddress; > > - } > > - > > - TempStatus =3D NorFlashWriteSingleWord (Instance, WordAddr, WordTo= Write); > > - if (EFI_ERROR (TempStatus)) { > > - return EFI_DEVICE_ERROR; > > - } > > - } > > - > > - // Exit if we got here and could write all the data. Otherwise do th= e > > - // Erase-Write cycle. > > - if (!DoErase) { > > - return EFI_SUCCESS; > > - } > > - } > > - > > - // 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; > > - } > > - > > - // Read NOR Flash data into shadow buffer > > - TempStatus =3D NorFlashReadBlocks (Instance, Lba, BlockSize, Instance-= >ShadowBuffer); > > - if (EFI_ERROR (TempStatus)) { > > - // 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); > > - > > - // Write the modified buffer back to the NorFlash > > - TempStatus =3D NorFlashWriteBlocks (Instance, Lba, BlockSize, Instance= ->ShadowBuffer); > > - if (EFI_ERROR (TempStatus)) { > > - // Return one of the pre-approved error statuses > > - return EFI_DEVICE_ERROR; > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -EFI_STATUS > > -NorFlashReset ( > > - IN NOR_FLASH_INSTANCE *Instance > > - ) > > -{ > > - // As there is no specific RESET to perform, ensure that the devices i= s in the default Read Array mode > > - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - * This function unlock and erase an entire NOR Flash block. > > -**/ > > -EFI_STATUS > > -NorFlashUnlockAndEraseSingleBlock ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN UINTN BlockAddress > > - ) > > -{ > > - EFI_STATUS Status; > > - UINTN Index; > > - EFI_TPL OriginalTPL; > > - > > - NorFlashLock (&OriginalTPL); > > - > > - Index =3D 0; > > - // The block erase might fail a first time (SW bug ?). Retry it ... > > - do { > > - // Unlock the block if we have to > > - Status =3D NorFlashUnlockSingleBlockIfNecessary (Instance, BlockAddr= ess); > > - if (EFI_ERROR (Status)) { > > - break; > > - } > > - > > - Status =3D NorFlashEraseSingleBlock (Instance, BlockAddress); > > - Index++; > > - } while ((Index < NOR_FLASH_ERASE_RETRY) && (Status =3D=3D EFI_WRITE_P= ROTECTED)); > > - > > - if (Index =3D=3D NOR_FLASH_ERASE_RETRY) { > > - DEBUG ((DEBUG_ERROR, "EraseSingleBlock(BlockAddress=3D0x%08x: Block = Locked Error (try to erase %d times)\n", BlockAddress, Index)); > > - } > > - > > - NorFlashUnlock (OriginalTPL); > > - > > - return Status; > > -} > > - > > -EFI_STATUS > > -NorFlashWriteFullBlock ( > > - IN NOR_FLASH_INSTANCE *Instance, > > - IN EFI_LBA Lba, > > - IN UINT32 *DataBuffer, > > - IN UINT32 BlockSizeInWords > > - ) > > -{ > > - EFI_STATUS Status; > > - UINTN WordAddress; > > - UINT32 WordIndex; > > - UINTN BufferIndex; > > - UINTN BlockAddress; > > - UINTN BuffersInBlock; > > - UINTN RemainingWords; > > - EFI_TPL OriginalTPL; > > - UINTN Cnt; > > - > > - Status =3D EFI_SUCCESS; > > - > > - // Get the physical address of the block > > - BlockAddress =3D GET_NOR_BLOCK_ADDRESS (Instance->RegionBaseAddress, L= ba, BlockSizeInWords * 4); > > - > > - // Start writing from the first address at the start of the block > > - WordAddress =3D BlockAddress; > > - > > - NorFlashLock (&OriginalTPL); > > - > > - Status =3D NorFlashUnlockAndEraseSingleBlock (Instance, BlockAddress); > > - if (EFI_ERROR (Status)) { > > - DEBUG ((DEBUG_ERROR, "WriteSingleBlock: ERROR - Failed to Unlock and= Erase the single block at 0x%X\n", BlockAddress)); > > - goto EXIT; > > - } > > - > > - // To speed up the programming operation, NOR Flash is programmed usin= g the Buffered Programming method. > > - > > - // Check that the address starts at a 32-word boundary, i.e. last 7 bi= ts must be zero > > - if ((WordAddress & BOUNDARY_OF_32_WORDS) =3D=3D 0x00) { > > - // First, break the entire block into buffer-sized chunks. > > - BuffersInBlock =3D (UINTN)(BlockSizeInWords * 4) / P30_MAX_BUFFER_SI= ZE_IN_BYTES; > > - > > - // Then feed each buffer chunk to the NOR Flash > > - // If a buffer does not contain any data, don't write it. > > - for (BufferIndex =3D 0; > > - BufferIndex < BuffersInBlock; > > - BufferIndex++, WordAddress +=3D P30_MAX_BUFFER_SIZE_IN_BYTES, D= ataBuffer +=3D P30_MAX_BUFFER_SIZE_IN_WORDS > > - ) > > - { > > - // Check the buffer to see if it contains any data (not set all 1s= ). > > - for (Cnt =3D 0; Cnt < P30_MAX_BUFFER_SIZE_IN_WORDS; Cnt++) { > > - if (~DataBuffer[Cnt] !=3D 0 ) { > > - // Some data found, write the buffer. > > - Status =3D NorFlashWriteBuffer ( > > - Instance, > > - WordAddress, > > - P30_MAX_BUFFER_SIZE_IN_BYTES, > > - DataBuffer > > - ); > > - if (EFI_ERROR (Status)) { > > - goto EXIT; > > - } > > - > > - break; > > - } > > - } > > - } > > - > > - // Finally, finish off any remaining words that are less than the ma= ximum size of the buffer > > - RemainingWords =3D BlockSizeInWords % P30_MAX_BUFFER_SIZE_IN_WORDS; > > - > > - if (RemainingWords !=3D 0) { > > - Status =3D NorFlashWriteBuffer (Instance, WordAddress, (RemainingW= ords * 4), DataBuffer); > > - if (EFI_ERROR (Status)) { > > - goto EXIT; > > - } > > - } > > - } else { > > - // For now, use the single word programming algorithm > > - // It is unlikely that the NOR Flash will exist in an address which = falls within a 32 word boundary range, > > - // i.e. which ends in the range 0x......01 - 0x......7F. > > - for (WordIndex =3D 0; WordIndex < BlockSizeInWords; WordIndex++, Dat= aBuffer++, WordAddress =3D WordAddress + 4) { > > - Status =3D NorFlashWriteSingleWord (Instance, WordAddress, *DataBu= ffer); > > - if (EFI_ERROR (Status)) { > > - goto EXIT; > > - } > > - } > > - } > > - > > -EXIT: > > - NorFlashUnlock (OriginalTPL); > > - > > - if (EFI_ERROR (Status)) { > > - DEBUG ((DEBUG_ERROR, "NOR FLASH Programming [WriteSingleBlock] faile= d at address 0x%08x. Exit Status =3D \"%r\".\n", WordAddress, Status)); > > - } > > - > > - return Status; > > -} > > diff --git a/Platform/ARM/Drivers/NorFlashDxe/NorFlashBlockIoDxe.c b/Plat= form/ARM/Drivers/NorFlashDxe/NorFlashBlockIoDxe.c > index a6c73312c596..4e7e88610200 100644 > --- a/Platform/ARM/Drivers/NorFlashDxe/NorFlashBlockIoDxe.c > +++ b/Platform/ARM/Drivers/NorFlashDxe/NorFlashBlockIoDxe.c > @@ -9,7 +9,6 @@ > #include > > #include > > =20 > > -#include "NorFlash.h" > > #include "NorFlashCommon.h" > > =20 > > // > > diff --git a/Platform/ARM/Drivers/NorFlashDxe/NorFlashDxe.c b/Platform/AR= M/Drivers/NorFlashDxe/NorFlashDxe.c > index 4bad6e9b2a6b..1c12572ab663 100644 > --- a/Platform/ARM/Drivers/NorFlashDxe/NorFlashDxe.c > +++ b/Platform/ARM/Drivers/NorFlashDxe/NorFlashDxe.c > @@ -14,7 +14,6 @@ > #include > > #include > > =20 > > -#include "NorFlash.h" > > #include "NorFlashCommon.h" > > =20 > > STATIC EFI_EVENT mNorFlashVirtualAddrChangeEvent; > > diff --git a/Platform/ARM/Drivers/NorFlashDxe/NorFlashFvb.c b/Platform/AR= M/Drivers/NorFlashDxe/NorFlashFvb.c > index f9f2856e0c81..e48c258a3008 100644 > --- a/Platform/ARM/Drivers/NorFlashDxe/NorFlashFvb.c > +++ b/Platform/ARM/Drivers/NorFlashDxe/NorFlashFvb.c > @@ -18,7 +18,6 @@ > #include > > #include > > =20 > > -#include "NorFlash.h" > > #include "NorFlashCommon.h" > > =20 > > extern UINTN mFlashNvStorageVariableBase; > > diff --git a/Platform/ARM/Drivers/NorFlashDxe/NorFlashStandaloneMm.c b/Pl= atform/ARM/Drivers/NorFlashDxe/NorFlashStandaloneMm.c > index 5bff524e5e18..85198b98e8a8 100644 > --- a/Platform/ARM/Drivers/NorFlashDxe/NorFlashStandaloneMm.c > +++ b/Platform/ARM/Drivers/NorFlashDxe/NorFlashStandaloneMm.c > @@ -11,7 +11,6 @@ > #include > > #include > > =20 > > -#include "NorFlash.h" > > #include "NorFlashCommon.h" > > =20 > > // > -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118963): https://edk2.groups.io/g/devel/message/118963 Mute This Topic: https://groups.io/mt/105690942/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-