/** @file | |
UEFI variable support functions for Firmware Management Protocol based | |
firmware updates. | |
Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR> | |
Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef __VARIABLE_SUPPORT_H__ | |
#define __VARIABLE_SUPPORT_H__ | |
/// | |
/// Default values for FMP Controller State information | |
/// | |
#define DEFAULT_VERSION 0x1 | |
#define DEFAULT_LOWESTSUPPORTEDVERSION 0x0 | |
#define DEFAULT_LASTATTEMPTSTATUS 0x0 | |
#define DEFAULT_LASTATTEMPTVERSION 0x0 | |
/// | |
/// Base UEFI Variable names for FMP Controller State information stored in | |
/// separate variables. | |
/// | |
#define VARNAME_VERSION L"FmpVersion" | |
#define VARNAME_LSV L"FmpLsv" | |
#define VARNAME_LASTATTEMPTSTATUS L"LastAttemptStatus" | |
#define VARNAME_LASTATTEMPTVERSION L"LastAttemptVersion" | |
/// | |
/// Base UEFI Variable name for FMP Controller State information stored in a | |
/// merged UEFI Variable. If the separate UEFI Variables above are detected, | |
/// then they are merged into a single variable and the separate variables are | |
/// deleted. | |
/// | |
#define VARNAME_FMPSTATE L"FmpState" | |
/// | |
/// FMP Controller State structure that is used to store the state of | |
/// a controller in one combined UEFI Variable. | |
/// | |
typedef struct { | |
BOOLEAN VersionValid; | |
BOOLEAN LsvValid; | |
BOOLEAN LastAttemptStatusValid; | |
BOOLEAN LastAttemptVersionValid; | |
UINT32 Version; | |
UINT32 Lsv; | |
UINT32 LastAttemptStatus; | |
UINT32 LastAttemptVersion; | |
} FMP_CONTROLLER_STATE; | |
/** | |
Generate the names of the UEFI Variables used to store state information for | |
a managed controller. The UEFI Variables names are a combination of a base | |
name and an optional hardware instance value as a 16 character hex value. If | |
the hardware instance value is 0, then the 16 character hex value is not | |
included. These storage for the UEFI Variable names are allocated using the | |
UEFI Boot Service AllocatePool() and the pointers are stored in the Private. | |
The following are examples of variable names produces for hardware instance | |
value 0 and value 0x1234567812345678. | |
FmpVersion | |
FmpLsv | |
LastAttemptStatus | |
LastAttemptVersion | |
FmpDxe | |
FmpVersion1234567812345678 | |
FmpLsv1234567812345678 | |
LastAttemptStatus1234567812345678 | |
LastAttemptVersion1234567812345678 | |
FmpDxe1234567812345678 | |
@param[in,out] Private Private context structure for the managed controller. | |
**/ | |
VOID | |
GenerateFmpVariableNames ( | |
IN OUT FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private | |
); | |
/** | |
Returns the value used to fill in the Version field of the | |
EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() | |
service of the Firmware Management Protocol. The value is read from a UEFI | |
variable. If the UEFI variables does not exist, then a default version value | |
is returned. | |
UEFI Variable accessed: GUID = gEfiCallerIdGuid, Name = L"FmpDxe" | |
@param[in] Private Private context structure for the managed controller. | |
@return The version of the firmware image in the firmware device. | |
**/ | |
UINT32 | |
GetVersionFromVariable ( | |
IN FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private | |
); | |
/** | |
Returns the value used to fill in the LowestSupportedVersion field of the | |
EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() | |
service of the Firmware Management Protocol. The value is read from a UEFI | |
variable. If the UEFI variables does not exist, then a default lowest | |
supported version value is returned. | |
UEFI Variable accessed: GUID = gEfiCallerIdGuid, Name = L"FmpDxe" | |
@param[in] Private Private context structure for the managed controller. | |
@return The lowest supported version of the firmware image in the firmware | |
device. | |
**/ | |
UINT32 | |
GetLowestSupportedVersionFromVariable ( | |
IN FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private | |
); | |
/** | |
Returns the value used to fill in the LastAttemptStatus field of the | |
EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() | |
service of the Firmware Management Protocol. The value is read from a UEFI | |
variable. If the UEFI variables does not exist, then a default last attempt | |
status value is returned. | |
UEFI Variable accessed: GUID = gEfiCallerIdGuid, Name = L"FmpDxe" | |
@param[in] Private Private context structure for the managed controller. | |
@return The last attempt status value for the most recent capsule update. | |
**/ | |
UINT32 | |
GetLastAttemptStatusFromVariable ( | |
IN FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private | |
); | |
/** | |
Returns the value used to fill in the LastAttemptVersion field of the | |
EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() | |
service of the Firmware Management Protocol. The value is read from a UEFI | |
variable. If the UEFI variables does not exist, then a default last attempt | |
version value is returned. | |
UEFI Variable accessed: GUID = gEfiCallerIdGuid, Name = L"FmpDxe" | |
@param[in] Private Private context structure for the managed controller. | |
@return The last attempt version value for the most recent capsule update. | |
**/ | |
UINT32 | |
GetLastAttemptVersionFromVariable ( | |
IN FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private | |
); | |
/** | |
Saves the version current of the firmware image in the firmware device to a | |
UEFI variable. | |
UEFI Variable accessed: GUID = gEfiCallerIdGuid, Name = L"FmpDxe" | |
@param[in] Private Private context structure for the managed controller. | |
@param[in] Version The version of the firmware image in the firmware device. | |
**/ | |
VOID | |
SetVersionInVariable ( | |
IN FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private, | |
IN UINT32 Version | |
); | |
/** | |
Saves the lowest supported version current of the firmware image in the | |
firmware device to a UEFI variable. | |
UEFI Variable accessed: GUID = gEfiCallerIdGuid, Name = L"FmpDxe" | |
@param[in] Private Private context structure for the managed | |
controller. | |
@param[in] LowestSupportedVersion The lowest supported version of the | |
firmware image in the firmware device. | |
**/ | |
VOID | |
SetLowestSupportedVersionInVariable ( | |
IN FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private, | |
IN UINT32 LowestSupportedVersion | |
); | |
/** | |
Saves the last attempt status value of the most recent FMP capsule update to a | |
UEFI variable. | |
UEFI Variable accessed: GUID = gEfiCallerIdGuid, Name = L"FmpDxe" | |
@param[in] Private Private context structure for the managed | |
controller. | |
@param[in] LastAttemptStatus The last attempt status of the most recent FMP | |
capsule update. | |
**/ | |
VOID | |
SetLastAttemptStatusInVariable ( | |
IN FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private, | |
IN UINT32 LastAttemptStatus | |
); | |
/** | |
Saves the last attempt version value of the most recent FMP capsule update to | |
a UEFI variable. | |
UEFI Variable accessed: GUID = gEfiCallerIdGuid, Name = L"FmpDxe" | |
@param[in] Private Private context structure for the managed | |
controller. | |
@param[in] LastAttemptVersion The last attempt version value of the most | |
recent FMP capsule update. | |
**/ | |
VOID | |
SetLastAttemptVersionInVariable ( | |
IN FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private, | |
IN UINT32 LastAttemptVersion | |
); | |
/** | |
Locks all the UEFI Variables that use gEfiCallerIdGuid of the currently | |
executing module. | |
@param[in] Private Private context structure for the managed controller. | |
@retval EFI_SUCCESS All UEFI variables are locked. | |
@retval EFI_UNSUPPORTED Variable Lock Protocol not found. | |
@retval Other One of the UEFI variables could not be locked. | |
**/ | |
EFI_STATUS | |
LockAllFmpVariables ( | |
IN FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private | |
); | |
#endif |