/** @file Metadata Proximity Domain handlers. Copyright (c) 2025, Arm Limited. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include "MetadataHandler.h" typedef struct ProximityDomainData { /// Current Id used for the Proximity Domain Id generation. UINT32 CurrentId; } PROXIMITY_DOMAIN_DATA; STATIC PROXIMITY_DOMAIN_DATA mProximityDomainData = { 0 }; /** Query the MetadataObjLib for metadata matching the input (Type/Token). If the metadata exists, return it. Otherwise: - Generate a new metadata object - Add it to the MetadataObjLib - return it @param[in] Root Root of the Metadata information. @param[in] Type METADATA_TYPE of the entry to generate. @param[in] Token Token uniquely identifying an entry among other objects with the input METADATA_TYPE. @param[in] Context Optional context to use during the Metadata generation. @param[in, out] Metadata On input, can contain METADATA_TYPE-specific information. On output and if success, contains the generated Metadata object. @param[in] MetadataSize Size of the input Metadata. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. **/ EFI_STATUS EFIAPI MetadataGenerateProximityDomain ( IN METADATA_ROOT_HANDLE Root, IN METADATA_TYPE Type, IN CM_OBJECT_TOKEN Token, IN VOID *Context, IN OUT VOID *Metadata, IN UINT32 MetadataSize ) { EFI_STATUS Status; METADATA_OBJ_PROXIMITY_DOMAIN *ProximityDomain; if ((Type != MetadataTypeProximityDomain) || (Token == CM_NULL_TOKEN) || (Metadata == NULL)) { ASSERT (Type == MetadataTypeProximityDomain); ASSERT (Token != CM_NULL_TOKEN); ASSERT (Metadata != NULL); return EFI_INVALID_PARAMETER; } Status = MetadataGet (Root, Type, Token, Metadata, MetadataSize); if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { ASSERT_EFI_ERROR (Status); return Status; } else if (Status == EFI_SUCCESS) { // Metadata for this (Type/Token) already exists. return EFI_SUCCESS; } // Generate new Metadata (i.e. Status == EFI_NOT_FOUND). ProximityDomain = (METADATA_OBJ_PROXIMITY_DOMAIN *)Metadata; ProximityDomain->Id = mProximityDomainData.CurrentId++; Status = MetadataAdd (Root, Type, Token, Metadata, MetadataSize); if (EFI_ERROR (Status)) { ASSERT_EFI_ERROR (Status); return Status; } return EFI_SUCCESS; } /** Validate the Metadata. @param[in] Root Root of the Metadata information. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. **/ EFI_STATUS EFIAPI MetadataValidateProximityDomain ( IN METADATA_ROOT_HANDLE Root ) { METADATA_HANDLE Handle0; METADATA_HANDLE Handle1; METADATA_OBJ_PROXIMITY_DOMAIN Metadata0; METADATA_OBJ_PROXIMITY_DOMAIN Metadata1; Handle0 = NULL; while (TRUE) { Handle0 = MetadataIterate ( Root, MetadataTypeProximityDomain, Handle0, &Metadata0, sizeof (METADATA_OBJ_PROXIMITY_DOMAIN) ); if (Handle0 == NULL) { break; } // Loop starting from Handle0 Handle1 = Handle0; while (TRUE) { Handle1 = MetadataIterate ( Root, MetadataTypeProximityDomain, Handle1, &Metadata1, sizeof (METADATA_OBJ_PROXIMITY_DOMAIN) ); if (Handle1 == NULL) { break; } if (Metadata0.Id == Metadata1.Id) { DEBUG (( DEBUG_ERROR, "Metadata: ProximityDomain: Same Id: %d\n", Metadata0.Id )); ASSERT (0); } } } return EFI_SUCCESS; }