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