| /** @file | |
| Configuration Manager object token fixer | |
| Copyright (c) 2021, Arm Limited. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| @par Glossary: | |
| - Cm or CM - Configuration Manager | |
| - Obj or OBJ - Object | |
| **/ | |
| #include <Library/DebugLib.h> | |
| #include <Protocol/ConfigurationManagerProtocol.h> | |
| #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; | |
| } |