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;
 | 
						|
}
 |