From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mx.groups.io with SMTP id smtpd.web11.954.1650936586126015079 for ; Mon, 25 Apr 2022 18:29:46 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@linux.microsoft.com header.s=default header.b=brDOw/6T; spf=pass (domain: linux.microsoft.com, ip: 13.77.154.182, mailfrom: mikuback@linux.microsoft.com) Received: from localhost.localdomain (unknown [47.195.228.134]) by linux.microsoft.com (Postfix) with ESMTPSA id BDB0820E8CAE; Mon, 25 Apr 2022 18:29:44 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com BDB0820E8CAE DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1650936585; bh=pCiNKWjRqFDw1f2hfx+hsEcFoMQdZILeXPxGM0icJr0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=brDOw/6Tct4k/eGUlcqdw4PgR/lx74qSp3LZrnM9h43zky2wqGkQu7Bme1dvPLjSm 6xZuJq2BJEZWBWEMZ+cj09Dd8bR2MEPnGCyQcbnvCy0H3Fu9LjhcKBZdXlWPxp3D5r bukIlkI05Tf3i40eTQJH2MDB7VYsuF0ukJXE/9P4= From: "Michael Kubacki" To: devel@edk2.groups.io Cc: Jian J Wang , Hao A Wu , Liming Gao , Ard Biesheuvel , Sami Mujawar Subject: [PATCH v5 1/8] MdeModulePkg: Add Variable Flash Info HOB Date: Mon, 25 Apr 2022 21:29:11 -0400 Message-Id: <20220426012918.1216-2-mikuback@linux.microsoft.com> X-Mailer: git-send-email 2.28.0.windows.1 In-Reply-To: <20220426012918.1216-1-mikuback@linux.microsoft.com> References: <20220426012918.1216-1-mikuback@linux.microsoft.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Michael Kubacki REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3479 Adds a new GUID that is used to identify a HOB that passes variable flash information to UEFI variable drivers in HOB consumption phases such as DXE, Traditional MM, and Standalone MM. This information was previously passed directly with PCDs such as EfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase and gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize. However, the Standalone MM variable driver instance does not have direct access to the PCD database. Therefore, this HOB will first be considered as the source for variable flash information and if platforms do not produce the HOB, reading the information from the PCDs directly will be a backup to provide backward compatibility. Cc: Jian J Wang Cc: Hao A Wu Cc: Liming Gao Signed-off-by: Michael Kubacki Acked-by: Ard Biesheuvel Reviewed-by: Liming Gao Reviewed-by: Sami Mujawar --- MdeModulePkg/Include/Guid/VariableFlashInfo.h | 111 ++++++++++++++++++++ MdeModulePkg/MdeModulePkg.dec | 4 + 2 files changed, 115 insertions(+) diff --git a/MdeModulePkg/Include/Guid/VariableFlashInfo.h b/MdeModulePkg= /Include/Guid/VariableFlashInfo.h new file mode 100644 index 000000000000..992a0dcdd384 --- /dev/null +++ b/MdeModulePkg/Include/Guid/VariableFlashInfo.h @@ -0,0 +1,111 @@ +/** @file + This file defines the GUID and data structure used to pass information= about + a variable store mapped on flash (i.e. a MMIO firmware volume) to the = modules + that consume that information such as the DXE and MM UEFI variable dri= vers. + + The HOB described in this file is currently optional. It is primarily = provided + to allow a platform to dynamically describe the flash information to e= nvironments + such as Standalone MM that cannot access the prior method using dynami= c PCDs. + + Even for platforms that use Standalone MM, if the information is only = stored + statically such as with FixedAtBuild PCDs, the HOB is not required. + + Every point of consumption in this package that uses the PCDs will fir= st check + for the HOB and use its value if present. + + Early modules such as the PEI UEFI variable driver might also consume = this + information. For modules such as these, that execute early in the boot= flow, + at least two approaches are possible depending on platform design. + + 1. If the information in the HOB exactly matches the information in th= e PCDs, + (i.e. the HOB values are set using the PCD values), let the driver = read + the information from the PCD and produce the HOB later in boot. + + 2. Produce the HOB very early in boot. For example, the earliest point= the HOB + is currently consumed is in FaultTolerantWritePei. Note that FaultT= olerantWritePei + produces gEdkiiFaultTolerantWriteGuid which is a dependency for Var= iablePei. + + Therefore, attaching a NULL class library to FaultTolerantWritePei = with a + constructor that produces the HOB will guarantee it is produced bef= ore the first + point of consumption as the constructor is executed before the modu= le entry point. + + Copyright (c) Microsoft Corporation.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef VARIABLE_FLASH_INFO_H_ +#define VARIABLE_FLASH_INFO_H_ + +#define VARIABLE_FLASH_INFO_HOB_GUID \ + { 0x5d11c653, 0x8154, 0x4ac3, { 0xa8, 0xc2, 0xfb, 0xa2, 0x89, 0x20, 0x= fc, 0x90 }} + +#define VARIABLE_FLASH_INFO_HOB_VERSION 1 + +extern EFI_GUID gVariableFlashInfoHobGuid; + +#pragma pack (push, 1) + +/// +/// This structure can be used to describe UEFI variable +/// flash information. +/// +typedef struct { + /// + /// Version of this structure. + /// + /// Increment the value when the structure is modified. + /// + UINT32 Version; + /// + /// Reserved field. + /// + /// Currently reserved for natural alignment. + /// + UINT32 Reserved; + /// + /// Base address of the non-volatile variable range in the flash devic= e. + /// + /// Note that this address should align with the block size requiremen= ts of the flash device. + /// + EFI_PHYSICAL_ADDRESS NvVariableBaseAddress; + /// + /// Size of the non-volatile variable range in the flash device. + /// + /// Note that this value should be less than or equal to FtwSpareLengt= h to support reclaim of + /// entire variable store area. + /// Note that this address should align with the block size requiremen= ts of the flash device. + /// + UINT64 NvVariableLength; + /// + /// Base address of the FTW spare block range in the flash device. + /// + /// Note that this address should align with the block size requiremen= ts of the flash device. + /// + EFI_PHYSICAL_ADDRESS FtwSpareBaseAddress; + /// + /// Size of the FTW spare block range in the flash device. + /// + /// Note that this value should be greater than or equal to NvVariable= Length. + /// Note that this address should align with the block size requiremen= ts of the flash device. + /// + UINT64 FtwSpareLength; + /// + /// Base address of the FTW working block range in the flash device. + /// + /// Note that if FtwWorkingLength is larger than on block size, this v= alue should be block size aligned. + /// + EFI_PHYSICAL_ADDRESS FtwWorkingBaseAddress; + /// + /// Size of the FTW working block range in the flash device. + /// + /// Note that if the value is less than on block size, the range shoul= d not span blocks. + /// Note that if the value is larger than one block size, this value s= hould be block size aligned. + /// + UINT64 FtwWorkingLength; +} VARIABLE_FLASH_INFO; + +#pragma pack (pop) + +#endif diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.de= c index cf79292ec877..4e82f5836096 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -226,6 +226,10 @@ [Guids] # Include/Guid/SmmVariableCommon.h gSmmVariableWriteGuid =3D { 0x93ba1826, 0xdffb, 0x45dd, { 0x82, 0xa7,= 0xe7, 0xdc, 0xaa, 0x3b, 0xbd, 0xf3 }} =20 + ## Guid of the variable flash information HOB. + # Include/Guid/VariableFlashInfo.h + gVariableFlashInfoHobGuid =3D { 0x5d11c653, 0x8154, 0x4ac3, { 0xa8, 0x= c2, 0xfb, 0xa2, 0x89, 0x20, 0xfc, 0x90 }} + ## Performance protocol guid that also acts as the performance HOB gui= d and performance variable GUID # Include/Guid/Performance.h gPerformanceProtocolGuid =3D { 0x76B6BDFA, 0x2ACD, 0x4462, { 0x9= E, 0x3F, 0xCB, 0x58, 0xC9, 0x69, 0xD9, 0x37 } } --=20 2.28.0.windows.1