REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3996 This change added more token fixers for other node types, including NamedComponentNode, RootComplexNode, and SmmuV3Node. The corresponding entries for tokenFixer functions table is also updated. Cc: Sami Mujawar <Sami.Mujawar@arm.com> Cc: Alexei Fedorov <Alexei.Fedorov@arm.com> Co-authored-by: Joe Lopez <joelopez@microsoft.com> Signed-off-by: Kun Qin <kuqin12@gmail.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Reviewed-by: Pierre Gondois <pierre.gondois@arm.com> Tested-by: Sami Mujawar <sami.mujawar@arm.com>
		
			
				
	
	
		
			238 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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;
 | |
| }
 |