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