public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Michael Kubacki" <mikuback@linux.microsoft.com>
To: devel@edk2.groups.io
Cc: Jian J Wang <jian.j.wang@intel.com>,
	Hao A Wu <hao.a.wu@intel.com>,
	Liming Gao <gaoliming@byosoft.com.cn>,
	Ard Biesheuvel <ardb@kernel.org>,
	Sami Mujawar <sami.mujawar@arm.com>
Subject: [PATCH v5 1/8] MdeModulePkg: Add Variable Flash Info HOB
Date: Mon, 25 Apr 2022 21:29:11 -0400	[thread overview]
Message-ID: <20220426012918.1216-2-mikuback@linux.microsoft.com> (raw)
In-Reply-To: <20220426012918.1216-1-mikuback@linux.microsoft.com>

From: Michael Kubacki <michael.kubacki@microsoft.com>

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3479

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 <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
---
 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 drivers.
+
+  The HOB described in this file is currently optional. It is primarily provided
+  to allow a platform to dynamically describe the flash information to environments
+  such as Standalone MM that cannot access the prior method using dynamic 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 first 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 the 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 FaultTolerantWritePei
+     produces gEdkiiFaultTolerantWriteGuid which is a dependency for VariablePei.
+
+     Therefore, attaching a NULL class library to FaultTolerantWritePei with a
+     constructor that produces the HOB will guarantee it is produced before the first
+     point of consumption as the constructor is executed before the module entry point.
+
+  Copyright (c) Microsoft Corporation.<BR>
+
+  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, 0xfc, 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 device.
+  ///
+  /// Note that this address should align with the block size requirements 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 FtwSpareLength to support reclaim of
+  /// entire variable store area.
+  /// Note that this address should align with the block size requirements 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 requirements 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 NvVariableLength.
+  /// Note that this address should align with the block size requirements 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 value 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 should not span blocks.
+  /// Note that if the value is larger than one block size, this value should be block size aligned.
+  ///
+  UINT64                  FtwWorkingLength;
+} VARIABLE_FLASH_INFO;
+
+#pragma pack (pop)
+
+#endif
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index cf79292ec877..4e82f5836096 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -226,6 +226,10 @@ [Guids]
   #  Include/Guid/SmmVariableCommon.h
   gSmmVariableWriteGuid  = { 0x93ba1826, 0xdffb, 0x45dd, { 0x82, 0xa7, 0xe7, 0xdc, 0xaa, 0x3b, 0xbd, 0xf3 }}
 
+  ## Guid of the variable flash information HOB.
+  #  Include/Guid/VariableFlashInfo.h
+  gVariableFlashInfoHobGuid = { 0x5d11c653, 0x8154, 0x4ac3, { 0xa8, 0xc2, 0xfb, 0xa2, 0x89, 0x20, 0xfc, 0x90 }}
+
   ## Performance protocol guid that also acts as the performance HOB guid and performance variable GUID
   #  Include/Guid/Performance.h
   gPerformanceProtocolGuid       = { 0x76B6BDFA, 0x2ACD, 0x4462, { 0x9E, 0x3F, 0xCB, 0x58, 0xC9, 0x69, 0xD9, 0x37 } }
-- 
2.28.0.windows.1


  reply	other threads:[~2022-04-26  1:29 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-26  1:29 [PATCH v5 0/8] Add Variable Flash Info HOB Michael Kubacki
2022-04-26  1:29 ` Michael Kubacki [this message]
2022-04-26  1:29 ` [PATCH v5 2/8] MdeModulePkg/VariableFlashInfoLib: Add initial library Michael Kubacki
2022-04-26  1:29 ` [PATCH v5 3/8] MdeModulePkg/Variable: Consume Variable Flash Info Michael Kubacki
2022-04-26  1:29 ` [PATCH v5 4/8] MdeModulePkg/FaultTolerantWrite: " Michael Kubacki
2022-04-26  1:29 ` [PATCH v5 5/8] ArmVirtPkg/ArmVirt.dsc.inc: Add VariableFlashInfoLib Michael Kubacki
2022-04-26  1:29 ` [PATCH v5 6/8] EmulatorPkg: " Michael Kubacki
2022-04-26  1:29 ` [PATCH v5 7/8] OvmfPkg: " Michael Kubacki
2022-04-26  2:14   ` [edk2-devel] " Yao, Jiewen
2022-04-26  2:27     ` Michael Kubacki
2022-04-26  1:29 ` [PATCH v5 8/8] UefiPayloadPkg: " Michael Kubacki
2022-04-29 13:45 ` [PATCH v5 0/8] Add Variable Flash Info HOB Ard Biesheuvel
2022-04-29 15:48   ` Michael Kubacki
2022-05-05  1:27     ` 回复: [edk2-devel] " gaoliming
2022-05-06  1:52       ` Michael Kubacki
2022-05-10 15:01         ` Michael Kubacki
2022-05-13 18:23           ` Michael Kubacki
2022-05-14  1:16             ` 回复: " gaoliming
2022-05-16 15:27               ` Michael Kubacki
2022-05-16 17:36                 ` Ard Biesheuvel
2022-05-17  4:14                   ` Michael Kubacki
2022-05-17  5:22                     ` 回复: " gaoliming
2022-05-17 13:06                       ` Michael Kubacki
2022-05-17 16:10                         ` Michael Kubacki
2022-05-19  3:45                         ` 回复: " gaoliming
     [not found]                         ` <16F064E8C9D4EA0D.2722@groups.io>
2022-05-19  6:20                           ` gaoliming

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220426012918.1216-2-mikuback@linux.microsoft.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox