/** @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 - GIC CPU Interface Info NULL, ///< 3 - GIC Distributor Info NULL, ///< 4 - GIC MSI Frame Info NULL, ///< 5 - GIC Redistributor Info NULL, ///< 6 - GIC ITS Info NULL, ///< 7 - Serial Console Port Info NULL, ///< 8 - Serial Debug Port Info NULL, ///< 9 - Generic Timer Info NULL, ///< 10 - Platform GT Block Info NULL, ///< 11 - Generic Timer Block Frame Info NULL, ///< 12 - Platform Generic Watchdog NULL, ///< 13 - PCI Configuration Space Info NULL, ///< 14 - Hypervisor Vendor Id NULL, ///< 15 - Fixed feature flags for FADT TokenFixerItsGroup, ///< 16 - ITS Group TokenFixerNamedComponentNode, ///< 17 - Named Component TokenFixerRootComplexNode, ///< 18 - Root Complex TokenFixerNotImplemented, ///< 19 - SMMUv1 or SMMUv2 TokenFixerSmmuV3Node, ///< 20 - SMMUv3 TokenFixerNotImplemented, ///< 21 - PMCG NULL, ///< 22 - GIC ITS Identifier Array NULL, ///< 23 - ID Mapping Array NULL, ///< 24 - SMMU Interrupt Array TokenFixerNotImplemented, ///< 25 - Processor Hierarchy Info TokenFixerNotImplemented, ///< 26 - Cache Info NULL, ///< 27 - CM Object Reference NULL, ///< 28 - Memory Affinity Info NULL, ///< 29 - Device Handle Acpi NULL, ///< 30 - Device Handle Pci NULL, ///< 31 - Generic Initiator Affinity NULL, ///< 32 - Generic Serial Port Info NULL, ///< 33 - CMN-600 Info NULL, ///< 34 - Lpi Info NULL, ///< 35 - Pci Address Map Info NULL, ///< 36 - Pci Interrupt Map Info NULL, ///< 37 - Reserved Memory Range Node NULL, ///< 38 - Memory Range Descriptor NULL, ///< 39 - Continuous Performance Control Info NULL, ///< 40 - Pcc Subspace Type 0 Info NULL, ///< 41 - Pcc Subspace Type 2 Info NULL, ///< 42 - Pcc Subspace Type 2 Info NULL, ///< 43 - Pcc Subspace Type 3 Info NULL, ///< 44 - Pcc Subspace Type 4 Info NULL, ///< 45 - Pcc Subspace Type 5 Info NULL, ///< 46 - Embedded Trace Extension/Module Info NULL ///< 47 - P-State Dependency (PSD) 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; if (CmObjDesc == NULL) { ASSERT (0); return EFI_INVALID_PARAMETER; } // Only support Arm objects for now. if (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) != EObjNameSpaceArm) { ASSERT (0); return EFI_UNSUPPORTED; } 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; }