/** @file Configuration Manager object token fixer Copyright (c) 2021, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @par Glossary: - Cm or CM - Configuration Manager - Obj or OBJ - Object **/ #include #include #include "CmObjectTokenFixer.h" /** Token fixer not implemented. Most of the objects are not generated by this parser. Add the missing functions when needed. CmObjectToken fixer function that updates the Tokens in the CmObjects. @param [in] CmObject Pointer to the Configuration Manager Object. @param [in] Token Token to be updated in the CmObject. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_UNSUPPORTED Not supported. **/ STATIC EFI_STATUS EFIAPI TokenFixerNotImplemented ( IN CM_OBJ_DESCRIPTOR *CmObject, IN CM_OBJECT_TOKEN Token ) { ASSERT (0); return EFI_UNSUPPORTED; } /** EArmObjItsGroup token fixer. CmObjectToken fixer function that updates the Tokens in the CmObjects. @param [in] CmObject Pointer to the Configuration Manager Object. @param [in] Token Token to be updated in the CmObject. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_UNSUPPORTED Not supported. **/ STATIC EFI_STATUS EFIAPI TokenFixerItsGroup ( IN CM_OBJ_DESCRIPTOR *CmObject, IN CM_OBJECT_TOKEN Token ) { ASSERT (CmObject != NULL); ((CM_ARM_ITS_GROUP_NODE *)CmObject->Data)->Token = Token; return EFI_SUCCESS; } /** EArmObjNamedComponent token fixer. CmObjectToken fixer function that updates the Tokens in the CmObjects. @param [in] CmObject Pointer to the Configuration Manager Object. @param [in] Token Token to be updated in the CmObject. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_UNSUPPORTED Not supported. **/ STATIC EFI_STATUS EFIAPI TokenFixerNamedComponentNode ( IN CM_OBJ_DESCRIPTOR *CmObject, IN CM_OBJECT_TOKEN Token ) { ASSERT (CmObject != NULL); ((CM_ARM_NAMED_COMPONENT_NODE *)CmObject->Data)->Token = Token; return EFI_SUCCESS; } /** EArmObjRootComplex token fixer. CmObjectToken fixer function that updates the Tokens in the CmObjects. @param [in] CmObject Pointer to the Configuration Manager Object. @param [in] Token Token to be updated in the CmObject. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_UNSUPPORTED Not supported. **/ STATIC EFI_STATUS EFIAPI TokenFixerRootComplexNode ( IN CM_OBJ_DESCRIPTOR *CmObject, IN CM_OBJECT_TOKEN Token ) { ASSERT (CmObject != NULL); ((CM_ARM_ROOT_COMPLEX_NODE *)CmObject->Data)->Token = Token; return EFI_SUCCESS; } /** EArmObjSmmuV3 token fixer. CmObjectToken fixer function that updates the Tokens in the CmObjects. @param [in] CmObject Pointer to the Configuration Manager Object. @param [in] Token Token to be updated in the CmObject. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_UNSUPPORTED Not supported. **/ STATIC EFI_STATUS EFIAPI TokenFixerSmmuV3Node ( IN CM_OBJ_DESCRIPTOR *CmObject, IN CM_OBJECT_TOKEN Token ) { ASSERT (CmObject != NULL); ((CM_ARM_SMMUV3_NODE *)CmObject->Data)->Token = Token; return EFI_SUCCESS; } /** TokenFixer functions table. A CmObj having a CM_OBJECT_TOKEN field might need to have its Token fixed. Each CmObj can have its Token in a specific way. */ CONST CM_OBJECT_TOKEN_FIXER TokenFixer[EArmObjMax] = { NULL, ///< 0 - Reserved NULL, ///< 1 - Boot Architecture Info NULL, ///< 2 - CPU Info NULL, ///< 3 - Power Management Profile Info NULL, ///< 4 - GIC CPU Interface Info NULL, ///< 5 - GIC Distributor Info NULL, ///< 6 - GIC MSI Frame Info NULL, ///< 7 - GIC Redistributor Info NULL, ///< 8 - GIC ITS Info NULL, ///< 9 - Serial Console Port Info NULL, ///< 10 - Serial Debug Port Info NULL, ///< 11 - Generic Timer Info NULL, ///< 12 - Platform GT Block Info NULL, ///< 13 - Generic Timer Block Frame Info NULL, ///< 14 - Platform Generic Watchdog NULL, ///< 15 - PCI Configuration Space Info NULL, ///< 16 - Hypervisor Vendor Id NULL, ///< 17 - Fixed feature flags for FADT TokenFixerItsGroup, ///< 18 - ITS Group TokenFixerNamedComponentNode, ///< 19 - Named Component TokenFixerRootComplexNode, ///< 20 - Root Complex TokenFixerNotImplemented, ///< 21 - SMMUv1 or SMMUv2 TokenFixerSmmuV3Node, ///< 22 - SMMUv3 TokenFixerNotImplemented, ///< 23 - PMCG NULL, ///< 24 - GIC ITS Identifier Array NULL, ///< 25 - ID Mapping Array NULL, ///< 26 - SMMU Interrupt Array TokenFixerNotImplemented, ///< 27 - Processor Hierarchy Info TokenFixerNotImplemented, ///< 28 - Cache Info TokenFixerNotImplemented, ///< 29 - Processor Node ID Info NULL, ///< 30 - CM Object Reference NULL, ///< 31 - Memory Affinity Info NULL, ///< 32 - Device Handle Acpi NULL, ///< 33 - Device Handle Pci NULL, ///< 34 - Generic Initiator Affinity NULL, ///< 35 - Generic Serial Port Info NULL, ///< 36 - CMN-600 Info NULL, ///< 37 - Lpi Info NULL, ///< 38 - Pci Address Map Info NULL, ///< 39 - Pci Interrupt Map Info }; /** CmObj token fixer. Some CmObj structures have a self-token, i.e. they are storing their own token value in the CmObj. Dynamically created CmObj need to have their self-token assigned at some point. @param [in] CmObjDesc Pointer to the Configuration Manager Object. @param [in] Token Token to update the CmObjDesc with. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_UNSUPPORTED Not supported. **/ EFI_STATUS EFIAPI FixupCmObjectSelfToken ( IN CM_OBJ_DESCRIPTOR *CmObjDesc, IN CM_OBJECT_TOKEN Token ) { EFI_STATUS Status; CM_OBJECT_TOKEN_FIXER TokenFixerFunc; CM_OBJECT_ID ArmNamespaceObjId; // Only support Arm objects for now. if ((CmObjDesc == NULL) || (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) != EObjNameSpaceArm)) { ASSERT (0); return EFI_INVALID_PARAMETER; } ArmNamespaceObjId = GET_CM_OBJECT_ID (CmObjDesc->ObjectId); if (ArmNamespaceObjId >= EArmObjMax) { ASSERT (0); return EFI_INVALID_PARAMETER; } // Fixup self-token if necessary. TokenFixerFunc = TokenFixer[ArmNamespaceObjId]; if (TokenFixerFunc != NULL) { Status = TokenFixerFunc (CmObjDesc, Token); if (EFI_ERROR (Status)) { ASSERT (0); return Status; } } return EFI_SUCCESS; }