/** @file Configuration Manager Dxe Copyright (c) 2017 - 2020, Arm Limited. All rights reserved.
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 #include #include "ArmPlatform.h" #include "ConfigurationManager.h" #include "Platform.h" /** The platform configuration repository information. */ STATIC EDKII_PLATFORM_REPOSITORY_INFO ArmJunoPlatformRepositoryInfo = { /// 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 }, // 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 }, // 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 }, // 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 }, // DSDT Table { EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, 0, // Unused CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdDsdt), (EFI_ACPI_DESCRIPTION_HEADER*)dsdt_aml_code }, // DBG2 Table { EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE, EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT_REVISION, CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdDbg2), NULL }, // SSDT Table describing the Juno USB { EFI_ACPI_6_2_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, 0, // Unused CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSsdt), (EFI_ACPI_DESCRIPTION_HEADER*)ssdtjunousb_aml_code }, // SSDT table describing the PL011 UART { EFI_ACPI_6_2_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, 0, // Unused CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSsdt), (EFI_ACPI_DESCRIPTION_HEADER*)ssdtuart_aml_code }, // PPTT Table { EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE, EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_REVISION, CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdPptt), NULL }, /* PCI MCFG Table PCIe is only available on Juno R1 and R2. Add the PCI table entries at the end of the table so that we can easily disable PCIe for Juno R0 */ { 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 }, // SSDT table describing the PCI root complex { EFI_ACPI_6_2_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, 0, // Unused CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSsdt), (EFI_ACPI_DESCRIPTION_HEADER*)ssdtpci_aml_code } }, // Boot architecture information { EFI_ACPI_6_2_ARM_PSCI_COMPLIANT }, // BootArchFlags // Power management profile information { EFI_ACPI_6_2_PM_PROFILE_MOBILE }, // PowerManagement Profile /* GIC CPU Interface information GIC_ENTRY (CPUInterfaceNumber, Mpidr, PmuIrq, VGicIrq, EnergyEfficiency) */ { GICC_ENTRY (0, GET_MPID (0, 0), 34, 25, 1), GICC_ENTRY (1, GET_MPID (0, 1), 38, 25, 1), GICC_ENTRY (2, GET_MPID (1, 0), 50, 25, 0), GICC_ENTRY (3, GET_MPID (1, 1), 54, 25, 0), GICC_ENTRY (4, GET_MPID (1, 2), 58, 25, 0), GICC_ENTRY (5, GET_MPID (1, 3), 62, 25, 0) }, // GIC Distributor Info { FixedPcdGet64 (PcdGicDistributorBase), // UINT64 PhysicalBaseAddress 0, // UINT32 SystemVectorBase 2 // UINT8 GicVersion }, // Generic Timer Info { // The physical base address for the counter control frame JUNO_SYSTEM_TIMER_BASE_ADDRESS, // The physical base address for the counter read frame JUNO_CNT_READ_BASE_ADDRESS, // The secure PL1 timer interrupt FixedPcdGet32 (PcdArmArchTimerSecIntrNum), // The secure PL1 timer flags JUNO_GTDT_GTIMER_FLAGS, // The non-secure PL1 timer interrupt FixedPcdGet32 (PcdArmArchTimerIntrNum), // The non-secure PL1 timer flags JUNO_GTDT_GTIMER_FLAGS, // The virtual timer interrupt FixedPcdGet32 (PcdArmArchTimerVirtIntrNum), // The virtual timer flags JUNO_GTDT_GTIMER_FLAGS, // The non-secure PL2 timer interrupt FixedPcdGet32 (PcdArmArchTimerHypIntrNum), // The non-secure PL2 timer flags JUNO_GTDT_GTIMER_FLAGS }, // Generic Timer Block Information { { // The physical base address for the GT Block Timer structure JUNO_GT_BLOCK_CTL_BASE, // The number of timer frames implemented in the GT Block JUNO_TIMER_FRAMES_COUNT, // Reference token for the GT Block timer frame list (CM_OBJECT_TOKEN)((UINT8*)&ArmJunoPlatformRepositoryInfo + OFFSET_OF (EDKII_PLATFORM_REPOSITORY_INFO, GTBlock0TimerInfo)) } }, // GT Block Timer Frames { // Frame 0 { 0, // UINT8 FrameNumber JUNO_GT_BLOCK_FRAME0_CTL_BASE, // UINT64 PhysicalAddressCntBase JUNO_GT_BLOCK_FRAME0_CTL_EL0_BASE, // UINT64 PhysicalAddressCntEL0Base JUNO_GT_BLOCK_FRAME0_GSIV, // UINT32 PhysicalTimerGSIV JUNO_GTX_TIMER_FLAGS, // UINT32 PhysicalTimerFlags 0, // UINT32 VirtualTimerGSIV 0, // UINT32 VirtualTimerFlags JUNO_GTX_COMMON_FLAGS_S // UINT32 CommonFlags }, // Frame 1 { 1, // UINT8 FrameNumber JUNO_GT_BLOCK_FRAME1_CTL_BASE, // UINT64 PhysicalAddressCntBase JUNO_GT_BLOCK_FRAME1_CTL_EL0_BASE, // UINT64 PhysicalAddressCntEL0Base JUNO_GT_BLOCK_FRAME1_GSIV, // UINT32 PhysicalTimerGSIV JUNO_GTX_TIMER_FLAGS, // UINT32 PhysicalTimerFlags 0, // UINT32 VirtualTimerGSIV 0, // UINT32 VirtualTimerFlags JUNO_GTX_COMMON_FLAGS_NS // UINT32 CommonFlags }, }, // Watchdog Info { // The physical base address of the SBSA Watchdog control frame FixedPcdGet64 (PcdGenericWatchdogControlBase), // The physical base address of the SBSA Watchdog refresh frame FixedPcdGet64 (PcdGenericWatchdogRefreshBase), // The watchdog interrupt FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum), // The watchdog flags JUNO_SBSA_WATCHDOG_FLAGS }, // SPCR Serial Port { FixedPcdGet64 (PcdSerialRegisterBase), // BaseAddress FixedPcdGet32 (PL011UartInterrupt), // Interrupt FixedPcdGet64 (PcdUartDefaultBaudRate), // BaudRate FixedPcdGet32 (PL011UartClkInHz), // Clock EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART // Port subtype }, // Debug Serial Port { FixedPcdGet64 (PcdSerialDbgRegisterBase), // BaseAddress 38, // Interrupt FixedPcdGet64 (PcdSerialDbgUartBaudRate), // BaudRate FixedPcdGet32 (PcdSerialDbgUartClkInHz), // Clock EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART // Port subtype }, // PCI Configuration Space Info { // The physical base address for the PCI segment FixedPcdGet64 (PcdPciConfigurationSpaceBaseAddress), // The PCI segment group number 0, // The start bus number FixedPcdGet32 (PcdPciBusMin), // The end bus number FixedPcdGet32 (PcdPciBusMax) }, // GIC Msi Frame Info { // The GIC MSI Frame ID 0, // The Physical base address for the MSI Frame. ARM_JUNO_GIV2M_MSI_BASE, /* The GIC MSI Frame flags as described by the GIC MSI frame structure in the ACPI Specification. */ 0, // SPI Count used by this frame. 127, // SPI Base used by this frame. 224 }, // Processor Hierarchy Nodes { // Package { // CM_OBJECT_TOKEN Token REFERENCE_TOKEN (ProcHierarchyInfo[0]), // UINT32 Flags PROC_NODE_FLAGS ( EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL, EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID, EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF, EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL ), // CM_OBJECT_TOKEN ParentToken CM_NULL_TOKEN, // CM_OBJECT_TOKEN GicCToken CM_NULL_TOKEN, // UINT32 NoOfPrivateResources 0, // CM_OBJECT_TOKEN PrivateResourcesArrayToken CM_NULL_TOKEN }, // 'big' cluster { // CM_OBJECT_TOKEN Token REFERENCE_TOKEN (ProcHierarchyInfo[1]), // UINT32 Flags PROC_NODE_FLAGS ( EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID, EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF, EFI_ACPI_6_3_PPTT_IMPLEMENTATION_IDENTICAL ), // CM_OBJECT_TOKEN ParentToken REFERENCE_TOKEN (ProcHierarchyInfo[0]), // -> Package // CM_OBJECT_TOKEN GicCToken CM_NULL_TOKEN, // UINT32 NoOfPrivateResources BIG_CLUSTER_RESOURCE_COUNT, // CM_OBJECT_TOKEN PrivateResourcesArrayToken REFERENCE_TOKEN (BigClusterResources) }, // 'LITTLE' cluster { // CM_OBJECT_TOKEN Token REFERENCE_TOKEN (ProcHierarchyInfo[2]), // UINT32 Flags PROC_NODE_FLAGS ( EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID, EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF, EFI_ACPI_6_3_PPTT_IMPLEMENTATION_IDENTICAL ), // CM_OBJECT_TOKEN ParentToken REFERENCE_TOKEN (ProcHierarchyInfo[0]), // -> Package // CM_OBJECT_TOKEN GicCToken CM_NULL_TOKEN, // UINT32 NoOfPrivateResources LITTLE_CLUSTER_RESOURCE_COUNT, // CM_OBJECT_TOKEN PrivateResourcesArrayToken REFERENCE_TOKEN (LittleClusterResources) }, // Two 'big' cores { // CM_OBJECT_TOKEN Token REFERENCE_TOKEN (ProcHierarchyInfo[3]), // UINT32 Flags PROC_NODE_FLAGS ( EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL ), // CM_OBJECT_TOKEN ParentToken REFERENCE_TOKEN (ProcHierarchyInfo[1]), // -> 'big' cluster // CM_OBJECT_TOKEN GicCToken REFERENCE_TOKEN (GicCInfo[0]), // UINT32 NoOfPrivateResources BIG_CORE_RESOURCE_COUNT, // CM_OBJECT_TOKEN PrivateResourcesArrayToken REFERENCE_TOKEN (BigCoreResources) }, { // CM_OBJECT_TOKEN Token REFERENCE_TOKEN (ProcHierarchyInfo[4]), // UINT32 Flags PROC_NODE_FLAGS ( EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL ), // CM_OBJECT_TOKEN ParentToken REFERENCE_TOKEN (ProcHierarchyInfo[1]), // -> 'big' cluster // CM_OBJECT_TOKEN GicCToken REFERENCE_TOKEN (GicCInfo[1]), // UINT32 NoOfPrivateResources BIG_CORE_RESOURCE_COUNT, // CM_OBJECT_TOKEN PrivateResourcesArrayToken REFERENCE_TOKEN (BigCoreResources) }, // Four 'LITTLE' cores { // CM_OBJECT_TOKEN Token REFERENCE_TOKEN (ProcHierarchyInfo[5]), // UINT32 Flags PROC_NODE_FLAGS ( EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL ), // CM_OBJECT_TOKEN ParentToken REFERENCE_TOKEN (ProcHierarchyInfo[2]), // -> 'LITTLE' cluster // CM_OBJECT_TOKEN GicCToken REFERENCE_TOKEN (GicCInfo[2]), // UINT32 NoOfPrivateResources LITTLE_CORE_RESOURCE_COUNT, // CM_OBJECT_TOKEN PrivateResourcesArrayToken REFERENCE_TOKEN (LittleCoreResources) }, { // CM_OBJECT_TOKEN Token REFERENCE_TOKEN (ProcHierarchyInfo[6]), // UINT32 Flags PROC_NODE_FLAGS ( EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL ), // CM_OBJECT_TOKEN ParentToken REFERENCE_TOKEN (ProcHierarchyInfo[2]), // -> 'LITTLE' cluster // CM_OBJECT_TOKEN GicCToken REFERENCE_TOKEN (GicCInfo[3]), // UINT32 NoOfPrivateResources LITTLE_CORE_RESOURCE_COUNT, // CM_OBJECT_TOKEN PrivateResourcesArrayToken REFERENCE_TOKEN (LittleCoreResources) }, { // CM_OBJECT_TOKEN Token REFERENCE_TOKEN (ProcHierarchyInfo[7]), // UINT32 Flags PROC_NODE_FLAGS ( EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL ), // CM_OBJECT_TOKEN ParentToken REFERENCE_TOKEN (ProcHierarchyInfo[2]), // -> 'LITTLE' cluster // CM_OBJECT_TOKEN GicCToken REFERENCE_TOKEN (GicCInfo[4]), // UINT32 NoOfPrivateResources LITTLE_CORE_RESOURCE_COUNT, // CM_OBJECT_TOKEN PrivateResourcesArrayToken REFERENCE_TOKEN (LittleCoreResources) }, { // CM_OBJECT_TOKEN Token REFERENCE_TOKEN (ProcHierarchyInfo[8]), // UINT32 Flags PROC_NODE_FLAGS ( EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL ), // CM_OBJECT_TOKEN ParentToken REFERENCE_TOKEN (ProcHierarchyInfo[2]), // -> 'LITTLE' cluster // CM_OBJECT_TOKEN GicCToken REFERENCE_TOKEN (GicCInfo[5]), // UINT32 NoOfPrivateResources LITTLE_CORE_RESOURCE_COUNT, // CM_OBJECT_TOKEN PrivateResourcesArrayToken REFERENCE_TOKEN (LittleCoreResources) } }, // Cache information { // 'big' cluster's L2 cache { REFERENCE_TOKEN (CacheInfo[0]), // CM_OBJECT_TOKEN Token CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCacheToken 0x200000, // UINT32 Size 2048, // UINT32 NumberOfSets 16, // UINT32 Associativity CACHE_ATTRIBUTES ( // UINT8 Attributes EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED, EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK ), 64 // UINT16 LineSize }, // 'big' core's L1 instruction cache { REFERENCE_TOKEN (CacheInfo[1]), // CM_OBJECT_TOKEN Token CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCacheToken 0xc000, // UINT32 Size 256, // UINT32 NumberOfSets 3, // UINT32 Associativity CACHE_ATTRIBUTES ( // UINT8 Attributes EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ, EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_INSTRUCTION, EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK ), 64 // UINT16 LineSize }, // 'big' core's L1 data cache { REFERENCE_TOKEN (CacheInfo[2]), // CM_OBJECT_TOKEN Token CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCacheToken 0x8000, // UINT32 Size 256, // UINT32 NumberOfSets 2, // UINT32 Associativity CACHE_ATTRIBUTES ( // UINT8 Attributes EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_DATA, EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK ), 64 // UINT16 LineSize }, // 'LITTLE' cluster's L2 cache { REFERENCE_TOKEN (CacheInfo[3]), // CM_OBJECT_TOKEN Token CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCacheToken 0x100000, // UINT32 Size 1024, // UINT32 NumberOfSets 16, // UINT32 Associativity CACHE_ATTRIBUTES ( // UINT8 Attributes EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED, EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK ), 64 // UINT16 LineSize }, // 'LITTLE' core's L1 instruction cache { REFERENCE_TOKEN (CacheInfo[4]), // CM_OBJECT_TOKEN Token CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCacheToken 0x8000, // UINT32 Size 256, // UINT32 NumberOfSets 2, // UINT32 Associativity CACHE_ATTRIBUTES ( // UINT8 Attributes EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ, EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_INSTRUCTION, EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK ), 64 // UINT16 LineSize }, // 'LITTLE' core's L1 data cache { REFERENCE_TOKEN (CacheInfo[5]), // CM_OBJECT_TOKEN Token CM_NULL_TOKEN, // CM_OBJECT_TOKEN NextLevelOfCacheToken 0x8000, // UINT32 Size 128, // UINT32 NumberOfSets 4, // UINT32 Associativity CACHE_ATTRIBUTES ( // UINT8 Attributes EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_DATA, EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK ), 64 // UINT16 LineSize } }, // Resources private to the 'big' cluster (shared among cores) { { REFERENCE_TOKEN (CacheInfo[0]) } // -> 'big' cluster's L2 cache }, // Resources private to each individual 'big' core instance { { REFERENCE_TOKEN (CacheInfo[1]) }, // -> 'big' core's L1 I-cache { REFERENCE_TOKEN (CacheInfo[2]) } // -> 'big' core's L1 D-cache }, // Resources private to the 'LITTLE' cluster (shared among cores) { { REFERENCE_TOKEN (CacheInfo[3]) } // -> 'LITTLE' cluster's L2 cache }, // Resources private to each individual 'LITTLE' core instance { { REFERENCE_TOKEN (CacheInfo[4]) }, // -> 'LITTLE' core's L1 I-cache { REFERENCE_TOKEN (CacheInfo[5]) } // -> 'LITTLE' core's L1 D-cache } }; /** 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 ) { EDKII_PLATFORM_REPOSITORY_INFO * PlatformRepo; PlatformRepo = This->PlatRepoInfo; GetJunoRevision (PlatformRepo->JunoRevision); DEBUG ((DEBUG_INFO, "Juno Rev = 0x%x\n", PlatformRepo->JunoRevision)); 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 ) { EDKII_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 = sizeof (PlatformRepo->GTBlock0TimerInfo) / sizeof (PlatformRepo->GTBlock0TimerInfo[0]); return EFI_SUCCESS; } /** 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] SearchToken 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 SearchToken, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject ) { EDKII_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->GicCInfo); for (ObjIndex = 0; ObjIndex < TotalObjCount; ObjIndex++) { if (SearchToken == (CM_OBJECT_TOKEN)&PlatformRepo->GicCInfo[ObjIndex]) { CmObject->ObjectId = CmObjectId; CmObject->Size = sizeof (PlatformRepo->GicCInfo[ObjIndex]); CmObject->Data = (VOID*)&PlatformRepo->GicCInfo[ObjIndex]; CmObject->Count = 1; return EFI_SUCCESS; } } return EFI_NOT_FOUND; } /** Return a list of Configuration Manager object references pointed to by the given input token. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Object ID of the CM object requested @param [in] SearchToken A unique token for identifying the requested CM_ARM_OBJ_REF list. @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 GetCmObjRefs ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN SearchToken, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject ) { EDKII_PLATFORM_REPOSITORY_INFO * PlatformRepo; if ((This == NULL) || (CmObject == NULL)) { ASSERT (This != NULL); ASSERT (CmObject != NULL); return EFI_INVALID_PARAMETER; } PlatformRepo = This->PlatRepoInfo; if (SearchToken == (CM_OBJECT_TOKEN)&PlatformRepo->BigClusterResources) { CmObject->Size = sizeof (PlatformRepo->BigClusterResources); CmObject->Data = (VOID*)&PlatformRepo->BigClusterResources; CmObject->Count = ARRAY_SIZE (PlatformRepo->BigClusterResources); return EFI_SUCCESS; } if (SearchToken == (CM_OBJECT_TOKEN)&PlatformRepo->BigCoreResources) { CmObject->Size = sizeof (PlatformRepo->BigCoreResources); CmObject->Data = (VOID*)&PlatformRepo->BigCoreResources; CmObject->Count = ARRAY_SIZE (PlatformRepo->BigCoreResources); return EFI_SUCCESS; } if (SearchToken == (CM_OBJECT_TOKEN)&PlatformRepo->LittleClusterResources) { CmObject->Size = sizeof (PlatformRepo->LittleClusterResources); CmObject->Data = (VOID*)&PlatformRepo->LittleClusterResources; CmObject->Count = ARRAY_SIZE (PlatformRepo->LittleClusterResources); return EFI_SUCCESS; } if (SearchToken == (CM_OBJECT_TOKEN)&PlatformRepo->LittleCoreResources) { CmObject->Size = sizeof (PlatformRepo->LittleCoreResources); CmObject->Data = (VOID*)&PlatformRepo->LittleCoreResources; CmObject->Count = ARRAY_SIZE (PlatformRepo->LittleCoreResources); return EFI_SUCCESS; } return EFI_NOT_FOUND; } /** 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; EDKII_PLATFORM_REPOSITORY_INFO * PlatformRepo; UINT32 TableCount; 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)) { HANDLE_CM_OBJECT ( EStdObjCfgMgrInfo, CmObjectId, PlatformRepo->CmInfo, 1 ); case EStdObjAcpiTableList: CmObject->ObjectId = CmObjectId; TableCount = sizeof (PlatformRepo->CmAcpiTableList) / sizeof (PlatformRepo->CmAcpiTableList[0]); if (PlatformRepo->JunoRevision != JUNO_REVISION_R0) { CmObject->Size = sizeof (PlatformRepo->CmAcpiTableList); CmObject->Count = TableCount; } else { /* The last 2 tables in the ACPI table list enable PCIe support. Reduce the CmObject size so that the PCIe specific ACPI tables are not installed on Juno R0 */ CmObject->Size = sizeof (PlatformRepo->CmAcpiTableList[0]) * (TableCount - 2); CmObject->Count = TableCount - 2; } CmObject->Data = (VOID*)&PlatformRepo->CmAcpiTableList; DEBUG (( DEBUG_INFO, "EStdObjAcpiTableList: Ptr = 0x%p. Size = %d, Count = %d\n", CmObject->Data, CmObject->Size, CmObject->Count )); 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; EDKII_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)) { HANDLE_CM_OBJECT ( EArmObjBootArchInfo, CmObjectId, PlatformRepo->BootArchInfo, 1 ); HANDLE_CM_OBJECT ( EArmObjPowerManagementProfileInfo, CmObjectId, PlatformRepo->PmProfileInfo, 1 ); HANDLE_CM_OBJECT ( EArmObjGenericTimerInfo, CmObjectId, PlatformRepo->GenericTimerInfo, 1 ); HANDLE_CM_OBJECT ( EArmObjPlatformGenericWatchdogInfo, CmObjectId, PlatformRepo->Watchdog, 1 ); HANDLE_CM_OBJECT ( EArmObjPlatformGTBlockInfo, CmObjectId, PlatformRepo->GTBlockInfo, (sizeof (PlatformRepo->GTBlockInfo) / sizeof (PlatformRepo->GTBlockInfo[0])) ); HANDLE_CM_OBJECT_REF_BY_TOKEN ( EArmObjGTBlockTimerFrameInfo, CmObjectId, PlatformRepo->GTBlock0TimerInfo, (sizeof (PlatformRepo->GTBlock0TimerInfo) / sizeof (PlatformRepo->GTBlock0TimerInfo[0])), Token, GetGTBlockTimerFrameInfo ); HANDLE_CM_OBJECT_REF_BY_TOKEN ( EArmObjGicCInfo, CmObjectId, PlatformRepo->GicCInfo, ARRAY_SIZE (PlatformRepo->GicCInfo), Token, GetGicCInfo ); HANDLE_CM_OBJECT ( EArmObjGicDInfo, CmObjectId, PlatformRepo->GicDInfo, 1 ); HANDLE_CM_OBJECT ( EArmObjSerialConsolePortInfo, CmObjectId, PlatformRepo->SpcrSerialPort, 1 ); HANDLE_CM_OBJECT ( EArmObjSerialDebugPortInfo, CmObjectId, PlatformRepo->DbgSerialPort, 1 ); HANDLE_CM_OBJECT ( EArmObjGicMsiFrameInfo, CmObjectId, PlatformRepo->GicMsiFrameInfo, 1 ); HANDLE_CM_OBJECT ( EArmObjProcHierarchyInfo, CmObjectId, PlatformRepo->ProcHierarchyInfo, ARRAY_SIZE (PlatformRepo->ProcHierarchyInfo) ); HANDLE_CM_OBJECT ( EArmObjCacheInfo, CmObjectId, PlatformRepo->CacheInfo, ARRAY_SIZE (PlatformRepo->CacheInfo) ); HANDLE_CM_OBJECT_SEARCH_PLAT_REPO ( EArmObjCmRef, CmObjectId, Token, GetCmObjRefs ); case EArmObjPciConfigSpaceInfo: if (PlatformRepo->JunoRevision != JUNO_REVISION_R0) { CmObject->ObjectId = CmObjectId; CmObject->Size = sizeof (PlatformRepo->PciConfigInfo); CmObject->Count = 1; CmObject->Data = (VOID*)&PlatformRepo->PciConfigInfo; DEBUG (( DEBUG_INFO, "EArmObjPciConfigSpaceInfo: Ptr = 0x%p, Size = %d, Count = %d\n", CmObject->Data, CmObject->Size, CmObject->Count )); } 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 ArmJunoPlatformGetObject ( 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 ArmJunoPlatformSetObject ( 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 ArmJunoPlatformConfigManagerProtocol = { CREATE_REVISION (1, 0), ArmJunoPlatformGetObject, ArmJunoPlatformSetObject, &ArmJunoPlatformRepositoryInfo }; /** 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*)&ArmJunoPlatformConfigManagerProtocol ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "ERROR: Failed to get Install Configuration Manager Protocol." \ " Status = %r\n", Status )); goto error_handler; } Status = InitializePlatformRepository ( &ArmJunoPlatformConfigManagerProtocol ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "ERROR: Failed to initialize the Platform Configuration Repository." \ " Status = %r\n", Status )); } error_handler: return Status; }