X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=OvmfPkg%2FInclude%2FLibrary%2FHardwareInfoLib.h;fp=OvmfPkg%2FInclude%2FLibrary%2FHardwareInfoLib.h;h=66d964dab58dad2dbc6d1da3ff34cd1981e8d018;hb=2b1a5b8c613301311113e1efc6fc65478e2e6365;hp=0000000000000000000000000000000000000000;hpb=6c9f218bc0d967bea99b139e190a11b703de4d6c;p=mirror_edk2.git diff --git a/OvmfPkg/Include/Library/HardwareInfoLib.h b/OvmfPkg/Include/Library/HardwareInfoLib.h new file mode 100644 index 0000000000..66d964dab5 --- /dev/null +++ b/OvmfPkg/Include/Library/HardwareInfoLib.h @@ -0,0 +1,159 @@ +/*/@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__