| /*/@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__ |