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