/** @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;
}