[edk2-devel] [PATCH v4 2/8] MdeModulePkg/VariableFlashInfoLib: Add initial library

Michael Kubacki mikuback at linux.microsoft.com
Mon Apr 25 22:21:52 UTC 2022


Thanks for your review. I will make that change.

Regards,
Michael

On 4/25/2022 12:05 PM, Sami Mujawar wrote:
> Hi Michael,
> 
> I have a minor suggestion marked inline as [SAMI].
> 
> Otherwise this patch looks good to me.
> 
> Reviewed-by: Sami Mujawar <sami.mujawar at arm.com>
> 
> Regards,
> 
> Sami Mujawar
> 
> On 12/04/2022 05:29 pm, Michael Kubacki via groups.io wrote:
>> From: Michael Kubacki <michael.kubacki at microsoft.com>
>>
>> REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3479
>>
>> Adds a new library class VariableFlashInfoLib that abstracts access
>> to variable flash information. The instance provided first attempts
>> to retrieve information from the Variable Flash Info HOB. If that
>> HOB is not present, it falls back to the PCDs defined in
>> MdeModulePkg.
>>
>> This fall back behavior provides backward compatibility for platforms
>> that only provide PCDs but also allows platforms that need to
>> dynamically provide the information using the Variable Flash Info HOB
>> to do so at runtime.
>>
>> Cc: Jian J Wang <jian.j.wang at intel.com>
>> Cc: Hao A Wu <hao.a.wu at intel.com>
>> Cc: Liming Gao <gaoliming at byosoft.com.cn>
>> Signed-off-by: Michael Kubacki <michael.kubacki at microsoft.com>
>> ---
>>   
>> MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.c   
>> | 178 ++++++++++++++++++++
>>   
>> MdeModulePkg/Include/Library/VariableFlashInfoLib.h                        
>> |  68 ++++++++
>>   
>> MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf 
>> |  48 ++++++
>>   
>> MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.uni 
>> |  12 ++
>>   
>> MdeModulePkg/MdeModulePkg.dec                                              
>> |   4 +
>>   
>> MdeModulePkg/MdeModulePkg.dsc                                              
>> |   2 +
>>   6 files changed, 312 insertions(+)
>>
>> diff --git 
>> a/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.c 
>> b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.c 
>>
>> new file mode 100644
>> index 000000000000..a1db97bdf218
>> --- /dev/null
>> +++ 
>> b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.c 
>>
>> @@ -0,0 +1,178 @@
>> +/** @file
>> +  Variable Flash Information Library
>> +
>> +  Copyright (c) Microsoft Corporation<BR>
>> +
>> +  SPDX-License-Identifier: BSD-2-Clause-Patent
>> +
>> +**/
>> +
>> +#include <Uefi.h>
>> +#include <Pi/PiMultiPhase.h>
>> +#include <Guid/VariableFlashInfo.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/HobLib.h>
>> +#include <Library/VariableFlashInfoLib.h>
>> +
>> +/**
>> +  Get the HOB that contains variable flash information.
>> +
>> +  @param[out] VariableFlashInfo   Pointer to a pointer to set to the 
>> variable flash information structure.
>> +
>> +  @retval EFI_SUCCESS             Variable flash information was 
>> found successfully.
>> +  @retval EFI_INVALID_PARAMETER   The VariableFlashInfo pointer given 
>> is NULL.
>> +  @retval EFI_NOT_FOUND           Variable flash information could 
>> not be found.
>> +
>> +**/
>> +EFI_STATUS
>> +GetVariableFlashInfoFromHob (
>> +  OUT VARIABLE_FLASH_INFO  **VariableFlashInfo
>> +  )
> [SAMI] Can this function be made STATIC, please?
>> +{
>> +  EFI_HOB_GUID_TYPE  *GuidHob;
>> +
>> +  if (VariableFlashInfo == NULL) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  GuidHob = GetFirstGuidHob (&gVariableFlashInfoHobGuid);
>> +  if (GuidHob == NULL) {
>> +    return EFI_NOT_FOUND;
>> +  }
>> +
>> +  *VariableFlashInfo = GET_GUID_HOB_DATA (GuidHob);
>> +
>> +  //
>> +  // Assert if more than one variable flash information HOB is present.
>> +  //
>> +  DEBUG_CODE (
>> +    if ((GetNextGuidHob (&gVariableFlashInfoHobGuid, GET_NEXT_HOB 
>> (GuidHob)) != NULL)) {
>> +    DEBUG ((DEBUG_ERROR, "ERROR: Found two variable flash information 
>> HOBs\n"));
>> +    ASSERT (FALSE);
>> +  }
>> +
>> +    );
>> +
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +/**
>> +  Get the base address and size for the NV storage area used for UEFI 
>> variable storage.
>> +
>> +  @param[out] BaseAddress    The NV storage base address.
>> +  @param[out] Length         The NV storage length in bytes.
>> +
>> +  @retval EFI_SUCCESS             NV storage information was found 
>> successfully.
>> +  @retval EFI_INVALID_PARAMETER   A required pointer parameter is NULL.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +GetVariableFlashNvStorageInfo (
>> +  OUT EFI_PHYSICAL_ADDRESS  *BaseAddress,
>> +  OUT UINT64                *Length
>> +  )
>> +{
>> +  EFI_STATUS           Status;
>> +  VARIABLE_FLASH_INFO  *VariableFlashInfo;
>> +
>> +  if ((BaseAddress == NULL) || (Length == NULL)) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  Status = GetVariableFlashInfoFromHob (&VariableFlashInfo);
>> +  if (!EFI_ERROR (Status)) {
>> +    *BaseAddress = VariableFlashInfo->NvVariableBaseAddress;
>> +    *Length      = VariableFlashInfo->NvVariableLength;
>> +  } else {
>> +    *BaseAddress = (EFI_PHYSICAL_ADDRESS)(PcdGet64 
>> (PcdFlashNvStorageVariableBase64) != 0 ?
>> +                                          PcdGet64 
>> (PcdFlashNvStorageVariableBase64) :
>> +                                          PcdGet32 
>> (PcdFlashNvStorageVariableBase)
>> +                                          );
>> +    *Length = (UINT64)PcdGet32 (PcdFlashNvStorageVariableSize);
>> +  }
>> +
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +/**
>> +  Get the base address and size for the fault tolerant write (FTW) spare
>> +  area used for UEFI variable storage.
>> +
>> +  @param[out] BaseAddress    The FTW spare base address.
>> +  @param[out] Length         The FTW spare length in bytes.
>> +
>> +  @retval EFI_SUCCESS             FTW spare information was found 
>> successfully.
>> +  @retval EFI_INVALID_PARAMETER   A required pointer parameter is NULL.
>> +  @retval EFI_NOT_FOUND           FTW spare information could not be 
>> found.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +GetVariableFlashFtwSpareInfo (
>> +  OUT EFI_PHYSICAL_ADDRESS  *BaseAddress,
>> +  OUT UINT64                *Length
>> +  )
>> +{
>> +  EFI_STATUS           Status;
>> +  VARIABLE_FLASH_INFO  *VariableFlashInfo;
>> +
>> +  if ((BaseAddress == NULL) || (Length == NULL)) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  Status = GetVariableFlashInfoFromHob (&VariableFlashInfo);
>> +  if (!EFI_ERROR (Status)) {
>> +    *BaseAddress = VariableFlashInfo->FtwSpareBaseAddress;
>> +    *Length      = VariableFlashInfo->FtwSpareLength;
>> +  } else {
>> +    *BaseAddress = (EFI_PHYSICAL_ADDRESS)(PcdGet64 
>> (PcdFlashNvStorageFtwSpareBase64) != 0 ?
>> +                                          PcdGet64 
>> (PcdFlashNvStorageFtwSpareBase64) :
>> +                                          PcdGet32 
>> (PcdFlashNvStorageFtwSpareBase)
>> +                                          );
>> +    *Length = (UINT64)PcdGet32 (PcdFlashNvStorageFtwSpareSize);
>> +  }
>> +
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +/**
>> +  Get the base address and size for the fault tolerant write (FTW) 
>> working
>> +  area used for UEFI variable storage.
>> +
>> +  @param[out] BaseAddress    The FTW working area base address.
>> +  @param[out] Length         The FTW working area length in bytes.
>> +
>> +  @retval EFI_SUCCESS             FTW working information was found 
>> successfully.
>> +  @retval EFI_INVALID_PARAMETER   A required pointer parameter is NULL.
>> +  @retval EFI_NOT_FOUND           FTW working information could not 
>> be found.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +GetVariableFlashFtwWorkingInfo (
>> +  OUT EFI_PHYSICAL_ADDRESS  *BaseAddress,
>> +  OUT UINT64                *Length
>> +  )
>> +{
>> +  EFI_STATUS           Status;
>> +  VARIABLE_FLASH_INFO  *VariableFlashInfo;
>> +
>> +  if ((BaseAddress == NULL) || (Length == NULL)) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  Status = GetVariableFlashInfoFromHob (&VariableFlashInfo);
>> +  if (!EFI_ERROR (Status)) {
>> +    *BaseAddress = VariableFlashInfo->FtwWorkingBaseAddress;
>> +    *Length      = VariableFlashInfo->FtwWorkingLength;
>> +  } else {
>> +    *BaseAddress = (EFI_PHYSICAL_ADDRESS)(PcdGet64 
>> (PcdFlashNvStorageFtwWorkingBase64) != 0 ?
>> +                                          PcdGet64 
>> (PcdFlashNvStorageFtwWorkingBase64) :
>> +                                          PcdGet32 
>> (PcdFlashNvStorageFtwWorkingBase)
>> +                                          );
>> +    *Length = (UINT64)PcdGet32 (PcdFlashNvStorageFtwWorkingSize);
>> +  }
>> +
>> +  return EFI_SUCCESS;
>> +}
>> diff --git a/MdeModulePkg/Include/Library/VariableFlashInfoLib.h 
>> b/MdeModulePkg/Include/Library/VariableFlashInfoLib.h
>> new file mode 100644
>> index 000000000000..1367be9376ea
>> --- /dev/null
>> +++ b/MdeModulePkg/Include/Library/VariableFlashInfoLib.h
>> @@ -0,0 +1,68 @@
>> +/** @file
>> +  Variable Flash Information Library
>> +
>> +Copyright (c) Microsoft Corporation<BR>
>> +SPDX-License-Identifier: BSD-2-Clause-Patent
>> +
>> +**/
>> +
>> +#ifndef VARIABLE_FLASH_INFO_LIB_H_
>> +#define VARIABLE_FLASH_INFO_LIB_H_
>> +
>> +/**
>> +  Get the base address and size for the NV storage area used for UEFI 
>> variable storage.
>> +
>> +  @param[out] BaseAddress    The NV storage base address.
>> +  @param[out] Length         The NV storage length in bytes.
>> +
>> +  @retval EFI_SUCCESS             NV storage information was found 
>> successfully.
>> +  @retval EFI_INVALID_PARAMETER   A required pointer parameter is NULL.
>> +  @retval EFI_NOT_FOUND           NV storage information could not be 
>> found.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +GetVariableFlashNvStorageInfo (
>> +  OUT EFI_PHYSICAL_ADDRESS  *BaseAddress,
>> +  OUT UINT64                *Length
>> +  );
>> +
>> +/**
>> +  Get the base address and size for the fault tolerant write (FTW) spare
>> +  area used for UEFI variable storage.
>> +
>> +  @param[out] BaseAddress    The FTW spare base address.
>> +  @param[out] Length         The FTW spare length in bytes.
>> +
>> +  @retval EFI_SUCCESS             FTW spare information was found 
>> successfully.
>> +  @retval EFI_INVALID_PARAMETER   A required pointer parameter is NULL.
>> +  @retval EFI_NOT_FOUND           FTW spare information could not be 
>> found.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +GetVariableFlashFtwSpareInfo (
>> +  OUT EFI_PHYSICAL_ADDRESS  *BaseAddress,
>> +  OUT UINT64                *Length
>> +  );
>> +
>> +/**
>> +  Get the base address and size for the fault tolerant write (FTW) 
>> working
>> +  area used for UEFI variable storage.
>> +
>> +  @param[out] BaseAddress    The FTW working area base address.
>> +  @param[out] Length         The FTW working area length in bytes.
>> +
>> +  @retval EFI_SUCCESS             FTW working information was found 
>> successfully.
>> +  @retval EFI_INVALID_PARAMETER   A required pointer parameter is NULL.
>> +  @retval EFI_NOT_FOUND           FTW working information could not 
>> be found.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +GetVariableFlashFtwWorkingInfo (
>> +  OUT EFI_PHYSICAL_ADDRESS  *BaseAddress,
>> +  OUT UINT64                *Length
>> +  );
>> +
>> +#endif
>> diff --git 
>> a/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf 
>> b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf 
>>
>> new file mode 100644
>> index 000000000000..70175e75f9b1
>> --- /dev/null
>> +++ 
>> b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf 
>>
>> @@ -0,0 +1,48 @@
>> +## @file
>> +#  Variable Flash Information Library
>> +#
>> +#  Provides services to access UEFI variable flash information.
>> +#
>> +#  Copyright (c) Microsoft Corporation<BR>
>> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
>> +##
>> +
>> +[Defines]
>> +  INF_VERSION       = 0x00010005
>> +  BASE_NAME         = BaseVariableFlashInfoLib
>> +  MODULE_UNI_FILE   = BaseVariableFlashInfoLib.uni
>> +  FILE_GUID         = DEC426C9-C92E-4BAD-8E93-3F61C261118B
>> +  MODULE_TYPE       = BASE
>> +  VERSION_STRING    = 1.0
>> +  LIBRARY_CLASS     = VariableFlashInfoLib
>> +
>> +#
>> +# The following information is for reference only and not required by 
>> the build tools.
>> +#
>> +#  VALID_ARCHITECTURES           = ANY
>> +#
>> +
>> +[Sources]
>> +  BaseVariableFlashInfoLib.c
>> +
>> +[Packages]
>> +  MdePkg/MdePkg.dec
>> +  MdeModulePkg/MdeModulePkg.dec
>> +
>> +[LibraryClasses]
>> +  DebugLib
>> +  HobLib
>> +
>> +[Guids]
>> +  gVariableFlashInfoHobGuid     ## CONSUMES     ## HOB
>> +
>> +[Pcd]
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase      
>> ## SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64    
>> ## SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize      
>> ## SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase      
>> ## SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64    
>> ## SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize      
>> ## SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase    
>> ## SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64  
>> ## SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize    
>> ## SOMETIMES_CONSUMES
>> diff --git 
>> a/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.uni 
>> b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.uni 
>>
>> new file mode 100644
>> index 000000000000..9a5348fa02a0
>> --- /dev/null
>> +++ 
>> b/MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.uni 
>>
>> @@ -0,0 +1,12 @@
>> +// /** @file
>> +// Variable Flash Information Library
>> +//
>> +// Copyright (c) Microsoft Corporation<BR>
>> +//
>> +// SPDX-License-Identifier: BSD-2-Clause-Patent
>> +//
>> +// **/
>> +
>> +#string STR_MODULE_ABSTRACT     #language en-US "UEFI variable flash 
>> information library"
>> +
>> +#string STR_MODULE_DESCRIPTION  #language en-US "Provides services to 
>> access UEFI variable flash information."
>> diff --git a/MdeModulePkg/MdeModulePkg.dec 
>> b/MdeModulePkg/MdeModulePkg.dec
>> index 4e82f5836096..2bcb9f9453af 100644
>> --- a/MdeModulePkg/MdeModulePkg.dec
>> +++ b/MdeModulePkg/MdeModulePkg.dec
>> @@ -154,6 +154,10 @@ [LibraryClasses]
>>     #
>>     VariablePolicyHelperLib|Include/Library/VariablePolicyHelperLib.h
>> +  ##  @libraryclass  Provides services to access UEFI variable flash 
>> information.
>> +  #
>> +  VariableFlashInfoLib|Include/Library/VariableFlashInfoLib.h
>> +
>>   [Guids]
>>     ## MdeModule package token space guid
>>     # Include/Guid/MdeModulePkgTokenSpace.h
>> diff --git a/MdeModulePkg/MdeModulePkg.dsc 
>> b/MdeModulePkg/MdeModulePkg.dsc
>> index b1d83461865e..90a0a7ec4a7c 100644
>> --- a/MdeModulePkg/MdeModulePkg.dsc
>> +++ b/MdeModulePkg/MdeModulePkg.dsc
>> @@ -103,6 +103,7 @@ [LibraryClasses]
>>     
>> DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProgressLibGraphics.inf 
>>
>>     
>> VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/VariablePolicyHelperLib.inf 
>>
>>     
>> MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf 
>>
>> +  
>> VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf 
>>
>>   [LibraryClasses.EBC.PEIM]
>>     IoLib|MdePkg/Library/PeiIoLibCpuIo/PeiIoLibCpuIo.inf
>> @@ -440,6 +441,7 @@ [Components]
>>     
>> MdeModulePkg/Library/FmpAuthenticationLibNull/FmpAuthenticationLibNull.inf 
>>
>>     MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf
>>     MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf
>> +  
>> MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf 
>>
>>   [Components.IA32, Components.X64, Components.AARCH64]
>>     MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
> 
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#89291): https://edk2.groups.io/g/devel/message/89291
Mute This Topic: https://groups.io/mt/90421972/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list