/** @file
Variable Flash Information Library
Copyright (c) Microsoft Corporation
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
/**
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;
}