--- /dev/null
+/** @file\r
+ Variable Flash Information Library\r
+\r
+Copyright (c) Microsoft Corporation<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef VARIABLE_FLASH_INFO_LIB_H_\r
+#define VARIABLE_FLASH_INFO_LIB_H_\r
+\r
+/**\r
+ Get the base address and size for the NV storage area used for UEFI variable storage.\r
+\r
+ @param[out] BaseAddress The NV storage base address.\r
+ @param[out] Length The NV storage length in bytes.\r
+\r
+ @retval EFI_SUCCESS NV storage information was found successfully.\r
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.\r
+ @retval EFI_NOT_FOUND NV storage information could not be found.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetVariableFlashNvStorageInfo (\r
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
+ OUT UINT64 *Length\r
+ );\r
+\r
+/**\r
+ Get the base address and size for the fault tolerant write (FTW) spare\r
+ area used for UEFI variable storage.\r
+\r
+ @param[out] BaseAddress The FTW spare base address.\r
+ @param[out] Length The FTW spare length in bytes.\r
+\r
+ @retval EFI_SUCCESS FTW spare information was found successfully.\r
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.\r
+ @retval EFI_NOT_FOUND FTW spare information could not be found.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetVariableFlashFtwSpareInfo (\r
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
+ OUT UINT64 *Length\r
+ );\r
+\r
+/**\r
+ Get the base address and size for the fault tolerant write (FTW) working\r
+ area used for UEFI variable storage.\r
+\r
+ @param[out] BaseAddress The FTW working area base address.\r
+ @param[out] Length The FTW working area length in bytes.\r
+\r
+ @retval EFI_SUCCESS FTW working information was found successfully.\r
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.\r
+ @retval EFI_NOT_FOUND FTW working information could not be found.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetVariableFlashFtwWorkingInfo (\r
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
+ OUT UINT64 *Length\r
+ );\r
+\r
+#endif\r
--- /dev/null
+/** @file\r
+ Variable Flash Information Library\r
+\r
+ Copyright (c) Microsoft Corporation<BR>\r
+\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <Uefi.h>\r
+#include <Pi/PiMultiPhase.h>\r
+#include <Guid/VariableFlashInfo.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/HobLib.h>\r
+#include <Library/VariableFlashInfoLib.h>\r
+\r
+/**\r
+ Get the HOB that contains variable flash information.\r
+\r
+ @param[out] VariableFlashInfo Pointer to a pointer to set to the variable flash information structure.\r
+\r
+ @retval EFI_SUCCESS Variable flash information was found successfully.\r
+ @retval EFI_INVALID_PARAMETER The VariableFlashInfo pointer given is NULL.\r
+ @retval EFI_NOT_FOUND Variable flash information could not be found.\r
+\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+GetVariableFlashInfoFromHob (\r
+ OUT VARIABLE_FLASH_INFO **VariableFlashInfo\r
+ )\r
+{\r
+ EFI_HOB_GUID_TYPE *GuidHob;\r
+\r
+ if (VariableFlashInfo == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ GuidHob = GetFirstGuidHob (&gVariableFlashInfoHobGuid);\r
+ if (GuidHob == NULL) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ *VariableFlashInfo = GET_GUID_HOB_DATA (GuidHob);\r
+\r
+ //\r
+ // Assert if more than one variable flash information HOB is present.\r
+ //\r
+ DEBUG_CODE (\r
+ if ((GetNextGuidHob (&gVariableFlashInfoHobGuid, GET_NEXT_HOB (GuidHob)) != NULL)) {\r
+ DEBUG ((DEBUG_ERROR, "ERROR: Found two variable flash information HOBs\n"));\r
+ ASSERT (FALSE);\r
+ }\r
+\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Get the base address and size for the NV storage area used for UEFI variable storage.\r
+\r
+ @param[out] BaseAddress The NV storage base address.\r
+ @param[out] Length The NV storage length in bytes.\r
+\r
+ @retval EFI_SUCCESS NV storage information was found successfully.\r
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetVariableFlashNvStorageInfo (\r
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
+ OUT UINT64 *Length\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ VARIABLE_FLASH_INFO *VariableFlashInfo;\r
+\r
+ if ((BaseAddress == NULL) || (Length == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Status = GetVariableFlashInfoFromHob (&VariableFlashInfo);\r
+ if (!EFI_ERROR (Status)) {\r
+ *BaseAddress = VariableFlashInfo->NvVariableBaseAddress;\r
+ *Length = VariableFlashInfo->NvVariableLength;\r
+ } else {\r
+ *BaseAddress = (EFI_PHYSICAL_ADDRESS)(PcdGet64 (PcdFlashNvStorageVariableBase64) != 0 ?\r
+ PcdGet64 (PcdFlashNvStorageVariableBase64) :\r
+ PcdGet32 (PcdFlashNvStorageVariableBase)\r
+ );\r
+ *Length = (UINT64)PcdGet32 (PcdFlashNvStorageVariableSize);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Get the base address and size for the fault tolerant write (FTW) spare\r
+ area used for UEFI variable storage.\r
+\r
+ @param[out] BaseAddress The FTW spare base address.\r
+ @param[out] Length The FTW spare length in bytes.\r
+\r
+ @retval EFI_SUCCESS FTW spare information was found successfully.\r
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.\r
+ @retval EFI_NOT_FOUND FTW spare information could not be found.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetVariableFlashFtwSpareInfo (\r
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
+ OUT UINT64 *Length\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ VARIABLE_FLASH_INFO *VariableFlashInfo;\r
+\r
+ if ((BaseAddress == NULL) || (Length == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Status = GetVariableFlashInfoFromHob (&VariableFlashInfo);\r
+ if (!EFI_ERROR (Status)) {\r
+ *BaseAddress = VariableFlashInfo->FtwSpareBaseAddress;\r
+ *Length = VariableFlashInfo->FtwSpareLength;\r
+ } else {\r
+ *BaseAddress = (EFI_PHYSICAL_ADDRESS)(PcdGet64 (PcdFlashNvStorageFtwSpareBase64) != 0 ?\r
+ PcdGet64 (PcdFlashNvStorageFtwSpareBase64) :\r
+ PcdGet32 (PcdFlashNvStorageFtwSpareBase)\r
+ );\r
+ *Length = (UINT64)PcdGet32 (PcdFlashNvStorageFtwSpareSize);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Get the base address and size for the fault tolerant write (FTW) working\r
+ area used for UEFI variable storage.\r
+\r
+ @param[out] BaseAddress The FTW working area base address.\r
+ @param[out] Length The FTW working area length in bytes.\r
+\r
+ @retval EFI_SUCCESS FTW working information was found successfully.\r
+ @retval EFI_INVALID_PARAMETER A required pointer parameter is NULL.\r
+ @retval EFI_NOT_FOUND FTW working information could not be found.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetVariableFlashFtwWorkingInfo (\r
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
+ OUT UINT64 *Length\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ VARIABLE_FLASH_INFO *VariableFlashInfo;\r
+\r
+ if ((BaseAddress == NULL) || (Length == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Status = GetVariableFlashInfoFromHob (&VariableFlashInfo);\r
+ if (!EFI_ERROR (Status)) {\r
+ *BaseAddress = VariableFlashInfo->FtwWorkingBaseAddress;\r
+ *Length = VariableFlashInfo->FtwWorkingLength;\r
+ } else {\r
+ *BaseAddress = (EFI_PHYSICAL_ADDRESS)(PcdGet64 (PcdFlashNvStorageFtwWorkingBase64) != 0 ?\r
+ PcdGet64 (PcdFlashNvStorageFtwWorkingBase64) :\r
+ PcdGet32 (PcdFlashNvStorageFtwWorkingBase)\r
+ );\r
+ *Length = (UINT64)PcdGet32 (PcdFlashNvStorageFtwWorkingSize);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
--- /dev/null
+## @file\r
+# Variable Flash Information Library\r
+#\r
+# Provides services to access UEFI variable flash information.\r
+#\r
+# Copyright (c) Microsoft Corporation<BR>\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = BaseVariableFlashInfoLib\r
+ MODULE_UNI_FILE = BaseVariableFlashInfoLib.uni\r
+ FILE_GUID = DEC426C9-C92E-4BAD-8E93-3F61C261118B\r
+ MODULE_TYPE = BASE\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = VariableFlashInfoLib\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+# VALID_ARCHITECTURES = ANY\r
+#\r
+\r
+[Sources]\r
+ BaseVariableFlashInfoLib.c\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
+\r
+[LibraryClasses]\r
+ DebugLib\r
+ HobLib\r
+\r
+[Guids]\r
+ gVariableFlashInfoHobGuid ## CONSUMES ## HOB\r
+\r
+[Pcd]\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase ## SOMETIMES_CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 ## SOMETIMES_CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize ## SOMETIMES_CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase ## SOMETIMES_CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 ## SOMETIMES_CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize ## SOMETIMES_CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase ## SOMETIMES_CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 ## SOMETIMES_CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize ## SOMETIMES_CONSUMES\r