/** @file
Library that implements the helper functions to parse and pack a Transfer
List as specified by the A-profile Firmware Handoff Specification.
Copyright (c) 2022 - 2025, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Reference(s):
- https://github.com/FirmwareHandoff/firmware_handoff
**/
#ifndef ARM_TRANSFER_LIST_LIB_
#define ARM_TRANSFER_LIST_LIB_
#include
#include
#include
#include
#include
/**
Get the TransferList from HOB list.
@param[out] TransferList TransferList
@retval EFI_SUCCESS TransferList is found.
@retval EFI_NOT_FOUND TransferList is not found.
**/
EFI_STATUS
EFIAPI
TransferListGetFromHobList (
OUT TRANSFER_LIST_HEADER **TransferList
);
/**
Return the first Transfer Entry Node in the Transfer List.
@param [in] TransferListHeader Pointer to the Transfer List Header.
@return Pointer to the Transfer Entry Node if successful otherwise NULL
**/
TRANSFER_ENTRY_HEADER *
EFIAPI
TransferListGetFirstEntry (
IN TRANSFER_LIST_HEADER *TransferListHeader
);
/**
Return the next Transfer Entry Node in the Transfer List from
last Transfer Entry Node.
@param [in] TransferListHeader Pointer to the Transfer List Header.
@param [in] CurrentEntry Pointer to the Current Transfer Entry.
If this is NULL, the first Transfer Entry
is returned.
@return Pointer to the Transfer Entry Node if successful otherwise NULL
**/
TRANSFER_ENTRY_HEADER *
EFIAPI
TransferListGetNextEntry (
IN TRANSFER_LIST_HEADER *TransferListHeader,
IN TRANSFER_ENTRY_HEADER *CurrentEntry
);
/**
Return the first Transfer Entry Node in the Transfer List
matched with given tag-id.
@param [in] TransferListHeader Pointer to the Transfer List Header.
@param [in] TagId Tag id
@return Pointer to the Transfer Entry Node if successful otherwise NULL
**/
TRANSFER_ENTRY_HEADER *
EFIAPI
TransferListFindFirstEntry (
IN TRANSFER_LIST_HEADER *TransferListHeader,
IN UINT16 TagId
);
/**
Return the Next Transfer Entry Node in the Transfer List
matched with given tag-id from last Transfer Entry Node.
@param [in] TransferListHeader Pointer to the Transfer List Header.
@param [in] CurrentEntry Pointer to the Current Transfer Entry.
If this is NULL, the first Transfer Entry
is returned.
@param [in] TagId Tag id
@return Pointer to the Transfer Entry Node if successful otherwise NULL
**/
TRANSFER_ENTRY_HEADER *
EFIAPI
TransferListFindNextEntry (
IN TRANSFER_LIST_HEADER *TransferListHeader,
IN TRANSFER_ENTRY_HEADER *CurrentEntry,
IN UINT16 TagId
);
/**
Return the data in Transfer Entry.
@param [in] TransferEntry Pointer to a Transfer Entry Header
@return Pointer to the Data of Transfer Entry Node if successful otherwise NULL
**/
VOID *
EFIAPI
TransferListGetEntryData (
IN TRANSFER_ENTRY_HEADER *TransferEntry
);
/**
Dump the transfer list to the debug output.
@param [in] TransferListHeader Pointer to the Transfer List Header
**/
VOID
EFIAPI
TransferListDump (
IN TRANSFER_LIST_HEADER *TransferListHeader
);
/**
Verify the checksum of the transfer list.
@param [in] TransferListHeader Pointer to the Transfer List Header
@retval FALSE Invalid Checksum
@retval TRUE Valid Checksum
**/
BOOLEAN
EFIAPI
TransferListVerifyChecksum (
IN TRANSFER_LIST_HEADER *TransferListHeader
);
/**
Check the header of the Transfer List.
@param [in] TransferListHeader Pointer to the Transfer List Header
@return TRANSFER_LIST_OPS code indicating the validity of the Transfer List
**/
TRANSFER_LIST_OPS
EFIAPI
TransferListCheckHeader (
IN TRANSFER_LIST_HEADER *TransferListHeader
);
/**
Find a Transfer Entry Node in the Transfer List matched with the given tag-id.
@param [in] TransferListHeader Pointer to the Transfer List Header
@param [in] TagId Tag id
@return Pointer to the Transfer Entry Node if successful otherwise NULL
**/
TRANSFER_ENTRY_HEADER *
EFIAPI
TransferListFindEntry (
IN TRANSFER_LIST_HEADER *TransferListHeader,
IN UINT16 TagId
);
/**
Get TPM event log from TransferList
@param [in] TransferListHeader Pointer to the Transfer List Header
@param [out] EventLog Pointer to Eventlog in TransferList
@param [out] EventLogSize Size of Event log
@param [out] EventLogFlags Flags for Event log
@return EFI_SUCCESS
@return EFI_NOT_FOUND No Event log in TransferListHeader
@return EFI_INVALID_PARAMETER Invalid parameters
**/
EFI_STATUS
EFIAPI
TransferListGetEventLog (
IN TRANSFER_LIST_HEADER *TransferListHeader,
OUT VOID **EventLog,
OUT UINTN *EventLogSize,
OUT UINT32 *EventLogFlags OPTIONAL
);
#endif // ARM_TRANSFER_LIST_LIB_