|
@@ -0,0 +1,179 @@
|
|
|
+/** @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.
|
|
|
+
|
|
|
+**/
|
|
|
+STATIC
|
|
|
+EFI_STATUS
|
|
|
+GetVariableFlashInfoFromHob (
|
|
|
+ OUT VARIABLE_FLASH_INFO **VariableFlashInfo
|
|
|
+ )
|
|
|
+{
|
|
|
+ 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;
|
|
|
+}
|