Update the logic handling last attempt status codes from FmpDeviceCheckImageWithStatus() implementations to account for cases when the function return status code is EFI_SUCCESS (since the image was checked successfully) but the ImageUpdatable value is not valid. In addition the following sentence is removed from the LastAttemptStatus parameter definition for FmpDeviceCheckImageWithStatus() since it can lead to confusion. The expected status code value range is sufficient to implement the library API. "This value will only be checked when this function returns an error." Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Guomin Jiang <guomin.jiang@intel.com> Cc: Wei6 Xu <wei6.xu@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Guomin Jiang <guomin.jiang@intel.com>
609 lines
28 KiB
C
609 lines
28 KiB
C
/** @file
|
|
Provides firmware device specific services to support updates of a firmware
|
|
image stored in a firmware device.
|
|
|
|
Copyright (c) Microsoft Corporation.<BR>
|
|
Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#ifndef __FMP_DEVICE_LIB__
|
|
#define __FMP_DEVICE_LIB__
|
|
|
|
#include <Protocol/FirmwareManagement.h>
|
|
|
|
/**
|
|
Callback function that installs a Firmware Management Protocol instance onto
|
|
a handle.
|
|
|
|
@param[in] Handle The device handle to install a Firmware Management
|
|
Protocol instance.
|
|
|
|
@retval EFI_SUCCESS A Firmware Management Protocol instance was
|
|
installed onto Handle.
|
|
@retval EFI_INVALID_PARAMETER Handle is invalid
|
|
@retval other A Firmware Management Protocol instance could
|
|
not be installed onto Handle.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER)(
|
|
IN EFI_HANDLE Handle
|
|
);
|
|
|
|
/**
|
|
Callback function that uninstalls a Firmware Management Protocol instance from
|
|
a handle.
|
|
|
|
@param[in] Handle The device handle to uninstall a Firmware Management
|
|
Protocol instance.
|
|
|
|
@retval EFI_SUCCESS A Firmware Management Protocol instance was
|
|
uninstalled from Handle.
|
|
@retval EFI_INVALID_PARAMETER Handle is invalid
|
|
@retval other A Firmware Management Protocol instance could
|
|
not be uninstalled from Handle.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *FMP_DEVICE_LIB_REGISTER_FMP_UNINSTALLER)(
|
|
IN EFI_HANDLE Handle
|
|
);
|
|
|
|
/**
|
|
Provide a function to install the Firmware Management Protocol instance onto a
|
|
device handle when the device is managed by a driver that follows the UEFI
|
|
Driver Model. If the device is not managed by a driver that follows the UEFI
|
|
Driver Model, then EFI_UNSUPPORTED is returned.
|
|
|
|
@param[in] FmpInstaller Function that installs the Firmware Management
|
|
Protocol.
|
|
|
|
@retval EFI_SUCCESS The device is managed by a driver that follows the
|
|
UEFI Driver Model. FmpInstaller must be called on
|
|
each Driver Binding Start().
|
|
@retval EFI_UNSUPPORTED The device is not managed by a driver that follows
|
|
the UEFI Driver Model.
|
|
@retval other The Firmware Management Protocol for this firmware
|
|
device is not installed. The firmware device is
|
|
still locked using FmpDeviceLock().
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
RegisterFmpInstaller (
|
|
IN FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER FmpInstaller
|
|
);
|
|
|
|
/**
|
|
Provide a function to uninstall the Firmware Management Protocol instance from a
|
|
device handle when the device is managed by a driver that follows the UEFI
|
|
Driver Model. If the device is not managed by a driver that follows the UEFI
|
|
Driver Model, then EFI_UNSUPPORTED is returned.
|
|
|
|
@param[in] FmpUninstaller Function that installs the Firmware Management
|
|
Protocol.
|
|
|
|
@retval EFI_SUCCESS The device is managed by a driver that follows the
|
|
UEFI Driver Model. FmpUninstaller must be called on
|
|
each Driver Binding Stop().
|
|
@retval EFI_UNSUPPORTED The device is not managed by a driver that follows
|
|
the UEFI Driver Model.
|
|
@retval other The Firmware Management Protocol for this firmware
|
|
device is not installed. The firmware device is
|
|
still locked using FmpDeviceLock().
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
RegisterFmpUninstaller (
|
|
IN FMP_DEVICE_LIB_REGISTER_FMP_UNINSTALLER FmpUninstaller
|
|
);
|
|
|
|
/**
|
|
Set the device context for the FmpDeviceLib services when the device is
|
|
managed by a driver that follows the UEFI Driver Model. If the device is not
|
|
managed by a driver that follows the UEFI Driver Model, then EFI_UNSUPPORTED
|
|
is returned. Once a device context is set, the FmpDeviceLib services
|
|
operate on the currently set device context.
|
|
|
|
@param[in] Handle Device handle for the FmpDeviceLib services.
|
|
If Handle is NULL, then Context is freed.
|
|
@param[in, out] Context Device context for the FmpDeviceLib services.
|
|
If Context is NULL, then a new context is allocated
|
|
for Handle and the current device context is set and
|
|
returned in Context. If Context is not NULL, then
|
|
the current device context is set.
|
|
|
|
@retval EFI_SUCCESS The device is managed by a driver that follows the
|
|
UEFI Driver Model.
|
|
@retval EFI_UNSUPPORTED The device is not managed by a driver that follows
|
|
the UEFI Driver Model.
|
|
@retval other The Firmware Management Protocol for this firmware
|
|
device is not installed. The firmware device is
|
|
still locked using FmpDeviceLock().
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceSetContext (
|
|
IN EFI_HANDLE Handle,
|
|
IN OUT VOID **Context
|
|
);
|
|
|
|
/**
|
|
Returns the size, in bytes, of the firmware image currently stored in the
|
|
firmware device. This function is used to by the GetImage() and
|
|
GetImageInfo() services of the Firmware Management Protocol. If the image
|
|
size can not be determined from the firmware device, then 0 must be returned.
|
|
|
|
@param[out] Size Pointer to the size, in bytes, of the firmware image
|
|
currently stored in the firmware device.
|
|
|
|
@retval EFI_SUCCESS The size of the firmware image currently
|
|
stored in the firmware device was returned.
|
|
@retval EFI_INVALID_PARAMETER Size is NULL.
|
|
@retval EFI_UNSUPPORTED The firmware device does not support reporting
|
|
the size of the currently stored firmware image.
|
|
@retval EFI_DEVICE_ERROR An error occurred attempting to determine the
|
|
size of the firmware image currently stored in
|
|
in the firmware device.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceGetSize (
|
|
OUT UINTN *Size
|
|
);
|
|
|
|
/**
|
|
Returns the GUID value used to fill in the ImageTypeId field of the
|
|
EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo()
|
|
service of the Firmware Management Protocol. If EFI_UNSUPPORTED is returned,
|
|
then the ImageTypeId field is set to gEfiCallerIdGuid. If EFI_SUCCESS is
|
|
returned, then ImageTypeId is set to the Guid returned from this function.
|
|
|
|
@param[out] Guid Double pointer to a GUID value that is updated to point to
|
|
to a GUID value. The GUID value is not allocated and must
|
|
not be modified or freed by the caller.
|
|
|
|
@retval EFI_SUCCESS EFI_FIRMWARE_IMAGE_DESCRIPTOR ImageTypeId GUID is set
|
|
to the returned Guid value.
|
|
@retval EFI_UNSUPPORTED EFI_FIRMWARE_IMAGE_DESCRIPTOR ImageTypeId GUID is set
|
|
to gEfiCallerIdGuid.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceGetImageTypeIdGuidPtr (
|
|
OUT EFI_GUID **Guid
|
|
);
|
|
|
|
/**
|
|
Returns values used to fill in the AttributesSupported and AttributesSettings
|
|
fields of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the
|
|
GetImageInfo() service of the Firmware Management Protocol. The following
|
|
bit values from the Firmware Management Protocol may be combined:
|
|
IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
|
|
IMAGE_ATTRIBUTE_RESET_REQUIRED
|
|
IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
|
|
IMAGE_ATTRIBUTE_IN_USE
|
|
IMAGE_ATTRIBUTE_UEFI_IMAGE
|
|
|
|
@param[out] Supported Attributes supported by this firmware device.
|
|
@param[out] Setting Attributes settings for this firmware device.
|
|
|
|
@retval EFI_SUCCESS The attributes supported by the firmware
|
|
device were returned.
|
|
@retval EFI_INVALID_PARAMETER Supported is NULL.
|
|
@retval EFI_INVALID_PARAMETER Setting is NULL.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceGetAttributes (
|
|
OUT UINT64 *Supported,
|
|
OUT UINT64 *Setting
|
|
);
|
|
|
|
/**
|
|
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. If EFI_SUCCESS is returned, then
|
|
the firmware device supports a method to report the LowestSupportedVersion
|
|
value from the currently stored firmware image. If the value can not be
|
|
reported for the firmware image currently stored in the firmware device, then
|
|
EFI_UNSUPPORTED must be returned. EFI_DEVICE_ERROR is returned if an error
|
|
occurs attempting to retrieve the LowestSupportedVersion value for the
|
|
currently stored firmware image.
|
|
|
|
@note It is recommended that all firmware devices support a method to report
|
|
the LowestSupportedVersion value from the currently stored firmware
|
|
image.
|
|
|
|
@param[out] LowestSupportedVersion LowestSupportedVersion value retrieved
|
|
from the currently stored firmware image.
|
|
|
|
@retval EFI_SUCCESS The lowest supported version of currently stored
|
|
firmware image was returned in LowestSupportedVersion.
|
|
@retval EFI_UNSUPPORTED The firmware device does not support a method to
|
|
report the lowest supported version of the currently
|
|
stored firmware image.
|
|
@retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the lowest
|
|
supported version of the currently stored firmware
|
|
image.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceGetLowestSupportedVersion (
|
|
OUT UINT32 *LowestSupportedVersion
|
|
);
|
|
|
|
/**
|
|
Returns the Null-terminated Unicode string that is used to fill in the
|
|
VersionName field of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is
|
|
returned by the GetImageInfo() service of the Firmware Management Protocol.
|
|
The returned string must be allocated using EFI_BOOT_SERVICES.AllocatePool().
|
|
|
|
@note It is recommended that all firmware devices support a method to report
|
|
the VersionName string from the currently stored firmware image.
|
|
|
|
@param[out] VersionString The version string retrieved from the currently
|
|
stored firmware image.
|
|
|
|
@retval EFI_SUCCESS The version string of currently stored
|
|
firmware image was returned in Version.
|
|
@retval EFI_INVALID_PARAMETER VersionString is NULL.
|
|
@retval EFI_UNSUPPORTED The firmware device does not support a method
|
|
to report the version string of the currently
|
|
stored firmware image.
|
|
@retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the
|
|
version string of the currently stored
|
|
firmware image.
|
|
@retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate the
|
|
buffer for the version string of the currently
|
|
stored firmware image.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceGetVersionString (
|
|
OUT CHAR16 **VersionString
|
|
);
|
|
|
|
/**
|
|
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. If EFI_SUCCESS is returned, then
|
|
the firmware device supports a method to report the Version value from the
|
|
currently stored firmware image. If the value can not be reported for the
|
|
firmware image currently stored in the firmware device, then EFI_UNSUPPORTED
|
|
must be returned. EFI_DEVICE_ERROR is returned if an error occurs attempting
|
|
to retrieve the LowestSupportedVersion value for the currently stored firmware
|
|
image.
|
|
|
|
@note It is recommended that all firmware devices support a method to report
|
|
the Version value from the currently stored firmware image.
|
|
|
|
@param[out] Version The version value retrieved from the currently stored
|
|
firmware image.
|
|
|
|
@retval EFI_SUCCESS The version of currently stored firmware image was
|
|
returned in Version.
|
|
@retval EFI_UNSUPPORTED The firmware device does not support a method to
|
|
report the version of the currently stored firmware
|
|
image.
|
|
@retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the version
|
|
of the currently stored firmware image.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceGetVersion (
|
|
OUT UINT32 *Version
|
|
);
|
|
|
|
/**
|
|
Returns the value used to fill in the HardwareInstance field of the
|
|
EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo()
|
|
service of the Firmware Management Protocol. If EFI_SUCCESS is returned, then
|
|
the firmware device supports a method to report the HardwareInstance value.
|
|
If the value can not be reported for the firmware device, then EFI_UNSUPPORTED
|
|
must be returned. EFI_DEVICE_ERROR is returned if an error occurs attempting
|
|
to retrieve the HardwareInstance value for the firmware device.
|
|
|
|
@param[out] HardwareInstance The hardware instance value for the firmware
|
|
device.
|
|
|
|
@retval EFI_SUCCESS The hardware instance for the current firmware
|
|
device is returned in HardwareInstance.
|
|
@retval EFI_UNSUPPORTED The firmware device does not support a method to
|
|
report the hardware instance value.
|
|
@retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the hardware
|
|
instance value.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceGetHardwareInstance (
|
|
OUT UINT64 *HardwareInstance
|
|
);
|
|
|
|
/**
|
|
Returns a copy of the firmware image currently stored in the firmware device.
|
|
|
|
@note It is recommended that all firmware devices support a method to retrieve
|
|
a copy currently stored firmware image. This can be used to support
|
|
features such as recovery and rollback.
|
|
|
|
@param[out] Image Pointer to a caller allocated buffer where the
|
|
currently stored firmware image is copied to.
|
|
@param[in, out] ImageSize Pointer the size, in bytes, of the Image buffer.
|
|
On return, points to the size, in bytes, of firmware
|
|
image currently stored in the firmware device.
|
|
|
|
@retval EFI_SUCCESS Image contains a copy of the firmware image
|
|
currently stored in the firmware device, and
|
|
ImageSize contains the size, in bytes, of the
|
|
firmware image currently stored in the
|
|
firmware device.
|
|
@retval EFI_BUFFER_TOO_SMALL The buffer specified by ImageSize is too small
|
|
to hold the firmware image currently stored in
|
|
the firmware device. The buffer size required
|
|
is returned in ImageSize.
|
|
@retval EFI_INVALID_PARAMETER The Image is NULL.
|
|
@retval EFI_INVALID_PARAMETER The ImageSize is NULL.
|
|
@retval EFI_UNSUPPORTED The operation is not supported.
|
|
@retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the
|
|
firmware image currently stored in the firmware
|
|
device.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceGetImage (
|
|
OUT VOID *Image,
|
|
IN OUT UINTN *ImageSize
|
|
);
|
|
|
|
/**
|
|
Checks if a new firmware image is valid for the firmware device. This
|
|
function allows firmware update operation to validate the firmware image
|
|
before FmpDeviceSetImage() is called.
|
|
|
|
@param[in] Image Points to a new firmware image.
|
|
@param[in] ImageSize Size, in bytes, of a new firmware image.
|
|
@param[out] ImageUpdatable Indicates if a new firmware image is valid for
|
|
a firmware update to the firmware device. The
|
|
following values from the Firmware Management
|
|
Protocol are supported:
|
|
IMAGE_UPDATABLE_VALID
|
|
IMAGE_UPDATABLE_INVALID
|
|
IMAGE_UPDATABLE_INVALID_TYPE
|
|
IMAGE_UPDATABLE_INVALID_OLD
|
|
IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE
|
|
|
|
@retval EFI_SUCCESS The image was successfully checked. Additional
|
|
status information is returned in
|
|
ImageUpdatable.
|
|
@retval EFI_INVALID_PARAMETER Image is NULL.
|
|
@retval EFI_INVALID_PARAMETER ImageUpdatable is NULL.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceCheckImage (
|
|
IN CONST VOID *Image,
|
|
IN UINTN ImageSize,
|
|
OUT UINT32 *ImageUpdatable
|
|
);
|
|
|
|
/**
|
|
Checks if a new firmware image is valid for the firmware device. This
|
|
function allows firmware update operation to validate the firmware image
|
|
before FmpDeviceSetImage() is called.
|
|
|
|
@param[in] Image Points to a new firmware image.
|
|
@param[in] ImageSize Size, in bytes, of a new firmware image.
|
|
@param[out] ImageUpdatable Indicates if a new firmware image is valid for
|
|
a firmware update to the firmware device. The
|
|
following values from the Firmware Management
|
|
Protocol are supported:
|
|
IMAGE_UPDATABLE_VALID
|
|
IMAGE_UPDATABLE_INVALID
|
|
IMAGE_UPDATABLE_INVALID_TYPE
|
|
IMAGE_UPDATABLE_INVALID_OLD
|
|
IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE
|
|
@param[out] LastAttemptStatus A pointer to a UINT32 that holds the last attempt
|
|
status to report back to the ESRT table in case
|
|
of error.
|
|
|
|
The return status code must fall in the range of
|
|
LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE to
|
|
LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MAX_ERROR_CODE_VALUE.
|
|
|
|
If the value falls outside this range, it will be converted
|
|
to LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL.
|
|
|
|
@retval EFI_SUCCESS The image was successfully checked. Additional
|
|
status information is returned in
|
|
ImageUpdatable.
|
|
@retval EFI_INVALID_PARAMETER Image is NULL.
|
|
@retval EFI_INVALID_PARAMETER ImageUpdatable is NULL.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceCheckImageWithStatus (
|
|
IN CONST VOID *Image,
|
|
IN UINTN ImageSize,
|
|
OUT UINT32 *ImageUpdatable,
|
|
OUT UINT32 *LastAttemptStatus
|
|
);
|
|
|
|
/**
|
|
Updates a firmware device with a new firmware image. This function returns
|
|
EFI_UNSUPPORTED if the firmware image is not updatable. If the firmware image
|
|
is updatable, the function should perform the following minimal validations
|
|
before proceeding to do the firmware image update.
|
|
- Validate that the image is a supported image for this firmware device.
|
|
Return EFI_ABORTED if the image is not supported. Additional details
|
|
on why the image is not a supported image may be returned in AbortReason.
|
|
- Validate the data from VendorCode if is not NULL. Firmware image
|
|
validation must be performed before VendorCode data validation.
|
|
VendorCode data is ignored or considered invalid if image validation
|
|
fails. Return EFI_ABORTED if the VendorCode data is invalid.
|
|
|
|
VendorCode enables vendor to implement vendor-specific firmware image update
|
|
policy. Null if the caller did not specify the policy or use the default
|
|
policy. As an example, vendor can implement a policy to allow an option to
|
|
force a firmware image update when the abort reason is due to the new firmware
|
|
image version is older than the current firmware image version or bad image
|
|
checksum. Sensitive operations such as those wiping the entire firmware image
|
|
and render the device to be non-functional should be encoded in the image
|
|
itself rather than passed with the VendorCode. AbortReason enables vendor to
|
|
have the option to provide a more detailed description of the abort reason to
|
|
the caller.
|
|
|
|
@param[in] Image Points to the new firmware image.
|
|
@param[in] ImageSize Size, in bytes, of the new firmware image.
|
|
@param[in] VendorCode This enables vendor to implement vendor-specific
|
|
firmware image update policy. NULL indicates
|
|
the caller did not specify the policy or use the
|
|
default policy.
|
|
@param[in] Progress A function used to report the progress of
|
|
updating the firmware device with the new
|
|
firmware image.
|
|
@param[in] CapsuleFwVersion The version of the new firmware image from the
|
|
update capsule that provided the new firmware
|
|
image.
|
|
@param[out] AbortReason A pointer to a pointer to a Null-terminated
|
|
Unicode string providing more details on an
|
|
aborted operation. The buffer is allocated by
|
|
this function with
|
|
EFI_BOOT_SERVICES.AllocatePool(). It is the
|
|
caller's responsibility to free this buffer with
|
|
EFI_BOOT_SERVICES.FreePool().
|
|
|
|
@retval EFI_SUCCESS The firmware device was successfully updated
|
|
with the new firmware image.
|
|
@retval EFI_ABORTED The operation is aborted. Additional details
|
|
are provided in AbortReason.
|
|
@retval EFI_INVALID_PARAMETER The Image was NULL.
|
|
@retval EFI_UNSUPPORTED The operation is not supported.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceSetImage (
|
|
IN CONST VOID *Image,
|
|
IN UINTN ImageSize,
|
|
IN CONST VOID *VendorCode OPTIONAL,
|
|
IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress OPTIONAL,
|
|
IN UINT32 CapsuleFwVersion,
|
|
OUT CHAR16 **AbortReason
|
|
);
|
|
|
|
/**
|
|
Updates a firmware device with a new firmware image. This function returns
|
|
EFI_UNSUPPORTED if the firmware image is not updatable. If the firmware image
|
|
is updatable, the function should perform the following minimal validations
|
|
before proceeding to do the firmware image update.
|
|
- Validate that the image is a supported image for this firmware device.
|
|
Return EFI_ABORTED if the image is not supported. Additional details
|
|
on why the image is not a supported image may be returned in AbortReason.
|
|
- Validate the data from VendorCode if is not NULL. Firmware image
|
|
validation must be performed before VendorCode data validation.
|
|
VendorCode data is ignored or considered invalid if image validation
|
|
fails. Return EFI_ABORTED if the VendorCode data is invalid.
|
|
|
|
VendorCode enables vendor to implement vendor-specific firmware image update
|
|
policy. Null if the caller did not specify the policy or use the default
|
|
policy. As an example, vendor can implement a policy to allow an option to
|
|
force a firmware image update when the abort reason is due to the new firmware
|
|
image version is older than the current firmware image version or bad image
|
|
checksum. Sensitive operations such as those wiping the entire firmware image
|
|
and render the device to be non-functional should be encoded in the image
|
|
itself rather than passed with the VendorCode. AbortReason enables vendor to
|
|
have the option to provide a more detailed description of the abort reason to
|
|
the caller.
|
|
|
|
@param[in] Image Points to the new firmware image.
|
|
@param[in] ImageSize Size, in bytes, of the new firmware image.
|
|
@param[in] VendorCode This enables vendor to implement vendor-specific
|
|
firmware image update policy. NULL indicates
|
|
the caller did not specify the policy or use the
|
|
default policy.
|
|
@param[in] Progress A function used to report the progress of
|
|
updating the firmware device with the new
|
|
firmware image.
|
|
@param[in] CapsuleFwVersion The version of the new firmware image from the
|
|
update capsule that provided the new firmware
|
|
image.
|
|
@param[out] AbortReason A pointer to a pointer to a Null-terminated
|
|
Unicode string providing more details on an
|
|
aborted operation. The buffer is allocated by
|
|
this function with
|
|
EFI_BOOT_SERVICES.AllocatePool(). It is the
|
|
caller's responsibility to free this buffer with
|
|
EFI_BOOT_SERVICES.FreePool().
|
|
@param[out] LastAttemptStatus A pointer to a UINT32 that holds the last attempt
|
|
status to report back to the ESRT table in case
|
|
of error. This value will only be checked when this
|
|
function returns an error.
|
|
|
|
The return status code must fall in the range of
|
|
LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE to
|
|
LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MAX_ERROR_CODE_VALUE.
|
|
|
|
If the value falls outside this range, it will be converted
|
|
to LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL.
|
|
|
|
@retval EFI_SUCCESS The firmware device was successfully updated
|
|
with the new firmware image.
|
|
@retval EFI_ABORTED The operation is aborted. Additional details
|
|
are provided in AbortReason.
|
|
@retval EFI_INVALID_PARAMETER The Image was NULL.
|
|
@retval EFI_UNSUPPORTED The operation is not supported.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceSetImageWithStatus (
|
|
IN CONST VOID *Image,
|
|
IN UINTN ImageSize,
|
|
IN CONST VOID *VendorCode OPTIONAL,
|
|
IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress OPTIONAL,
|
|
IN UINT32 CapsuleFwVersion,
|
|
OUT CHAR16 **AbortReason,
|
|
OUT UINT32 *LastAttemptStatus
|
|
);
|
|
|
|
/**
|
|
Lock the firmware device that contains a firmware image. Once a firmware
|
|
device is locked, any attempts to modify the firmware image contents in the
|
|
firmware device must fail.
|
|
|
|
@note It is recommended that all firmware devices support a lock method to
|
|
prevent modifications to a stored firmware image.
|
|
|
|
@note A firmware device lock mechanism is typically only cleared by a full
|
|
system reset (not just sleep state/low power mode).
|
|
|
|
@retval EFI_SUCCESS The firmware device was locked.
|
|
@retval EFI_UNSUPPORTED The firmware device does not support locking
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FmpDeviceLock (
|
|
VOID
|
|
);
|
|
|
|
#endif
|