/** @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; | |
} |