blob: 26dc76a5a9be081a720ea59b59468e61b9431103 [file] [log] [blame]
/** @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_