[PATCH v2 3/5] DynamicTablesPkg: DynamicPlatRepo: Add TokenFixer


PierreGondois
 

From: Pierre Gondois <Pierre.Gondois@arm.com>

The DynamicPlatRepo library allows to handle dynamically created
CmObj. The dynamic platform repository can be in the following states:
1 - Non-initialised
2 - Transient:
Possibility to add CmObj to the platform, but not to query them.
3 - Finalised:
Possibility to query CmObj, but not to add new.

A token is allocated to each CmObj added to the dynamic platform
repository (except for reference tokens CmObj). This allows to retrieve
dynamic CmObjs among all CmObj (static CmObj for instance).

This patch add the TokenFixer files, allowing to update the
self-token some CmObj have.

Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
---
.../DynamicPlatRepoLib/CmObjectTokenFixer.c | 164 ++++++++++++++++++
.../DynamicPlatRepoLib/CmObjectTokenFixer.h | 52 ++++++
2 files changed, 216 insertions(+)
create mode 100644 DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/Cm=
ObjectTokenFixer.c
create mode 100644 DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/Cm=
ObjectTokenFixer.h

diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectT=
okenFixer.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObject=
TokenFixer.c
new file mode 100644
index 000000000000..74eeefccf4ce
--- /dev/null
+++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFix=
er.c
@@ -0,0 +1,164 @@
+/** @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 !=3D NULL);
+ ((CM_ARM_ITS_GROUP_NODE*)CmObject)->Token =3D 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] =3D {
+ NULL, ///< 0 - Reserved
+ NULL, ///< 1 - Boot Architecture Info
+ NULL, ///< 2 - CPU Info
+ NULL, ///< 3 - Power Management Profile I=
nfo
+ 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 In=
fo
+ NULL, ///< 16 - Hypervisor Vendor Id
+ NULL, ///< 17 - Fixed feature flags for FA=
DT
+ 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 o=
wn
+ 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 =3D=3D NULL) ||
+ (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) !=3D EObjNameSpaceArm))=
{
+ ASSERT (0);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ ArmNamespaceObjId =3D GET_CM_OBJECT_ID (CmObjDesc->ObjectId);
+ if (ArmNamespaceObjId >=3D EArmObjMax) {
+ ASSERT (0);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ // Fixup self-token if necessary.
+ TokenFixerFunc =3D TokenFixer[ArmNamespaceObjId];
+ if (TokenFixerFunc !=3D NULL) {
+ Status =3D TokenFixerFunc (CmObjDesc, Token);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ return Status;
+ }
+ }
+
+ return EFI_SUCCESS;
+}
diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectT=
okenFixer.h b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObject=
TokenFixer.h
new file mode 100644
index 000000000000..d8cc7094697f
--- /dev/null
+++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFix=
er.h
@@ -0,0 +1,52 @@
+/** @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
+**/
+
+#ifndef CM_OBJECT_TOKEN_FIXER_H_
+#define CM_OBJECT_TOKEN_FIXER_H_
+
+/** CmObjectToken fixer function that updates the Tokens in the CmObject=
s.
+
+ @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.
+**/
+typedef
+EFI_STATUS
+(EFIAPI * CM_OBJECT_TOKEN_FIXER) (
+ IN CM_OBJ_DESCRIPTOR * CmObject,
+ IN CM_OBJECT_TOKEN Token
+ );
+
+/** CmObj token fixer.
+
+ Some CmObj structures have a self-token, i.e. they are storing their o=
wn
+ 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
+ );
+
+#endif // CM_OBJECT_TOKEN_FIXER_H_
--=20
2.25.1