/*/@file Hardware info parsing functions. Binary data is expected as a consecutive series of header - object pairs. Complete library providing static Qemu fw-cfg wrappers as well as list-like interface to dynamically manipulate hardware info objects and parsing from a generic blob. Copyright 2021 - 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef __HARDWARE_INFO_LIB_H__ #define __HARDWARE_INFO_LIB_H__ #include "../Library/HardwareInfoLib/HardwareInfoTypesLib.h" /** Read, if available, the next Type element in the FwCfg file. The FwCfg item must already be selected, this is a wrapper around QemuFwCfgReadBytes and the Data pointer should be set to an existent memory location with TypeSize bytes allocated for the date to be properly written. If a Type element is found in the file which has a size (in the header) greater than TypeSize, it is skipped. @param[in] Type Hardware Info Type to search for @param[in] TypeSize Size (in bytes) of the structure intended to be used to dereference the data @param[in] TotalFileSize Total size (in bytes) of the FwCfg file from which the data is read. @param[out] Data Pointer to a memory allocated instance into which the data is written to. @param[out] DataSize Size in bytes of the actually filled data available in the Data object after a successful operation @param[inout] ReadIndex Index of the next byte to be read. Incremented accordingly after a read operation to reflect up to date status @retval EFI_SUCCESS Next element found and read into Data @retval EFI_INVALID_PARAMETER Operation failed @retval EFI_END_OF_FILE End of the file reached, no more elements to read. **/ EFI_STATUS QemuFwCfgReadNextHardwareInfoByType ( IN HARDWARE_INFO_TYPE Type, IN UINTN TypeSize, IN UINTN TotalFileSize, OUT VOID *Data, OUT UINTN *DataSize OPTIONAL, IN OUT UINTN *ReadIndex ); /** Parse binary data containing resource information of multiple hardware elements into a list of interpreted resources. The translation is done on a copy-parse base so the blob can be freed afterwards. @param[in] Blob Binary data to be parsed @param[in] BlobSize Size (in bytes) of the binary data @param[in] TypeFilter Optional type to filter entries. Set to undefined to disable filtering and retrieve all @param[out] ListHead Head of the list to populate hardware information @retval EFI_SUCCESS Succeed. @retval EFI_INVALID_PARAMETER Provided Blob inforation is invalid @retval EFI_OUT_OF_RESOURCES Out of memory, list populated as far as possible **/ EFI_STATUS CreateHardwareInfoList ( IN UINT8 *Blob, IN UINTN BlobSize, IN HARDWARE_INFO_TYPE TypeFilter, OUT LIST_ENTRY *ListHead ); /** Free the dynamically allocated list of HADWARE_INFO items populated during parsing of Blob @param ListHead Head of the list to be destroyed **/ VOID FreeHardwareInfoList ( IN OUT LIST_ENTRY *ListHead ); /** Retrieve the number of hardware components of a specific type in the list. @param[in] ListHead Head of the hardware info list @param[in] Type Type of hardware elements to count @param[in] TypeSize Size (in bytes) of the structure intended to be used to dereference the data @return Count of elements of Type found **/ UINTN GetHardwareInfoCountByType ( IN LIST_ENTRY *ListHead, IN HARDWARE_INFO_TYPE Type, IN UINTN TypeSize ); /** Get the First Hardware Info entry in the list of the specified type @param[in] ListHead Head of the hardware info list @param[in] Type Hardware Info Type to search for @param[in] TypeSize Size (in bytes) of the structure intended to be used to dereference the data @return Link of first entry of specified type or list head if not found **/ LIST_ENTRY * GetFirstHardwareInfoByType ( IN LIST_ENTRY *ListHead, IN HARDWARE_INFO_TYPE Type, IN UINTN TypeSize ); /** Get the Next Hardware Info entry in the list with the specified type, which follows the provided Node. @param[in] ListHead Head of the hardware info list @param[in] Node Current, already processed, node's link @param[in] Type Hardware Info Type to search for @param[in] TypeSize Size (in bytes) of the structure intended to be used to dereference the data @return Link of next entry, after Node, of the specified type. List head otherwise **/ LIST_ENTRY * GetNextHardwareInfoByType ( IN LIST_ENTRY *ListHead, IN LIST_ENTRY *Node, IN HARDWARE_INFO_TYPE Type, IN UINTN TypeSize ); /** Assess if Node stands at the end of the doubly linked list @param[in] ListHead Head of the hardware info list @param[in] Node Current Node link @retval TRUE Node is at the end of the list @retval FALSE Node is not at the end of the list **/ BOOLEAN EndOfHardwareInfoList ( IN LIST_ENTRY *ListHead, IN LIST_ENTRY *Node ); #endif // __HARDWARE_INFO_LIB_H__