diff options
Diffstat (limited to 'DynamicTablesPkg/Include/Library/MetadataObjLib.h')
-rw-r--r-- | DynamicTablesPkg/Include/Library/MetadataObjLib.h | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/DynamicTablesPkg/Include/Library/MetadataObjLib.h b/DynamicTablesPkg/Include/Library/MetadataObjLib.h new file mode 100644 index 0000000..26dc76a --- /dev/null +++ b/DynamicTablesPkg/Include/Library/MetadataObjLib.h @@ -0,0 +1,186 @@ +/** @file
+ Metadata Object Library.
+
+ Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#ifndef METADATA_OBJ_LIB_H_
+#define METADATA_OBJ_LIB_H_
+
+/** Metadata Types
+
+ Some general rules:
+ -
+ Each Type has an associated strucure.
+ -
+ It is possible to Add/Remove/Get the Metadata associated to
+ a (Type/Token). To modify the Metadata, the object must be removed
+ then added again.
+ -
+ A (Type/Token) pair allows to uniquely identify a Metadata structure.
+ A Token might have multiple Metadata structures allocated with other Types.
+ A Type might have multiple entries with different Tokens.
+*/
+typedef enum MetadataType {
+ MetadataTypeUid,
+ MetadataTypeProximityDomain,
+ MetadataTypeMax,
+} METADATA_TYPE;
+
+/* Maximal size of a NameId */
+#define METADATA_UID_NAMEID_SIZE 9
+
+/** MetadataTypeUid related structure.
+ */
+typedef struct MetadataObjUid {
+ /// Uid
+ UINT32 Uid;
+
+ /// _HID or _CID of the device (NULL-terminated string).
+ /// This provides a mean to uniquely identify a device type.
+ /// If not populated, EisaId must be set.
+ CHAR8 NameId[METADATA_UID_NAMEID_SIZE];
+
+ /// EisaId of the device.
+ /// This provides a mean to uniquely identify a device type.
+ /// If not populated, NameId must be set.
+ UINT32 EisaId;
+} METADATA_OBJ_UID;
+
+/** MetadataTypeProximityDomain related structure.
+ */
+typedef struct MetadataObjProximityDomain {
+ /// Proximity Domain Id
+ UINT32 Id;
+} METADATA_OBJ_PROXIMITY_DOMAIN;
+
+/* Handle to the structure containing all the the Metadata information
+ (i.e. all the METADATA_HANDLE).
+*/
+typedef VOID *METADATA_ROOT_HANDLE;
+/* Handle to an internal Metadata structure, depicting a single Metadata. */
+typedef VOID *METADATA_HANDLE;
+
+/** Initialize the Metadata Root.
+
+ @param[out] Root If success, Root of the Metadata information.
+
+ @retval EFI_SUCCESS Success.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES Out of resources.
+**/
+EFI_STATUS
+EFIAPI
+MetadataInitializeHandle (
+ OUT METADATA_ROOT_HANDLE *Root
+ );
+
+/** Free the Metadata Root.
+
+ @param[in] Root Root of the Metadata information to free.
+
+ @retval EFI_SUCCESS Success.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES Out of resources.
+**/
+EFI_STATUS
+EFIAPI
+MetadataFreeHandle (
+ IN METADATA_ROOT_HANDLE Root
+ );
+
+/** Attach some Metadata to a (Type/Token) pair.
+
+ @param[in] Root Root of the Metadata information.
+ @param[in] Type METADATA_TYPE of the entry to allocate.
+ @param[in] Token Token uniquely identifying an entry among other
+ objects with the input METADATA_TYPE.
+ @param[in] Metadata Metadata to associate to the (Type/Token) pair.
+ The data is copied.
+ @param[in] MetadataSize Size of the input Metadata.
+
+ @retval EFI_SUCCESS Success.
+ @retval EFI_ALREADY_STARTED (Type/Token) pair is already present.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_NOT_FOUND Not found.
+**/
+EFI_STATUS
+EFIAPI
+MetadataAdd (
+ IN METADATA_ROOT_HANDLE Root,
+ IN METADATA_TYPE Type,
+ IN CM_OBJECT_TOKEN Token,
+ IN VOID *Metadata,
+ IN UINT32 MetadataSize
+ );
+
+/** Remove a (Type/Token) pair and its associated Metadata.
+
+ @param[in] Root Root of the Metadata information.
+ @param[in] Type METADATA_TYPE of the entry to remove.
+ @param[in] Token Token uniquely identifying an entry among other
+ objects with the input METADATA_TYPE.
+
+ @retval EFI_SUCCESS Success.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_NOT_FOUND Not found.
+**/
+EFI_STATUS
+EFIAPI
+MetadataRemove (
+ IN METADATA_ROOT_HANDLE Root,
+ IN METADATA_TYPE Type,
+ IN CM_OBJECT_TOKEN Token
+ );
+
+/** Get the Metadata associated with an (Type/Token).
+
+ @param[in] Root Root of the Metadata information.
+ @param[in] Type METADATA_TYPE of the entry to get.
+ @param[in] Token Token uniquely identifying an entry among other
+ objects with the input METADATA_TYPE.
+ @param[out] Metadata If success, contains the Metadata associated to the
+ input (Type/Token).
+ @param[in] MetadataSize Size of the input Metadata.
+
+ @retval EFI_SUCCESS Success.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_NOT_FOUND Not found.
+**/
+EFI_STATUS
+EFIAPI
+MetadataGet (
+ IN METADATA_ROOT_HANDLE Root,
+ IN METADATA_TYPE Type,
+ IN CM_OBJECT_TOKEN Token,
+ OUT VOID *Metadata,
+ IN UINT32 MetadataSize
+ );
+
+/** Iterate over the existing Metadata with the same Type.
+
+ @param[in] Root Root of the Metadata information.
+ @param[in] Type METADATA_TYPE to iterate over.
+ @param[in] PrevHandle MetadataIterate () returns the Metadata handle
+ following PrevHandle.
+ If PrevHandle==NULL, the first Handle of the type
+ is returned.
+ If PrevHandle is the last Handle of the type,
+ NULL is returned.
+ @param[out] Metadata Metadata of the current Handle.
+ @param[in] MetadataSize Size of the input Metadata.
+
+ @return METADATA_HANDLE The Metadata handle following PrevHandle.
+**/
+METADATA_HANDLE
+EFIAPI
+MetadataIterate (
+ IN METADATA_ROOT_HANDLE Root,
+ IN METADATA_TYPE Type,
+ IN METADATA_HANDLE PrevHandle,
+ OUT VOID *Metadata,
+ IN UINT32 MetadataSize
+ );
+
+#endif // METADATA_OBJ_LIB_H_
|