The FMP dependency libraries are leveraged during firmware update to check for dependencies required to update the image. This change adds granular Last Attempt Status code support to these services so failures can be more easily observed during the firmware update process via Last Attempt Status codes. 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> Acked-by: Liming Gao <gaoliming@byosoft.com.cn> Reviewed-by: Wei6 Xu <wei6.xu@intel.com> Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
		
			
				
	
	
		
			105 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Fmp Capsule Dependency support functions for Firmware Management Protocol based
 | |
|   firmware updates.
 | |
| 
 | |
|   Copyright (c) Microsoft Corporation.<BR>
 | |
|   Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef __FMP_DEPENDENCY_LIB__
 | |
| #define __FMP_DEPENDENCY_LIB__
 | |
| 
 | |
| #include <PiDxe.h>
 | |
| #include <Protocol/FirmwareManagement.h>
 | |
| 
 | |
| //
 | |
| // Data struct to store FMP ImageType and version for dependency check.
 | |
| //
 | |
| typedef struct {
 | |
|   EFI_GUID ImageTypeId;
 | |
|   UINT32   Version;
 | |
| } FMP_DEPEX_CHECK_VERSION_DATA;
 | |
| 
 | |
| /**
 | |
|   Validate the dependency expression and output its size.
 | |
| 
 | |
|   @param[in]   Dependencies       Pointer to the EFI_FIRMWARE_IMAGE_DEP.
 | |
|   @param[in]   MaxDepexSize       Max size of the dependency.
 | |
|   @param[out]  DepexSize          Size of dependency.
 | |
|   @param[out]  LastAttemptStatus  An optional pointer to a UINT32 that holds the
 | |
|                                   last attempt status to report back to the caller.
 | |
|                                   If a last attempt status error code is not returned,
 | |
|                                   this function will not modify the LastAttemptStatus value.
 | |
| 
 | |
|   @retval TRUE    The dependency expression is valid.
 | |
|   @retval FALSE   The dependency expression is invalid.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| ValidateDependency (
 | |
|   IN  EFI_FIRMWARE_IMAGE_DEP  *Dependencies,
 | |
|   IN  UINTN                   MaxDepexSize,
 | |
|   OUT UINT32                  *DepexSize,
 | |
|   OUT UINT32                  *LastAttemptStatus OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get dependency from firmware image.
 | |
| 
 | |
|   @param[in]  Image               Points to the firmware image.
 | |
|   @param[in]  ImageSize           Size, in bytes, of the firmware image.
 | |
|   @param[out] DepexSize           Size, in bytes, of the dependency.
 | |
|   @param[out] LastAttemptStatus   An optional pointer to a UINT32 that holds the
 | |
|                                   last attempt status to report back to the caller.
 | |
|                                   If a last attempt status error code is not returned,
 | |
|                                   this function will not modify the LastAttemptStatus value.
 | |
|   @retval  The pointer to dependency.
 | |
|   @retval  Null
 | |
| 
 | |
| **/
 | |
| EFI_FIRMWARE_IMAGE_DEP*
 | |
| EFIAPI
 | |
| GetImageDependency (
 | |
|   IN  EFI_FIRMWARE_IMAGE_AUTHENTICATION *Image,
 | |
|   IN  UINTN                             ImageSize,
 | |
|   OUT UINT32                            *DepexSize,
 | |
|   OUT UINT32                            *LastAttemptStatus  OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Evaluate the dependencies. The caller must search all the Fmp instances and
 | |
|   gather their versions into FmpVersions parameter. If there is PUSH_GUID opcode
 | |
|   in dependency expression with no FmpVersions provided, the dependency will
 | |
|   evaluate to FALSE.
 | |
| 
 | |
|   @param[in]   Dependencies       Dependency expressions.
 | |
|   @param[in]   DependenciesSize   Size of Dependency expressions.
 | |
|   @param[in]   FmpVersions        Array of Fmp ImageTypeId and version. This
 | |
|                                   parameter is optional and can be set to NULL.
 | |
|   @param[in]   FmpVersionsCount   Element count of the array. When FmpVersions
 | |
|                                   is NULL, FmpVersionsCount must be 0.
 | |
|   @param[out]  LastAttemptStatus  An optional pointer to a UINT32 that holds the
 | |
|                                   last attempt status to report back to the caller.
 | |
|                                   This function will set the value to LAST_ATTEMPT_STATUS_SUCCESS
 | |
|                                   if an error code is not set.
 | |
| 
 | |
|   @retval TRUE    Dependency expressions evaluate to TRUE.
 | |
|   @retval FALSE   Dependency expressions evaluate to FALSE.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| EvaluateDependency (
 | |
|   IN  EFI_FIRMWARE_IMAGE_DEP        *Dependencies,
 | |
|   IN  UINTN                         DependenciesSize,
 | |
|   IN  FMP_DEPEX_CHECK_VERSION_DATA  *FmpVersions,      OPTIONAL
 | |
|   IN  UINTN                         FmpVersionsCount,
 | |
|   OUT UINT32                        *LastAttemptStatus OPTIONAL
 | |
|   );
 | |
| 
 | |
| #endif
 |