summaryrefslogtreecommitdiffstats
path: root/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c
diff options
context:
space:
mode:
Diffstat (limited to 'DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c')
-rw-r--r--DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c
new file mode 100644
index 0000000000..80d0aa17bc
--- /dev/null
+++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c
@@ -0,0 +1,165 @@
+/** @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)->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
+ TokenFixerNotImplemented, ///< 19 - Named Component
+ TokenFixerNotImplemented, ///< 20 - Root Complex
+ TokenFixerNotImplemented, ///< 21 - SMMUv1 or SMMUv2
+ TokenFixerNotImplemented, ///< 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;
+}