/** @file
Copyright (c) 2024, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Reference(s):
- Platform Security Firmware Update for the A-profile Specification 1.0
(https://developer.arm.com/documentation/den0118/latest)
@par Glossary:
- FW - Firmware
- FWU - Firmware Update
- FWS - Firmware Storage
- PSA - Platform Security update for the A-profile specification
- IFD - Image File Data
- IF - Image File
- IMG - Image
- MM - Management Mode
- PROP - Property
- Bkup, Bkp - Backup
**/
#ifndef FWS_METADATA_H_
#define FWS_METADATA_H_
#include
#include "DiskGpt.h"
#define FWU_NUMBER_OF_BANKS FixedPcdGet32 (PcdFwuNumberOfBanks)
#define FWU_METADATA_PARTITION_NAME L"FWU-Metadata"
#define FWU_BKUP_METADATA_PARTITION_NAME L"Bkup-FWU-Metadata"
#define FWS_METADATA_FORMAT_V2 2
typedef struct FwsMetadata FWS_METADATA;
/** Enum value used in FWS_METADATA_SET_ACCEPT_STATE.
*/
typedef enum {
FwsImageUnAcceptReq, /// Set Image state as Unaccepted.
FwsImageAcceptReq, /// Set Image state as Accepted
FwsImageWriteUnAcceptReq, /// Set Image state as Unaccepted when starting write.
FwsAcceptReqMax,
} FWS_ACCEPT_REQ;
/**
Initialize and Load Firmware Update Store Metadata.
@param [in] GptHandle GptHandle
@param [out] FwsMetadata Firmware Update Store Metadata.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
@retval EFI_OUT_OF_RESOURCES
@retval EFI_ABORTED Metadata is invalid.
@retval Others Failed to get metadata from gpt partition.
**/
typedef EFI_STATUS (EFIAPI *FWS_METADATA_INIT_METADATA)(
IN GPT_PARTITION_HANDLE *GptHandle,
OUT FWS_METADATA **FwsMetadata
);
/**
Cleanup Loaded Firmware Update Store Metadata.
@param [in] FwsMetadata Firmware Update Store Metadata.
**/
typedef VOID (EFIAPI *FWS_METADATA_EXIT_METADATA)(
IN FWS_METADATA *FwsMetadata
);
/**
Get the number of banks.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [out] NumBanks Number of banks.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
typedef EFI_STATUS (EFIAPI *FWS_METADATA_GET_NUM_BANKS)(
IN FWS_METADATA *FwsMetadata,
OUT UINT8 *NumBanks
);
/**
Get the number of images per bank.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [out] NumImages Number of images per bank.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
typedef EFI_STATUS (EFIAPI *FWS_METADATA_GET_NUM_IMAGES)(
IN FWS_METADATA *FwsMetadata,
OUT UINT16 *NumImages
);
/**
Check trial state.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [out] TrialRunState If true, current is in the trial state.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
typedef EFI_STATUS (EFIAPI *FWS_METADATA_CHECK_TRIAL_RUN_STATE)(
IN FWS_METADATA *FwsMetadata,
OUT BOOLEAN *TrialRunState
);
/**
Get all image type guids.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [out] ImageTypeGuids Image type guid array.
@param [in,out] Size Byte size of @ImageTypeGuids.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
@retval EFI_BUFFER_TOO_SMALL Size of @ImageTypeGuids is too small to
contain all image type guids manged by
firmware update store.
**/
typedef EFI_STATUS (EFIAPI *FWS_METADATA_GET_IMAGE_TYPE_GUIDS)(
IN FWS_METADATA *FwsMetadata,
OUT EFI_GUID *ImageTypeGuids,
IN OUT UINT32 *Size
);
/**
Get location guid of image type guid.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] ImageTypeGuid Image type guid.
@param [out] LocationGuid Location Guids.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
typedef EFI_STATUS (EFIAPI *FWS_METADATA_GET_LOCATION_GUID)(
IN FWS_METADATA *FwsMetadata,
IN CONST EFI_GUID *ImageTypeGuid,
OUT EFI_GUID *LocationGuid
);
/**
Get image guid of image type guid.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] ImageTypeGuid Image type guid.
@param [in] BankIdx Bank Index.
@param [out] ImageGuid Image Guids.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
typedef EFI_STATUS (EFIAPI *FWS_METADATA_GET_IMAGE_GUID)(
IN FWS_METADATA *FwsMetadata,
IN CONST EFI_GUID *ImageTypeGuid,
IN UINT32 BankIdx,
OUT EFI_GUID *ImageGuid
);
/**
Get accept state of image type guid.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] ImageTypeGuid Image type guid.
@param [in] BankIdx Bank Index
@param [out] AcceptState If true, @ImageTypeGuid in the @BankIdx
is accepted.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
typedef EFI_STATUS (EFIAPI *FWS_METADATA_GET_ACCEPT_STATE)(
IN FWS_METADATA *FwsMetadata,
IN CONST EFI_GUID *ImageTypeGuid,
IN UINT32 BankIdx,
OUT BOOLEAN *AcceptState
);
/**
Set accept state of image type guid.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] ImageTypeGuid Image type guid.
@param [in] BankIdx Bank Index
@param [in] AcceptReq Type of request.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
typedef EFI_STATUS (EFIAPI *FWS_METADATA_SET_ACCEPT_STATE)(
IN FWS_METADATA *FwsMetadata,
IN CONST EFI_GUID *ImageTypeGuid,
IN UINT32 BankIdx,
IN FWS_ACCEPT_REQ AcceptReq
);
/**
Update bank state.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] BankIdx Bank Index
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
typedef EFI_STATUS (EFIAPI *FWS_METADATA_UPDATE_BANK_STATE)(
IN FWS_METADATA *FwsMetadata,
IN UINT32 BankIdx
);
/**
Rollback metadata from @BackupIdx's one to @@TargetIdx's one
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] BackupIdx Backup Bank Index
@param [in] TargetIdx Target Bank Index
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
typedef EFI_STATUS (EFIAPI *FWS_METADATA_ROLLBACK)(
IN FWS_METADATA *FwsMetadata,
IN UINT32 BackupIdx,
IN UINT32 TargetIdx
);
/** Firmware update storage metadata operation to handle metadata.
*/
typedef struct FwsMetadataOps {
/// Init firmware update storage metadata.
FWS_METADATA_INIT_METADATA InitMetadata;
/// Cleanup firmware update storage metadata.
FWS_METADATA_EXIT_METADATA ExitMetadata;
/// Get Number of banks.
FWS_METADATA_GET_NUM_BANKS GetNumBanks;
/// Get Number of images per bank.
FWS_METADATA_GET_NUM_IMAGES GetNumImages;
/// Check whether trial state or not.
FWS_METADATA_CHECK_TRIAL_RUN_STATE CheckTrialRunState;
/// Get all image type guids managed by firmware update storage.
FWS_METADATA_GET_IMAGE_TYPE_GUIDS GetImageTypeGuids;
/// Get location guid.
FWS_METADATA_GET_LOCATION_GUID GetLocationGuid;
/// Get image guid.
FWS_METADATA_GET_IMAGE_GUID GetImageGuid;
/// Get accept state.
FWS_METADATA_GET_ACCEPT_STATE GetAcceptState;
/// Set accept state.
FWS_METADATA_SET_ACCEPT_STATE SetAcceptState;
/// Update bank state.
FWS_METADATA_UPDATE_BANK_STATE UpdateBankState;
/// Rollback firmware update storage metadata.
FWS_METADATA_ROLLBACK RollBack;
} FWS_METADATA_OPS;
typedef struct FwsMetadata {
/// Gpt Handle
GPT_PARTITION_HANDLE *GptHandle;
/// active Metadata Lba.
EFI_LBA ActiveLba;
/// Backup Metadata Lba.
EFI_LBA BackupLba;
/// Firmware Store Metadata
VOID *Metadata;
/// Firmware Store Metadata Size
UINT32 MetadataSize;
/// Metadata operation
FWS_METADATA_OPS *FwsMetadataOps;
} FWS_METADATA;
/// Firmware update storage metadata version 2 operation.
extern FWS_METADATA_OPS gFwsMetadataV2Ops;
/**
Matching function used to find out Firmware Update Metadata GPT partition.
@param [in] PartitionEntry GPT partition.
@param [in] Data Partition Name.
@retval TRUE Found.
@retval FALSE Not found.
**/
BOOLEAN
MatchedMetaDataPartition (
IN CONST EFI_PARTITION_ENTRY *PartitionEntry,
IN CONST VOID *Data
);
/**
Check CRC32 of the FWU metadata against the CRC32 value
present in the FWU metadata.
@param [in] FwsMetadata Firmware Update Store Metadata.
@retval EFI_SUCCESS The CRC is valid.
@retval EFI_CRC_ERROR The CRC is invalid.
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataCrcCheck (
IN FWS_METADATA *FwsMetadata
);
/**
Save FWU metadata structure to GPT partition.
@param [in] FwsMetadata Firmware Update Store Metadata.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
@retval Others Failed to write metadata to GPT partition.
**/
EFI_STATUS
EFIAPI
FwsMetadataSave (
IN FWS_METADATA *FwsMetadata
);
/**
Get active bank index.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [out] ActiveIndex Active bank index
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataGetActiveIndex (
IN FWS_METADATA *FwsMetadata,
UINT32 *ActiveIndex
);
/**
Set active bank index.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] ActiveIndex Active bank index
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataSetActiveIndex (
IN FWS_METADATA *FwsMetadata,
UINT32 ActiveIndex
);
/**
Get previous active bank index.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [out] PreviousActiveIndex Previous Active bank index
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataGetPreviousActiveIndex (
IN FWS_METADATA *FwsMetadata,
UINT32 *PreviousActiveIndex
);
/**
Set previous active bank index.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] PreviousActiveIndex Previous Active bank index
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataSetPreviousActiveIndex (
IN FWS_METADATA *FwsMetadata,
UINT32 PreviousActiveIndex
);
/**
Initialize and Load Firmware Update Store Metadata.
@param [in] GptHandle GptHandle
@param [out] FwsMetadata Firmware Update Store Metadata.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
@retval EFI_OUT_OF_RESOURCES
@retval EFI_ABORTED Metadata is invalid.
@retval Others Failed to get metadata from gpt partition.
**/
EFI_STATUS
EFIAPI
FwsMetadataInit (
IN GPT_PARTITION_HANDLE *GptHandle,
OUT FWS_METADATA **FwsMetadata
);
/**
Cleanup Loaded Firmware Update Store Metadata.
@param [in] FwsMetadata Firmware Update Store Metadata.
**/
VOID
EFIAPI
FwsMetadataExit (
IN FWS_METADATA *FwsMetadata
);
/**
Get the number of banks.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [out] NumBanks Number of banks.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataGetNumBanks (
IN FWS_METADATA *FwsMetadata,
OUT UINT8 *NumBanks
);
/**
Get the number of images per bank.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [out] NumImages Number of images per bank.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataGetNumImages (
IN FWS_METADATA *FwsMetadata,
OUT UINT16 *NumImages
);
/**
Check trial state.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [out] TrialRunState If true, current is in the trial state.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataCheckTrialRunState (
IN FWS_METADATA *FwsMetadata,
OUT BOOLEAN *TrialRunState
);
/**
Get all image type guids.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [out] ImageTypeGuids Image type guid array.
@param [in,out] Size Byte size of @ImageTypeGuids.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
@retval EFI_BUFFER_TOO_SMALL Size of @ImageTypeGuids is too small to
contain all image type guids manged by
firmware update store.
**/
EFI_STATUS
EFIAPI
FwsMetadataGetImageTypeGuids (
IN FWS_METADATA *FwsMetadata,
OUT EFI_GUID *ImageTypeGuids,
IN OUT UINT32 *Size
);
/**
Get location guid of image type guid.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] ImageTypeGuid Image type guid.
@param [out] LocationGuid Location Guids.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataGetLocationGuid (
IN FWS_METADATA *FwsMetadata,
IN CONST EFI_GUID *ImageTypeGuid,
OUT EFI_GUID *LocationGuid
);
/**
Get image guid of image type guid.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] ImageTypeGuid Image type guid.
@param [in] BankIdx Bank Index.
@param [out] ImageGuid Image Guids.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataGetImageGuid (
IN FWS_METADATA *FwsMetadata,
IN CONST EFI_GUID *ImageTypeGuid,
IN UINT32 BankIdx,
OUT EFI_GUID *ImageGuid
);
/**
Get accept state of image type guid.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] ImageTypeGuid Image type guid.
@param [in] BankIdx Bank Index
@param [out] AcceptState If true, @ImageTypeGuid in the @BankIdx
is accepted.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataGetAcceptState (
IN FWS_METADATA *FwsMetadata,
IN CONST EFI_GUID *ImageTypeGuid,
IN UINT32 BankIdx,
OUT BOOLEAN *AcceptState
);
/**
Set accept state of image type guid.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] ImageTypeGuid Image type guid.
@param [in] BankIdx Bank Index
@param [in] AcceptReq Type of request.
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataSetAcceptState (
IN FWS_METADATA *FwsMetadata,
IN CONST EFI_GUID *ImageTypeGuid,
IN UINT32 BankIdx,
IN FWS_ACCEPT_REQ AcceptReq
);
/**
Update bank state.
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] BankIdx Bank Index
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataUpdateBankState (
IN FWS_METADATA *FwsMetadata,
IN UINT32 BankIdx
);
/**
Rollback metadata from @BackupIdx's one to @@TargetIdx's one
@param [in] FwsMetadata Firmware Update Store Metadata.
@param [in] BackupIdx Backup Bank Index
@param [in] TargetIdx Target Bank Index
@retval EFI_SUCCESS
@retval EFI_INVALID_PARAMETER
**/
EFI_STATUS
EFIAPI
FwsMetadataRollBack (
IN FWS_METADATA *FwsMetadata,
IN UINT32 BackupIdx,
IN UINT32 TargetIdx
);
#endif