/** @file Configuration Manager Dxe Copyright 2020 NXP Copyright 2020 Puresoftware Ltd SPDX-License-Identifier: BSD-2-Clause-Patent @par Glossary: - Cm or CM - Configuration Manager - Obj or OBJ - Object **/ #include #include #include #include #include #include #include #include #include /** The platform specific headers */ #include "ConfigurationManager.h" #include /** The platform configuration repository information. */ STATIC FSL_PLATFORM_REPOSITORY_INFO FslPlatformRepositoryInfo = { /// Configuration Manager information { CONFIGURATION_MANAGER_REVISION, CFG_MGR_OEM_ID }, // ACPI Table List { // FADT Table { EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_REVISION, CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt), NULL, CFG_MGR_TABLE_ID }, // GTDT Table { EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION, CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdGtdt), NULL, CFG_MGR_TABLE_ID }, // MADT Table { EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMadt), NULL, CFG_MGR_TABLE_ID }, // PCI MCFG Table { EFI_ACPI_6_2_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE, EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_TABLE_REVISION, CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMcfg), NULL, CFG_MGR_TABLE_ID }, // SPCR Table { EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_REVISION, CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSpcr), NULL, CFG_MGR_TABLE_ID }, // DSDT (OEM) Table { EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, 0, CREATE_OEM_ACPI_TABLE_GEN_ID (PlatAcpiTableIdDsdt), NULL, CFG_MGR_TABLE_ID } }, // Boot architecture information { EFI_ACPI_6_2_ARM_PSCI_COMPLIANT }, // BootArchFlags // Power management profile information { EFI_ACPI_6_2_PM_PROFILE_ENTERPRISE_SERVER }, // PowerManagement Profile // Generic Timer Info { // The physical base address for the counter control frame TIMER_BASE_ADDRESS, // The physical base address for the counter read frame TIMER_READ_BASE_ADDRESS, // The secure PL1 timer interrupt TIMER_SEC_IT, // The secure PL1 timer flags GTDT_GTIMER_FLAGS, // The non-secure PL1 timer interrupt TIMER_NON_SEC_IT, // The non-secure PL1 timer flags GTDT_GTIMER_FLAGS, // The virtual timer interrupt TIMER_VIRT_IT, // The virtual timer flags GTDT_GTIMER_FLAGS, // The non-secure PL2 timer interrupt TIMER_HYP_IT, // The non-secure PL2 timer flags GTDT_GTIMER_FLAGS }, // Generic Timer Block Information PLAT_TIMER_BLOCK_INFO, // GTDT Frames PLAT_TIMER_FRAME_INFO, // Watchdog info PLAT_WATCHDOG_INFO, // GIC CPU Interface information PLAT_GIC_CPU_INTERFACE, // GIC Distributor Info PLAT_GIC_DISTRIBUTOR_INFO, // GIC Redistributor PLAT_GIC_REDISTRIBUTOR_INFO, // GIC ITS PLAT_GIC_ITS_INFO, // MCFG Info PLAT_MCFG_INFO, // SPCR Info PLAT_SPCR_INFO, 2.0 // fsl board revision }; /** Initialize the platform configuration repository. @param [in] This Pointer to the Configuration Manager Protocol. @retval EFI_SUCCESS Success **/ STATIC EFI_STATUS EFIAPI InitializePlatformRepository ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This ) { FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo; UINT32 Svr; PlatformRepo = This->PlatRepoInfo; Svr = SocGetSvr (); if (SVR_SOC_VER(Svr) == SVR_LX2160A) { PlatformRepo->FslBoardRevision = SVR_MAJOR(Svr); DEBUG ((DEBUG_INFO, "Fsl : SoC LX2160A Rev = 0x%x\n", PlatformRepo->FslBoardRevision)); } else { DEBUG ((DEBUG_INFO, "Fsl : SoC Unknown Rev = 0x%x\n", PlatformRepo->FslBoardRevision)); } return EFI_SUCCESS; } /** Return PCI Configuration Info. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Object ID of the CM object requested @param [in] Token A unique token for identifying the requested CM_ARM_PCI_INFO object. @param [in, out] CmObject Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_NOT_FOUND The required object information is not found. **/ EFI_STATUS EFIAPI GetPciConfigInfo ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject ) { FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo; UINT32 TotalObjCount; UINT32 ObjIndex; if ((This == NULL) || (CmObject == NULL)) { ASSERT (This != NULL); ASSERT (CmObject != NULL); return EFI_INVALID_PARAMETER; } PlatformRepo = This->PlatRepoInfo; TotalObjCount = ARRAY_SIZE (PlatformRepo->PciConfigInfo); for (ObjIndex = 0; ObjIndex < TotalObjCount; ObjIndex++) { if (Token == (CM_OBJECT_TOKEN)&PlatformRepo->PciConfigInfo[ObjIndex]) { CmObject->ObjectId = CmObjectId; CmObject->Size = sizeof (PlatformRepo->PciConfigInfo[ObjIndex]); CmObject->Data = (VOID*)&PlatformRepo->PciConfigInfo[ObjIndex]; CmObject->Count = 1; return EFI_SUCCESS; } } return EFI_NOT_FOUND; } /** Return GIC CPU Interface Info. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Object ID of the CM object requested @param [in] Token A unique token for identifying the requested CM_ARM_GICC_INFO object. @param [in, out] CmObject Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_NOT_FOUND The required object information is not found. **/ EFI_STATUS EFIAPI GetGicCInfo ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject ) { FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo; if ((This == NULL) || (CmObject == NULL)) { ASSERT (This != NULL); ASSERT (CmObject != NULL); return EFI_INVALID_PARAMETER; } PlatformRepo = This->PlatRepoInfo; if (Token != (CM_OBJECT_TOKEN)&PlatformRepo->GicCInfo) { return EFI_NOT_FOUND; } CmObject->ObjectId = CmObjectId; CmObject->Size = sizeof (PlatformRepo->GicCInfo); CmObject->Data = (VOID*)&PlatformRepo->GicCInfo; CmObject->Count = ARRAY_SIZE (PlatformRepo->GicCInfo); return EFI_SUCCESS; } /** Return a GT Block timer frame info list. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Configuration Manager Object ID. @param [in] Token A token for identifying the object @param [in, out] CmObject Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_NOT_FOUND The required object information is not found. **/ EFI_STATUS EFIAPI GetGTBlockTimerFrameInfo ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject ) { FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo; if ((This == NULL) || (CmObject == NULL)) { ASSERT (This != NULL); ASSERT (CmObject != NULL); return EFI_INVALID_PARAMETER; } PlatformRepo = This->PlatRepoInfo; if (Token != (CM_OBJECT_TOKEN)&PlatformRepo->GTBlock0TimerInfo) { return EFI_NOT_FOUND; } CmObject->ObjectId = CmObjectId; CmObject->Size = sizeof (PlatformRepo->GTBlock0TimerInfo); CmObject->Data = (VOID*)&PlatformRepo->GTBlock0TimerInfo; CmObject->Count = ARRAY_SIZE (PlatformRepo->GTBlock0TimerInfo); return EFI_SUCCESS; } /** A helper function for returning the Configuration Manager Objects. @param [in] CmObjectId The Configuration Manager Object ID. @param [in] Object Pointer to the Object(s). @param [in] ObjectSize Total size of the Object(s). @param [in] ObjectCount Number of Objects. @param [in, out] CmObjectDesc Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. **/ STATIC EFI_STATUS EFIAPI HandleCmObject ( IN CONST CM_OBJECT_ID CmObjectId, IN VOID * Object, IN CONST UINTN ObjectSize, IN CONST UINTN ObjectCount, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObjectDesc ) { CmObjectDesc->ObjectId = CmObjectId; CmObjectDesc->Size = ObjectSize; CmObjectDesc->Data = (VOID*)Object; CmObjectDesc->Count = ObjectCount; DEBUG (( DEBUG_INFO, "INFO: CmObjectId = %x, Ptr = 0x%p, Size = %d, Count = %d\n", CmObjectId, CmObjectDesc->Data, CmObjectDesc->Size, CmObjectDesc->Count )); return EFI_SUCCESS; } /** A helper function for returning the Configuration Manager Objects that match the token. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Configuration Manager Object ID. @param [in] Object Pointer to the Object(s). @param [in] ObjectSize Total size of the Object(s). @param [in] ObjectCount Number of Objects. @param [in] Token A token identifying the object. @param [in] HandlerProc A handler function to search the object referenced by the token. @param [in, out] CmObjectDesc Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_NOT_FOUND The required object information is not found. **/ STATIC EFI_STATUS EFIAPI HandleCmObjectRefByToken ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN VOID * Object, IN CONST UINTN ObjectSize, IN CONST UINTN ObjectCount, IN CONST CM_OBJECT_TOKEN Token, IN CONST CM_OBJECT_HANDLER_PROC HandlerProc, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObjectDesc ) { EFI_STATUS Status; CmObjectDesc->ObjectId = CmObjectId; if (Token == CM_NULL_TOKEN) { CmObjectDesc->Size = ObjectSize; CmObjectDesc->Data = (VOID*)Object; CmObjectDesc->Count = ObjectCount; Status = EFI_SUCCESS; } else { Status = HandlerProc (This, CmObjectId, Token, CmObjectDesc); } DEBUG (( DEBUG_INFO, "INFO: Token = 0x%p, CmObjectId = %x, Ptr = 0x%p, Size = %d, Count = %d\n", (VOID*)Token, CmObjectId, CmObjectDesc->Data, CmObjectDesc->Size, CmObjectDesc->Count )); return Status; } /** Return a standard namespace object. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Configuration Manager Object ID. @param [in] Token An optional token identifying the object. If unused this must be CM_NULL_TOKEN. @param [in, out] CmObject Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_NOT_FOUND The required object information is not found. **/ EFI_STATUS EFIAPI GetStandardNameSpaceObject ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token OPTIONAL, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject ) { EFI_STATUS Status; FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo; Status = EFI_SUCCESS; if ((This == NULL) || (CmObject == NULL)) { ASSERT (This != NULL); ASSERT (CmObject != NULL); return EFI_INVALID_PARAMETER; } PlatformRepo = This->PlatRepoInfo; switch (GET_CM_OBJECT_ID (CmObjectId)) { case EStdObjCfgMgrInfo: Status = HandleCmObject ( CmObjectId, &PlatformRepo->CmInfo, sizeof (PlatformRepo->CmInfo), 1, CmObject ); break; case EStdObjAcpiTableList: Status = HandleCmObject ( CmObjectId, &PlatformRepo->CmAcpiTableList, sizeof (PlatformRepo->CmAcpiTableList), ARRAY_SIZE (PlatformRepo->CmAcpiTableList), CmObject ); break; default: { Status = EFI_NOT_FOUND; DEBUG (( DEBUG_ERROR, "ERROR: Object 0x%x. Status = %r\n", CmObjectId, Status )); break; } } return Status; } /** Return an ARM namespace object. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Configuration Manager Object ID. @param [in] Token An optional token identifying the object. If unused this must be CM_NULL_TOKEN. @param [in, out] CmObject Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_NOT_FOUND The required object information is not found. **/ EFI_STATUS EFIAPI GetArmNameSpaceObject ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token OPTIONAL, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject ) { EFI_STATUS Status; FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo; Status = EFI_SUCCESS; if ((This == NULL) || (CmObject == NULL)) { ASSERT (This != NULL); ASSERT (CmObject != NULL); return EFI_INVALID_PARAMETER; } PlatformRepo = This->PlatRepoInfo; switch (GET_CM_OBJECT_ID (CmObjectId)) { case EArmObjBootArchInfo: Status = HandleCmObject ( CmObjectId, &PlatformRepo->BootArchInfo, sizeof (PlatformRepo->BootArchInfo), 1, CmObject ); break; case EArmObjPowerManagementProfileInfo: Status = HandleCmObject ( CmObjectId, &PlatformRepo->PmProfileInfo, sizeof (PlatformRepo->PmProfileInfo), 1, CmObject ); break; case EArmObjGenericTimerInfo: Status = HandleCmObject ( CmObjectId, &PlatformRepo->GenericTimerInfo, sizeof (PlatformRepo->GenericTimerInfo), 1, CmObject ); break; case EArmObjPlatformGenericWatchdogInfo: Status = HandleCmObject ( CmObjectId, &PlatformRepo->Watchdog, sizeof (PlatformRepo->Watchdog), PLAT_WATCHDOG_COUNT, CmObject ); break; case EArmObjPlatformGTBlockInfo: Status = HandleCmObject ( CmObjectId, &PlatformRepo->GTBlockInfo, sizeof (PlatformRepo->GTBlockInfo), ARRAY_SIZE (PlatformRepo->GTBlockInfo), CmObject ); break; case EArmObjGTBlockTimerFrameInfo: Status = HandleCmObjectRefByToken ( This, CmObjectId, PlatformRepo->GTBlock0TimerInfo, sizeof (PlatformRepo->GTBlock0TimerInfo), ARRAY_SIZE (PlatformRepo->GTBlock0TimerInfo), Token, GetGTBlockTimerFrameInfo, CmObject ); break; case EArmObjGicCInfo: Status = HandleCmObjectRefByToken ( This, CmObjectId, PlatformRepo->GicCInfo, sizeof (PlatformRepo->GicCInfo), ARRAY_SIZE (PlatformRepo->GicCInfo), Token, GetGicCInfo, CmObject ); break; case EArmObjGicDInfo: Status = HandleCmObject ( CmObjectId, &PlatformRepo->GicDInfo, sizeof (PlatformRepo->GicDInfo), 1, CmObject ); break; case EArmObjGicRedistributorInfo: Status = HandleCmObject ( CmObjectId, &PlatformRepo->GicRedistInfo, sizeof (PlatformRepo->GicRedistInfo), PLAT_GIC_REDISTRIBUTOR_COUNT, CmObject ); break; case EArmObjGicItsInfo: Status = HandleCmObject ( CmObjectId, &PlatformRepo->GicItsInfo, sizeof (PlatformRepo->GicItsInfo), PLAT_GIC_ITS_COUNT, CmObject ); break; case EArmObjSerialConsolePortInfo: Status = HandleCmObject ( CmObjectId, &PlatformRepo->SpcrSerialPort, sizeof (PlatformRepo->SpcrSerialPort), 1, CmObject ); break; case EArmObjPciConfigSpaceInfo: Status = HandleCmObjectRefByToken ( This, CmObjectId, PlatformRepo->PciConfigInfo, sizeof (PlatformRepo->PciConfigInfo), ARRAY_SIZE (PlatformRepo->PciConfigInfo), Token, GetPciConfigInfo, CmObject ); break; default: { Status = EFI_NOT_FOUND; DEBUG (( DEBUG_INFO, "INFO: Object 0x%x. Status = %r\n", CmObjectId, Status )); break; } }//switch return Status; } /** Return an OEM namespace object. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Configuration Manager Object ID. @param [in] Token An optional token identifying the object. If unused this must be CM_NULL_TOKEN. @param [in, out] CmObject Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_NOT_FOUND The required object information is not found. **/ EFI_STATUS EFIAPI GetOemNameSpaceObject ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token OPTIONAL, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject ) { EFI_STATUS Status; Status = EFI_SUCCESS; if ((This == NULL) || (CmObject == NULL)) { ASSERT (This != NULL); ASSERT (CmObject != NULL); return EFI_INVALID_PARAMETER; } switch (GET_CM_OBJECT_ID (CmObjectId)) { default: { Status = EFI_NOT_FOUND; DEBUG (( DEBUG_ERROR, "ERROR: Object 0x%x. Status = %r\n", CmObjectId, Status )); break; } } return Status; } /** The GetObject function defines the interface implemented by the Configuration Manager Protocol for returning the Configuration Manager Objects. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Configuration Manager Object ID. @param [in] Token An optional token identifying the object. If unused this must be CM_NULL_TOKEN. @param [in, out] CmObject Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_NOT_FOUND The required object information is not found. **/ EFI_STATUS EFIAPI FslPlatformGetObject ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token OPTIONAL, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject ) { EFI_STATUS Status; if ((This == NULL) || (CmObject == NULL)) { ASSERT (This != NULL); ASSERT (CmObject != NULL); return EFI_INVALID_PARAMETER; } switch (GET_CM_NAMESPACE_ID (CmObjectId)) { case EObjNameSpaceStandard: Status = GetStandardNameSpaceObject (This, CmObjectId, Token, CmObject); break; case EObjNameSpaceArm: Status = GetArmNameSpaceObject (This, CmObjectId, Token, CmObject); break; case EObjNameSpaceOem: Status = GetOemNameSpaceObject (This, CmObjectId, Token, CmObject); break; default: { Status = EFI_INVALID_PARAMETER; DEBUG (( DEBUG_ERROR, "ERROR: Unknown Namespace Object = 0x%x. Status = %r\n", CmObjectId, Status )); break; } } return Status; } /** The SetObject function defines the interface implemented by the Configuration Manager Protocol for updating the Configuration Manager Objects. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Configuration Manager Object ID. @param [in] Token An optional token identifying the object. If unused this must be CM_NULL_TOKEN. @param [in] CmObject Pointer to the Configuration Manager Object descriptor describing the Object. @retval EFI_UNSUPPORTED This operation is not supported. **/ EFI_STATUS EFIAPI FslPlatformSetObject ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token OPTIONAL, IN CM_OBJ_DESCRIPTOR * CONST CmObject ) { return EFI_UNSUPPORTED; } /** A structure describing the configuration manager protocol interface. */ STATIC CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL FslConfigManagerProtocol = { CREATE_REVISION (1, 0), FslPlatformGetObject, FslPlatformSetObject, &FslPlatformRepositoryInfo }; /** Entrypoint of Configuration Manager Dxe. @param ImageHandle @param SystemTable @return EFI_SUCCESS @return EFI_LOAD_ERROR @return EFI_OUT_OF_RESOURCES **/ EFI_STATUS EFIAPI ConfigurationManagerDxeInitialize ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE * SystemTable ) { EFI_STATUS Status; Status = gBS->InstallProtocolInterface ( &ImageHandle, &gEdkiiConfigurationManagerProtocolGuid, EFI_NATIVE_INTERFACE, (VOID*)&FslConfigManagerProtocol ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "ERROR: Failed to get Install Configuration Manager Protocol." \ " Status = %r\n", Status )); goto error_handler; } Status = InitializePlatformRepository ( &FslConfigManagerProtocol ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "ERROR: Failed to initialize the Platform Configuration Repository." \ " Status = %r\n", Status )); } error_handler: return Status; }