From 44788bae6f0ac5519764651d732a7c12b1f398c4 Mon Sep 17 00:00:00 2001 From: oliviermartin Date: Thu, 22 Sep 2011 23:14:01 +0000 Subject: [PATCH] ArmPkg: Create MpCoreInfo PPI and HOB to describe CPU Cores on a MPCore platform These info are: - ClusterId, CoreId - MailBox Set/Get/Clear address git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12423 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmPkg/ArmPkg.dec | 9 ++ ArmPkg/Drivers/CpuDxe/CpuDxe.c | 6 + ArmPkg/Drivers/CpuDxe/CpuDxe.h | 14 +++ ArmPkg/Drivers/CpuDxe/CpuDxe.inf | 7 +- ArmPkg/Drivers/CpuDxe/CpuMpCore.c | 103 ++++++++++++++++++ ArmPkg/Drivers/CpuPei/CpuPei.c | 46 +++++--- ArmPkg/Drivers/CpuPei/CpuPei.inf | 4 + ArmPkg/Include/Guid/ArmMpCoreInfo.h | 66 +++++++++++ ArmPkg/Include/Ppi/ArmMpCoreInfo.h | 58 ++++++++++ .../ArmRealViewEb-RTSM-A8.dsc | 1 + .../ArmRealViewEb-RTSM-A9x2.dsc | 1 + .../ArmRealViewEb-RTSM-MPCore.fdf | 1 + .../ArmRealViewEb-RTSM-UniCore.fdf | 1 + .../Include/Platform/ArmPlatform.h | 3 + .../ArmRealViewEbLibRTSM/ArmRealViewEb.c | 57 +++++++++- .../ArmVExpressPkg/ArmVExpress-CTA9x4.dsc | 1 + .../ArmVExpressPkg/ArmVExpress-CTA9x4.fdf | 1 + .../Include/VExpressMotherBoard.h | 7 +- .../Library/ArmVExpressLibCTA9x4/CTA9x4.c | 74 ++++++++++++- ArmPlatformPkg/PlatformPei/PlatformPeiLib.c | 2 - ArmPlatformPkg/PrePeiCore/MainMPCore.c | 62 +++++++++-- .../PrePeiCore/PrePeiCoreMPCore.inf | 1 + ArmPlatformPkg/PrePi/PrePi.c | 3 + 23 files changed, 496 insertions(+), 32 deletions(-) create mode 100644 ArmPkg/Drivers/CpuDxe/CpuMpCore.c create mode 100644 ArmPkg/Include/Guid/ArmMpCoreInfo.h create mode 100644 ArmPkg/Include/Ppi/ArmMpCoreInfo.h diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index ea79b08822..d28d783160 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -2,6 +2,7 @@ # ARM processor package. # # Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
+# Copyright (c) 2011, ARM Limited. All rights reserved. # # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -41,6 +42,14 @@ [Guids.common] gArmTokenSpaceGuid = { 0xBB11ECFE, 0x820F, 0x4968, { 0xBB, 0xA6, 0xF7, 0x6A, 0xFE, 0x30, 0x25, 0x96 } } + ## ARM MPCore table + # Include/Guid/ArmMpCoreInfo.h + gArmMpCoreInfoGuid = { 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} } + +[Ppis] + ## Include/Ppi/ArmMpCoreInfo.h + gArmMpCoreInfoPpiGuid = { 0x6847cc74, 0xe9ec, 0x4f8f, {0xa2, 0x9d, 0xab, 0x44, 0xe7, 0x54, 0xa8, 0xfc} } + [Protocols.common] gVirtualUncachedPagesProtocolGuid = { 0xAD651C7D, 0x3C22, 0x4DBF, { 0x92, 0xe8, 0x38, 0xa7, 0xcd, 0xae, 0x87, 0xb2 } } diff --git a/ArmPkg/Drivers/CpuDxe/CpuDxe.c b/ArmPkg/Drivers/CpuDxe/CpuDxe.c index cea333f91d..f14a676383 100644 --- a/ArmPkg/Drivers/CpuDxe/CpuDxe.c +++ b/ArmPkg/Drivers/CpuDxe/CpuDxe.c @@ -257,6 +257,12 @@ CpuDxeInitialize ( // SyncCacheConfig (&mCpu); + // If the platform is a MPCore system then install the Configuration Table describing the + // secondary core states + if (ArmIsMPCore()) { + PublishArmProcessorTable(); + } + // // Setup a callback for idle events // diff --git a/ArmPkg/Drivers/CpuDxe/CpuDxe.h b/ArmPkg/Drivers/CpuDxe/CpuDxe.h index 70f77ca059..6349d8087f 100644 --- a/ArmPkg/Drivers/CpuDxe/CpuDxe.h +++ b/ArmPkg/Drivers/CpuDxe/CpuDxe.h @@ -124,6 +124,20 @@ ConvertSectionToPages ( IN EFI_PHYSICAL_ADDRESS BaseAddress ); +/** + * Publish ARM Processor Data table in UEFI SYSTEM Table. + * @param HobStart Pointer to the beginning of the HOB List from PEI. + * + * Description : This function iterates through HOB list and finds ARM processor Table Entry HOB. + * If the ARM processor Table Entry HOB is found, the HOB data is copied to run-time memory + * and a pointer is assigned to it in ARM processor table. Then the ARM processor table is + * installed in EFI configuration table. +**/ +VOID +EFIAPI +PublishArmProcessorTable( + VOID + ); extern VIRTUAL_UNCACHED_PAGES_PROTOCOL gVirtualUncachedPages; diff --git a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf index 231257cc1a..e5709a63d0 100644 --- a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf +++ b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf @@ -27,6 +27,7 @@ [Sources.ARM] CpuDxe.c CpuDxe.h + CpuMpCore.c Exception.c # @@ -40,7 +41,7 @@ # ExceptionSupport.ARMv6.asm | RVCT ExceptionSupport.ARMv6.S | GCC - Mmu.c + Mmu.c [Packages] @@ -50,13 +51,16 @@ MdeModulePkg/MdeModulePkg.dec [LibraryClasses] + ArmLib BaseMemoryLib CacheMaintenanceLib CpuLib DebugLib DefaultExceptionHandlerLib DxeServicesTableLib + HobLib PeCoffGetEntryPointLib + UefiDriverEntryPoint UefiLib [Protocols] @@ -66,6 +70,7 @@ [Guids] gEfiDebugImageInfoTableGuid + gArmMpCoreInfoGuid gIdleLoopEventGuid [Pcd.common] diff --git a/ArmPkg/Drivers/CpuDxe/CpuMpCore.c b/ArmPkg/Drivers/CpuDxe/CpuMpCore.c new file mode 100644 index 0000000000..49bc25c8c5 --- /dev/null +++ b/ArmPkg/Drivers/CpuDxe/CpuMpCore.c @@ -0,0 +1,103 @@ +/** @file +* +* Copyright (c) 2011, ARM Limited. All rights reserved. +* +* This program and the accompanying materials +* are licensed and made available under the terms and conditions of the BSD License +* which accompanies this distribution. The full text of the license may be found at +* http://opensource.org/licenses/bsd-license.php +* +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +* +**/ + +#include +#include +#include +#include +#include + +#include + +ARM_PROCESSOR_TABLE mArmProcessorTableTemplate = { + { + EFI_ARM_PROCESSOR_TABLE_SIGNATURE, + 0, + EFI_ARM_PROCESSOR_TABLE_REVISION, + EFI_ARM_PROCESSOR_TABLE_OEM_ID, + EFI_ARM_PROCESSOR_TABLE_OEM_TABLE_ID, + EFI_ARM_PROCESSOR_TABLE_OEM_REVISION, + EFI_ARM_PROCESSOR_TABLE_CREATOR_ID, + EFI_ARM_PROCESSOR_TABLE_CREATOR_REVISION, + 0, + 0 + }, //ARM Processor table header + 0, // Number of entries in ARM processor Table + NULL // ARM Processor Table +}; + +/** Publish ARM Processor Data table in UEFI SYSTEM Table. + * @param: HobStart Pointer to the beginning of the HOB List from PEI. + * + * Description : This function iterates through HOB list and finds ARM processor Table Entry HOB. + * If the ARM processor Table Entry HOB is found, the HOB data is copied to run-time memory + * and a pointer is assigned to it in ARM processor table. Then the ARM processor table is + * installed in EFI configuration table. +**/ +VOID +EFIAPI +PublishArmProcessorTable ( + VOID + ) +{ + EFI_PEI_HOB_POINTERS Hob; + + Hob.Raw = GetHobList (); + + // Iterate through the HOBs and find if there is ARM PROCESSOR ENTRY HOB + for (; !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB(Hob)) { + // Check for Correct HOB type + if ((GET_HOB_TYPE (Hob)) == EFI_HOB_TYPE_GUID_EXTENSION) { + // Check for correct GUID type + if (CompareGuid(&(Hob.Guid->Name), &gArmMpCoreInfoGuid)) { + ARM_PROCESSOR_TABLE *ArmProcessorTable; + EFI_STATUS Status; + + // Allocate Runtime memory for ARM processor table + ArmProcessorTable = (ARM_PROCESSOR_TABLE*)AllocateRuntimePool(sizeof(ARM_PROCESSOR_TABLE)); + + // Check if the memory allocation is succesful or not + ASSERT(NULL != ArmProcessorTable); + + // Set ARM processor table to default values + CopyMem(ArmProcessorTable,&mArmProcessorTableTemplate,sizeof(ARM_PROCESSOR_TABLE)); + + // Fill in Length fields of ARM processor table + ArmProcessorTable->Header.Length = sizeof(ARM_PROCESSOR_TABLE); + ArmProcessorTable->Header.DataLen = GET_GUID_HOB_DATA_SIZE(Hob); + + // Fill in Identifier(ARM processor table GUID) + ArmProcessorTable->Header.Identifier = gArmMpCoreInfoGuid; + + // Set Number of ARM core entries in the Table + ArmProcessorTable->NumberOfEntries = GET_GUID_HOB_DATA_SIZE(Hob)/sizeof(ARM_CORE_INFO); + + // Allocate runtime memory for ARM processor Table entries + ArmProcessorTable->ArmCpus = (ARM_CORE_INFO*)AllocateRuntimePool ( + ArmProcessorTable->NumberOfEntries * sizeof(ARM_CORE_INFO)); + + // Check if the memory allocation is succesful or not + ASSERT(NULL != ArmProcessorTable->ArmCpus); + + // Copy ARM Processor Table data from HOB list to newly allocated memory + CopyMem(ArmProcessorTable->ArmCpus,GET_GUID_HOB_DATA(Hob), ArmProcessorTable->Header.DataLen); + + // Install the ARM Processor table into EFI system configuration table + Status = gBS->InstallConfigurationTable (&gArmMpCoreInfoGuid, ArmProcessorTable); + + ASSERT_EFI_ERROR (Status); + } + } + } +} diff --git a/ArmPkg/Drivers/CpuPei/CpuPei.c b/ArmPkg/Drivers/CpuPei/CpuPei.c index bc01f306b9..f358cb845a 100755 --- a/ArmPkg/Drivers/CpuPei/CpuPei.c +++ b/ArmPkg/Drivers/CpuPei/CpuPei.c @@ -2,6 +2,8 @@ Copyright (c) 2006, Intel Corporation. All rights reserved.
Copyright (c) 2011 Hewlett Packard Corporation. All rights reserved.
+Copyright (c) 2011, ARM Limited. All rights reserved.
+ This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -29,12 +31,14 @@ Abstract: // // The protocols, PPI and GUID defintions for this module // +#include // // The Library classes this module consumes // #include #include +#include #include #include #include @@ -54,7 +58,7 @@ FindMainMemory ( { EFI_PEI_HOB_POINTERS NextHob; - // look at the resource descriptor hobs, choose the first system memory one + // Look at the resource descriptor hobs, choose the first system memory one NextHob.Raw = GetHobList (); while ((NextHob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, NextHob.Raw)) != NULL) { if(NextHob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) @@ -75,7 +79,7 @@ ConfigureMmu ( VOID ) { - EFI_STATUS Status; + EFI_STATUS Status; UINTN Idx; UINT32 CacheAttributes; UINT32 SystemMemoryBase; @@ -99,7 +103,7 @@ ConfigureMmu ( SystemMemoryLastAddress = SystemMemoryBase + (SystemMemoryLength-1); - // if system memory does not begin at 0 + // If system memory does not begin at 0 if(SystemMemoryBase > 0) { MemoryTable[Idx].PhysicalBase = 0; MemoryTable[Idx].VirtualBase = 0; @@ -114,7 +118,7 @@ ConfigureMmu ( MemoryTable[Idx].Attributes = (ARM_MEMORY_REGION_ATTRIBUTES)CacheAttributes; Idx++; - // if system memory does not go to the last address (0xFFFFFFFF) + // If system memory does not go to the last address (0xFFFFFFFF) if( SystemMemoryLastAddress < MAX_ADDRESS ) { MemoryTable[Idx].PhysicalBase = SystemMemoryLastAddress + 1; MemoryTable[Idx].VirtualBase = MemoryTable[Idx].PhysicalBase; @@ -138,13 +142,6 @@ ConfigureMmu ( BuildMemoryAllocationHob((EFI_PHYSICAL_ADDRESS)(UINTN)TranslationTableBase, TranslationTableSize, EfiBootServicesData); } - -EFI_STATUS -EFIAPI -InitializeCpuPeim ( - IN EFI_PEI_FILE_HANDLE FileHandle, - IN CONST EFI_PEI_SERVICES **PeiServices - ) /*++ Routine Description: @@ -161,14 +158,37 @@ Returns: Status - EFI_SUCCESS if the boot mode could be set --*/ +EFI_STATUS +EFIAPI +InitializeCpuPeim ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) { + EFI_STATUS Status; + ARM_MP_CORE_INFO_PPI *ArmMpCoreInfoPpi; + UINTN ArmCoreCount; + ARM_CORE_INFO *ArmCoreInfoTable; + // Enable program flow prediction, if supported. ArmEnableBranchPrediction (); - // publish the CPU memory and io spaces sizes + // Publish the CPU memory and io spaces sizes BuildCpuHob (PcdGet8 (PcdPrePiCpuMemorySize), PcdGet8 (PcdPrePiCpuIoSize)); - ConfigureMmu(); + //ConfigureMmu(); + + // Only MP Core platform need to produce gArmMpCoreInfoPpiGuid + Status = PeiServicesLocatePpi (&gArmMpCoreInfoPpiGuid, 0, NULL, (VOID**)&ArmMpCoreInfoPpi); + if (!EFI_ERROR(Status)) { + // Build the MP Core Info Table + ArmCoreCount = 0; + Status = ArmMpCoreInfoPpi->GetMpCoreInfo (&ArmCoreCount, &ArmCoreInfoTable); + if (!EFI_ERROR(Status) && (ArmCoreCount > 0)) { + // Build MPCore Info HOB + BuildGuidDataHob (&gArmMpCoreInfoGuid, ArmCoreInfoTable, sizeof (ARM_CORE_INFO) * ArmCoreCount); + } + } return EFI_SUCCESS; } diff --git a/ArmPkg/Drivers/CpuPei/CpuPei.inf b/ArmPkg/Drivers/CpuPei/CpuPei.inf index 5016f8a5cd..3d1665aabd 100755 --- a/ArmPkg/Drivers/CpuPei/CpuPei.inf +++ b/ArmPkg/Drivers/CpuPei/CpuPei.inf @@ -44,6 +44,10 @@ ArmLib [Ppis] + gArmMpCoreInfoPpiGuid + +[Guids] + gArmMpCoreInfoGuid [FixedPcd] gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize diff --git a/ArmPkg/Include/Guid/ArmMpCoreInfo.h b/ArmPkg/Include/Guid/ArmMpCoreInfo.h new file mode 100644 index 0000000000..dba2becca9 --- /dev/null +++ b/ArmPkg/Include/Guid/ArmMpCoreInfo.h @@ -0,0 +1,66 @@ +/** @file +* +* Copyright (c) 2011, ARM Limited. All rights reserved. +* +* This program and the accompanying materials +* are licensed and made available under the terms and conditions of the BSD License +* which accompanies this distribution. The full text of the license may be found at +* http://opensource.org/licenses/bsd-license.php +* +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +* +**/ + +#ifndef __ARM_MP_CORE_INFO_GUID_H_ +#define __ARM_MP_CORE_INFO_GUID_H_ + +#define MAX_CPUS_PER_MPCORE_SYSTEM 0x04 +#define SCU_CONFIG_REG_OFFSET 0x04 +#define MPIDR_U_BIT_MASK 0x40000000 + +typedef struct { + UINT32 ClusterId; + UINT32 CoreId; + + // MP Core Mailbox + EFI_PHYSICAL_ADDRESS MailboxSetAddress; + EFI_PHYSICAL_ADDRESS MailboxGetAddress; + EFI_PHYSICAL_ADDRESS MailboxClearAddress; + UINT64 MailboxClearValue; +} ARM_CORE_INFO; + +typedef struct{ + UINT64 Signature; + UINT32 Length; + UINT32 Revision; + UINT64 OemId; + UINT64 OemTableId; + UINTN OemRevision; + UINTN CreatorId; + UINTN CreatorRevision; + EFI_GUID Identifier; + UINTN DataLen; +} ARM_PROCESSOR_TABLE_HEADER; + +typedef struct { + ARM_PROCESSOR_TABLE_HEADER Header; + UINTN NumberOfEntries; + ARM_CORE_INFO *ArmCpus; +} ARM_PROCESSOR_TABLE; + + +#define ARM_MP_CORE_INFO_GUID \ + { 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} } + +#define EFI_ARM_PROCESSOR_TABLE_SIGNATURE SIGNATURE_64 ('C', 'P', 'U', 'T', 'A', 'B', 'L', 'E') +#define EFI_ARM_PROCESSOR_TABLE_REVISION 0x00010000 //1.0 +#define EFI_ARM_PROCESSOR_TABLE_OEM_ID SIGNATURE_64('A','R','M',' ', 'L', 't', 'd', ' ') +#define EFI_ARM_PROCESSOR_TABLE_OEM_TABLE_ID SIGNATURE_64('V', 'E', 'R', 'S', 'A', 'T', 'I', 'L') +#define EFI_ARM_PROCESSOR_TABLE_OEM_REVISION 0x00000001 +#define EFI_ARM_PROCESSOR_TABLE_CREATOR_ID 0xA5A5A5A5 +#define EFI_ARM_PROCESSOR_TABLE_CREATOR_REVISION 0x01000001 + +extern EFI_GUID gArmMpCoreInfoGuid; + +#endif /* MPCOREINFO_H_ */ diff --git a/ArmPkg/Include/Ppi/ArmMpCoreInfo.h b/ArmPkg/Include/Ppi/ArmMpCoreInfo.h new file mode 100644 index 0000000000..08276b135b --- /dev/null +++ b/ArmPkg/Include/Ppi/ArmMpCoreInfo.h @@ -0,0 +1,58 @@ +/** @file +* +* Copyright (c) 2011, ARM Limited. All rights reserved. +* +* This program and the accompanying materials +* are licensed and made available under the terms and conditions of the BSD License +* which accompanies this distribution. The full text of the license may be found at +* http://opensource.org/licenses/bsd-license.php +* +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +* +**/ + +#ifndef __ARM_MP_CORE_INFO_PPI_H__ +#define __ARM_MP_CORE_INFO_PPI_H_ + +#include + +#define ARM_MP_CORE_INFO_PPI_GUID \ + { 0x6847cc74, 0xe9ec, 0x4f8f, {0xa2, 0x9d, 0xab, 0x44, 0xe7, 0x54, 0xa8, 0xfc} } + +/** + This service of the EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into + permanent memory. + + @param PeiServices Pointer to the PEI Services Table. + @param TemporaryMemoryBase Source Address in temporary memory from which the SEC or PEIM will copy the + Temporary RAM contents. + @param PermanentMemoryBase Destination Address in permanent memory into which the SEC or PEIM will copy the + Temporary RAM contents. + @param CopySize Amount of memory to migrate from temporary to permanent memory. + + @retval EFI_SUCCESS The data was successfully returned. + @retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when + TemporaryMemoryBase > PermanentMemoryBase. + +**/ +typedef +EFI_STATUS +(EFIAPI * ARM_MP_CORE_INFO_GET) ( + OUT UINTN *ArmCoreCount, + OUT ARM_CORE_INFO **ArmCoreTable +); + +/// +/// This service abstracts the ability to migrate contents of the platform early memory store. +/// Note: The name EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI is different from the current PI 1.2 spec. +/// This PPI was optional. +/// +typedef struct { + ARM_MP_CORE_INFO_GET GetMpCoreInfo; +} ARM_MP_CORE_INFO_PPI; + +extern EFI_GUID gArmMpCoreInfoPpiGuid; +extern EFI_GUID gArmMpCoreInfoGuid; + +#endif diff --git a/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A8.dsc b/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A8.dsc index 808793cb2a..f5bff086eb 100644 --- a/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A8.dsc +++ b/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A8.dsc @@ -452,6 +452,7 @@ } ArmPlatformPkg/PlatformPei/PlatformPeim.inf ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf + ArmPkg/Drivers/CpuPei/CpuPei.inf IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf Nt32Pkg/BootModePei/BootModePei.inf MdeModulePkg/Universal/Variable/Pei/VariablePei.inf diff --git a/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A9x2.dsc b/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A9x2.dsc index 4c3cf6e692..9d62124247 100644 --- a/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A9x2.dsc +++ b/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A9x2.dsc @@ -460,6 +460,7 @@ } ArmPlatformPkg/PlatformPei/PlatformPeim.inf ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf + ArmPkg/Drivers/CpuPei/CpuPei.inf IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf Nt32Pkg/BootModePei/BootModePei.inf MdeModulePkg/Universal/Variable/Pei/VariablePei.inf diff --git a/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-MPCore.fdf b/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-MPCore.fdf index f805900f42..133623e083 100644 --- a/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-MPCore.fdf +++ b/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-MPCore.fdf @@ -194,6 +194,7 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Core/Pei/PeiMain.inf INF ArmPlatformPkg/PlatformPei/PlatformPeim.inf INF ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf + INF ArmPkg/Drivers/CpuPei/CpuPei.inf INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf INF IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf diff --git a/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-UniCore.fdf b/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-UniCore.fdf index 70247d0d58..5385ba2554 100644 --- a/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-UniCore.fdf +++ b/ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-UniCore.fdf @@ -194,6 +194,7 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Core/Pei/PeiMain.inf INF ArmPlatformPkg/PlatformPei/PlatformPeim.inf INF ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf + INF ArmPkg/Drivers/CpuPei/CpuPei.inf INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf INF IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf diff --git a/ArmPlatformPkg/ArmRealViewEbPkg/Include/Platform/ArmPlatform.h b/ArmPlatformPkg/ArmRealViewEbPkg/Include/Platform/ArmPlatform.h index cc76bb20de..5f4195752a 100644 --- a/ArmPlatformPkg/ArmRealViewEbPkg/Include/Platform/ArmPlatform.h +++ b/ArmPlatformPkg/ArmRealViewEbPkg/Include/Platform/ArmPlatform.h @@ -119,6 +119,9 @@ // L2x0 Cache Controller Base Address //#define ARM_EB_L2x0_CTLR_BASE 0x1E00A000*/ +#define ARM_EB_SYS_PROC_ID_MASK (0xFF << 24) +#define ARM_EB_SYS_PROC_ID_CORTEX_A8 (0x0E << 24) +#define ARM_EB_SYS_PROC_ID_CORTEX_A9 (0x0C << 24) /******************************************* // EFI Memory Map in Permanent Memory (DRAM) diff --git a/ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEb.c b/ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEb.c index 86b540b242..41c545bff6 100644 --- a/ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEb.c +++ b/ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEb.c @@ -20,8 +20,33 @@ #include #include +#include + #include +ARM_CORE_INFO mRealViewEbMpCoreInfoTable[] = { + { + // Cluster 0, Core 0 + 0x0, 0x0, + + // MP Core MailBox Set/Get/Clear Addresses and Clear Value + (EFI_PHYSICAL_ADDRESS)ARM_EB_SYS_FLAGS_REG, + (EFI_PHYSICAL_ADDRESS)ARM_EB_SYS_FLAGS_SET_REG, + (EFI_PHYSICAL_ADDRESS)ARM_EB_SYS_FLAGS_CLR_REG, + (UINT64)0xFFFFFFFF + }, + { + // Cluster 0, Core 1 + 0x0, 0x1, + + // MP Core MailBox Set/Get/Clear Addresses and Clear Value + (EFI_PHYSICAL_ADDRESS)ARM_EB_SYS_FLAGS_REG, + (EFI_PHYSICAL_ADDRESS)ARM_EB_SYS_FLAGS_SET_REG, + (EFI_PHYSICAL_ADDRESS)ARM_EB_SYS_FLAGS_CLR_REG, + (UINT64)0xFFFFFFFF + } +}; + /** Return if Trustzone is supported by your platform @@ -107,13 +132,41 @@ ArmPlatformInitializeSystemMemory ( { // We do not need to initialize the System Memory on RTSM } + +EFI_STATUS +PrePeiCoreGetMpCoreInfo ( + OUT UINTN *CoreCount, + OUT ARM_CORE_INFO **ArmCoreTable + ) +{ + if ((MmioRead32 (ARM_EB_SYS_PROCID0_REG) & ARM_EB_SYS_PROC_ID_MASK) == ARM_EB_SYS_PROC_ID_CORTEX_A9) { + *CoreCount = sizeof(mRealViewEbMpCoreInfoTable) / sizeof(ARM_CORE_INFO); + *ArmCoreTable = mRealViewEbMpCoreInfoTable; + return EFI_SUCCESS; + } else { + return EFI_UNSUPPORTED; + } +} + +// Needs to be declared in the file. Otherwise gArmMpCoreInfoPpiGuid is undefined in the contect of PrePeiCore +EFI_GUID mArmMpCoreInfoPpiGuid = ARM_MP_CORE_INFO_PPI_GUID; +ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo }; + +EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = { + { + EFI_PEI_PPI_DESCRIPTOR_PPI, + &mArmMpCoreInfoPpiGuid, + &mMpCoreInfoPpi + } +}; + VOID ArmPlatformGetPlatformPpiList ( OUT UINTN *PpiListSize, OUT EFI_PEI_PPI_DESCRIPTOR **PpiList ) { - *PpiListSize = 0; - *PpiList = NULL; + *PpiListSize = sizeof(gPlatformPpiTable); + *PpiList = gPlatformPpiTable; } diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc index 74c28af89b..6930339fa0 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc @@ -506,6 +506,7 @@ } ArmPlatformPkg/PlatformPei/PlatformPeim.inf ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf + ArmPkg/Drivers/CpuPei/CpuPei.inf IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf Nt32Pkg/BootModePei/BootModePei.inf MdeModulePkg/Universal/Variable/Pei/VariablePei.inf diff --git a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf index 3b6b584ff5..cb130e0a17 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf +++ b/ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.fdf @@ -226,6 +226,7 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Core/Pei/PeiMain.inf INF ArmPlatformPkg/PlatformPei/PlatformPeim.inf INF ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf + INF ArmPkg/Drivers/CpuPei/CpuPei.inf INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf INF IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf diff --git a/ArmPlatformPkg/ArmVExpressPkg/Include/VExpressMotherBoard.h b/ArmPlatformPkg/ArmVExpressPkg/Include/VExpressMotherBoard.h index f9273697e3..6ed56ab64f 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/Include/VExpressMotherBoard.h +++ b/ArmPlatformPkg/ArmVExpressPkg/Include/VExpressMotherBoard.h @@ -62,8 +62,11 @@ // VRAM offset for the PL111 Colour LCD Controller on the motherboard #define VRAM_MOTHERBOARD_BASE (ARM_VE_SMB_PERIPH_BASE + 0x00000) -#define SYS_PROC_ID_UNSUPPORTED 0xFF -#define SYS_PROC_ID_CORTEX_A9 0x0C +#define ARM_VE_SYS_PROC_ID_MASK (0xFF << 24) +#define ARM_VE_SYS_PROC_ID_UNSUPPORTED (0xFF << 24) +#define ARM_VE_SYS_PROC_ID_CORTEX_A9 (0x0C << 24) +#define ARM_VE_SYS_PROC_ID_CORTEX_A5 (0x12 << 24) +#define ARM_VE_SYS_PROC_ID_CORTEX_A15 (0x14 << 24) // // Sites where the peripheral is fitted diff --git a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4.c b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4.c index fc4e145436..2b6238bc76 100644 --- a/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4.c +++ b/ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4.c @@ -23,10 +23,55 @@ #include #include +#include + #include #define SerialPrint(txt) SerialPortWrite ((UINT8*)(txt), AsciiStrLen(txt)+1); +ARM_CORE_INFO mVersatileExpressMpCoreInfoCTA9x4[] = { + { + // Cluster 0, Core 0 + 0x0, 0x0, + + // MP Core MailBox Set/Get/Clear Addresses and Clear Value + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG, + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG, + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG, + (UINT64)0xFFFFFFFF + }, + { + // Cluster 0, Core 1 + 0x0, 0x1, + + // MP Core MailBox Set/Get/Clear Addresses and Clear Value + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG, + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG, + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG, + (UINT64)0xFFFFFFFF + }, + { + // Cluster 0, Core 2 + 0x0, 0x2, + + // MP Core MailBox Set/Get/Clear Addresses and Clear Value + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG, + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG, + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG, + (UINT64)0xFFFFFFFF + }, + { + // Cluster 0, Core 3 + 0x0, 0x3, + + // MP Core MailBox Set/Get/Clear Addresses and Clear Value + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG, + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG, + (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG, + (UINT64)0xFFFFFFFF + } +}; + // DDR2 timings PL341_DMC_CONFIG DDRTimings = { .MaxChip = 1, @@ -154,13 +199,38 @@ ArmPlatformInitializeSystemMemory ( PL341DmcInit(ARM_VE_DMC_BASE, &DDRTimings); PL301AxiInit(ARM_VE_FAXI_BASE); } + +EFI_STATUS +PrePeiCoreGetMpCoreInfo ( + OUT UINTN *CoreCount, + OUT ARM_CORE_INFO **ArmCoreTable + ) +{ + *CoreCount = sizeof(mVersatileExpressMpCoreInfoCTA9x4) / sizeof(ARM_CORE_INFO); + *ArmCoreTable = mVersatileExpressMpCoreInfoCTA9x4; + + return EFI_SUCCESS; +} + +// Needs to be declared in the file. Otherwise gArmMpCoreInfoPpiGuid is undefined in the contect of PrePeiCore +EFI_GUID mArmMpCoreInfoPpiGuid = ARM_MP_CORE_INFO_PPI_GUID; +ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo }; + +EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = { + { + EFI_PEI_PPI_DESCRIPTOR_PPI, + &mArmMpCoreInfoPpiGuid, + &mMpCoreInfoPpi + } +}; + VOID ArmPlatformGetPlatformPpiList ( OUT UINTN *PpiListSize, OUT EFI_PEI_PPI_DESCRIPTOR **PpiList ) { - *PpiListSize = 0; - *PpiList = NULL; + *PpiListSize = sizeof(gPlatformPpiTable); + *PpiList = gPlatformPpiTable; } diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeiLib.c b/ArmPlatformPkg/PlatformPei/PlatformPeiLib.c index 9f5331a405..36a51137ec 100755 --- a/ArmPlatformPkg/PlatformPei/PlatformPeiLib.c +++ b/ArmPlatformPkg/PlatformPei/PlatformPeiLib.c @@ -27,8 +27,6 @@ PlatformPeim ( // Initialize the platform specific controllers ArmPlatformNormalInitialize (); - BuildCpuHob (PcdGet8 (PcdPrePiCpuMemorySize), PcdGet8 (PcdPrePiCpuIoSize)); - BuildFvHob (PcdGet32(PcdFvBaseAddress), PcdGet32(PcdFvSize)); return EFI_SUCCESS; diff --git a/ArmPlatformPkg/PrePeiCore/MainMPCore.c b/ArmPlatformPkg/PrePeiCore/MainMPCore.c index 25a11cf1bd..9547c1dd65 100644 --- a/ArmPlatformPkg/PrePeiCore/MainMPCore.c +++ b/ArmPlatformPkg/PrePeiCore/MainMPCore.c @@ -13,7 +13,9 @@ **/ #include -#include + +#include + #include #include "PrePeiCore.h" @@ -33,23 +35,63 @@ SecondaryMain ( IN UINTN MpId ) { - // Function pointer to Secondary Core entry point - VOID (*secondary_start)(VOID); - UINTN secondary_entry_addr=0; + EFI_STATUS Status; + UINTN PpiListSize; + UINTN PpiListCount; + EFI_PEI_PPI_DESCRIPTOR *PpiList; + ARM_MP_CORE_INFO_PPI *ArmMpCoreInfoPpi; + UINTN Index; + UINTN ArmCoreCount; + ARM_CORE_INFO *ArmCoreInfoTable; + UINT32 ClusterId; + UINT32 CoreId; + VOID (*SecondaryStart)(VOID); + UINTN SecondaryEntryAddr; + + ClusterId = GET_CLUSTER_ID(MpId); + CoreId = GET_CORE_ID(MpId); + + // Get the gArmMpCoreInfoPpiGuid + PpiListSize = 0; + ArmPlatformGetPlatformPpiList (&PpiListSize, &PpiList); + PpiListCount = PpiListSize / sizeof(EFI_PEI_PPI_DESCRIPTOR); + for (Index = 0; Index < PpiListCount; Index++, PpiList++) { + if (CompareGuid (PpiList->Guid, &gArmMpCoreInfoPpiGuid) == TRUE) { + break; + } + } + + // On MP Core Platform we must implement the ARM MP Core Info PPI + ASSERT (Index != PpiListCount); + + ArmMpCoreInfoPpi = PpiList->Ppi; + ArmCoreCount = 0; + Status = ArmMpCoreInfoPpi->GetMpCoreInfo (&ArmCoreCount, &ArmCoreInfoTable); + ASSERT_EFI_ERROR (Status); + + // Find the core in the ArmCoreTable + for (Index = 0; Index < ArmCoreCount; Index++) { + if ((ArmCoreInfoTable[Index].ClusterId == ClusterId) && (ArmCoreInfoTable[Index].CoreId == CoreId)) { + break; + } + } + + // The ARM Core Info Table must define every core + ASSERT (Index != ArmCoreCount); // Clear Secondary cores MailBox - ArmClearMPCoreMailbox(); + MmioWrite32 (ArmCoreInfoTable[Index].MailboxClearAddress, ArmCoreInfoTable[Index].MailboxClearValue); - while (secondary_entry_addr = ArmGetMPCoreMailbox(), secondary_entry_addr == 0) { - ArmCallWFI(); + SecondaryEntryAddr = 0; + while (SecondaryEntryAddr = MmioRead32 (ArmCoreInfoTable[Index].MailboxGetAddress), SecondaryEntryAddr == 0) { + ArmCallWFI (); // Acknowledge the interrupt and send End of Interrupt signal. ArmGicAcknowledgeSgiFrom (PcdGet32(PcdGicInterruptInterfaceBase), PRIMARY_CORE_ID); } - secondary_start = (VOID (*)())secondary_entry_addr; - // Jump to secondary core entry point. - secondary_start(); + SecondaryStart = (VOID (*)())SecondaryEntryAddr; + SecondaryStart(); // The secondaries shouldn't reach here ASSERT(FALSE); diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf b/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf index d019e60369..692a617ce2 100644 --- a/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf @@ -51,6 +51,7 @@ [Ppis] gEfiTemporaryRamSupportPpiGuid gArmGlobalVariablePpiGuid + gArmMpCoreInfoPpiGuid [FeaturePcd] gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores diff --git a/ArmPlatformPkg/PrePi/PrePi.c b/ArmPlatformPkg/PrePi/PrePi.c index 9fd1a27085..8eab7645a5 100755 --- a/ArmPlatformPkg/PrePi/PrePi.c +++ b/ArmPlatformPkg/PrePi/PrePi.c @@ -131,6 +131,9 @@ PrePiMain ( // Declare the Global Variable HOB BuildGlobalVariableHob (GlobalVariableBase, FixedPcdGet32 (PcdPeiGlobalVariableSize)); + //TODO: Call CpuPei as a library + BuildCpuHob (PcdGet8 (PcdPrePiCpuMemorySize), PcdGet8 (PcdPrePiCpuIoSize)); + // Set the Boot Mode SetBootMode (ArmPlatformGetBootMode ()); -- 2.39.2