@@ -86,5 +86,4 @@
gAmdStyxTokenSpaceGuid.PcdPsciOsSupport
gAmdStyxTokenSpaceGuid.PcdTrustedFWSupport
gAmdStyxTokenSpaceGuid.PcdParkingProtocolVersion
- gAmdStyxTokenSpaceGuid.PcdParkingProtocolBase
@@ -52,11 +52,11 @@
#endif
#define PARKING_PROTOCOL_VERSION (FixedPcdGet32 (PcdParkingProtocolVersion))
-#define PARKED_BASE_ADDRESS (FixedPcdGet64 (PcdParkingProtocolBase))
#define PARKED_OFFSET ( 4096 )
#define CORES_PER_CLUSTER (FixedPcdGet32 (PcdSocCoresPerCluster))
-#define PARKED_ADDRESS(ClusterId, CoreId) (PARKED_BASE_ADDRESS + (CORES_PER_CLUSTER * ClusterId + CoreId) * PARKED_OFFSET)
+#define PARKED_ADDRESS(Base, ClusterId, CoreId) \
+ ((Base) + (CORES_PER_CLUSTER * ClusterId + CoreId) * PARKED_OFFSET)
/* Macro to populate EFI_ACPI_5_1_GIC_STRUCTURE */
@@ -69,7 +69,7 @@
EFI_ACPI_5_1_GIC_ENABLED, /* UINT32 Flags */ \
PARKING_PROTOCOL_VERSION, /* UINT32 ParkingProtocolVersion */ \
PerfInt, /* UINT32 PerformanceInterruptGsiv */ \
- PARKED_ADDRESS(ClusterId, CoreId), /* UINT64 ParkedAddress */ \
+ 0, /* UINT64 ParkedAddress */ \
GIC_BASE, /* UINT64 PhysicalBaseAddress */ \
GICV_BASE, /* UINT64 GICV */ \
GICH_BASE, /* UINT64 GICH */ \
@@ -188,7 +188,8 @@ BuildGicC (
EFI_ACPI_5_1_GIC_STRUCTURE *GicC,
UINT32 CpuNum,
UINT32 ClusterId,
- UINT32 CoreId
+ UINT32 CoreId,
+ EFI_PHYSICAL_ADDRESS MpParkingBase
)
{
UINT32 MpId, PmuSpi;
@@ -206,7 +207,7 @@ BuildGicC (
GicC->AcpiProcessorUid = MpId;
GicC->Flags = EFI_ACPI_5_1_GIC_ENABLED;
GicC->ParkingProtocolVersion = PARKING_PROTOCOL_VERSION;
- GicC->ParkedAddress = PARKED_ADDRESS(ClusterId, CoreId);
+ GicC->ParkedAddress = PARKED_ADDRESS(MpParkingBase, ClusterId, CoreId);
GicC->PhysicalBaseAddress = GIC_BASE;
GicC->GICV = GICV_BASE;
GicC->GICH = GICH_BASE;
@@ -265,7 +266,7 @@ BuildGicM (
EFI_ACPI_DESCRIPTION_HEADER *
MadtHeader (
- VOID
+ UINT64 MpParkingBase
)
{
EFI_ACPI_5_1_GIC_STRUCTURE *GicC;
@@ -292,7 +293,8 @@ MadtHeader (
Status = BuildGicC (GicC, CpuNum,
ArmCoreInfoTable[CpuNum].ClusterId,
- ArmCoreInfoTable[CpuNum].CoreId
+ ArmCoreInfoTable[CpuNum].CoreId,
+ MpParkingBase
);
ASSERT_EFI_ERROR (Status);
@@ -108,8 +108,7 @@
# UEFI entry point
gAmdStyxTokenSpaceGuid.PcdUefiEntryAddress|0x8000E80000|UINT64|0x000a0000
- # Parking Protocol (re-use 32K at start of DRAM)
+ # Parking Protocol
gAmdStyxTokenSpaceGuid.PcdParkingProtocolVersion|1|UINT32|0x000b0000
- gAmdStyxTokenSpaceGuid.PcdParkingProtocolBase|0x8000E80000|UINT64|0x000b0001
gAmdStyxTokenSpaceGuid.PcdParkingProtocolSize|0x0000008000|UINT64|0x000b0002
@@ -26,7 +26,7 @@
EFI_ACPI_DESCRIPTION_HEADER *FadtTable (void);
EFI_ACPI_DESCRIPTION_HEADER *FacsTable (void);
-EFI_ACPI_DESCRIPTION_HEADER *MadtHeader (void);
+EFI_ACPI_DESCRIPTION_HEADER *MadtHeader (UINT64 MpParkingBase);
EFI_ACPI_DESCRIPTION_HEADER *GtdtHeader (void);
EFI_ACPI_DESCRIPTION_HEADER *DsdtHeader (void);
EFI_ACPI_DESCRIPTION_HEADER *McfgHeader (void);
@@ -55,11 +55,21 @@ AcpiPlatformEntryPoint (
EFI_ACPI_TABLE_PROTOCOL *AcpiTable;
UINTN TableHandle;
UINTN TableIndex;
+ EFI_PHYSICAL_ADDRESS MpParkingBase;
// Move secondary cores to a Pen compliant with MP-Parking protocol
if (!FixedPcdGetBool (PcdPsciOsSupport) &&
FixedPcdGetBool (PcdTrustedFWSupport)) {
- AmdStyxParkSecondaryCores();
+
+ // Allocate Parking area (4KB-aligned, 4KB per core) as Reserved memory
+ Status = gBS->AllocatePages (AllocateAnyPages, EfiReservedMemoryType,
+ EFI_SIZE_TO_PAGES (FixedPcdGet64 (PcdParkingProtocolSize)),
+ &MpParkingBase);
+ ASSERT_EFI_ERROR (Status);
+
+ AmdStyxParkSecondaryCores(MpParkingBase);
+ } else {
+ MpParkingBase = 0;
}
ZeroMem(AcpiTableList, sizeof(AcpiTableList));
@@ -67,7 +77,7 @@ AcpiPlatformEntryPoint (
TableIndex = 0;
AcpiTableList[TableIndex++] = FadtTable();
AcpiTableList[TableIndex++] = DsdtHeader();
- AcpiTableList[TableIndex++] = MadtHeader();
+ AcpiTableList[TableIndex++] = MadtHeader(MpParkingBase);
AcpiTableList[TableIndex++] = GtdtHeader();
AcpiTableList[TableIndex++] = Dbg2Header();
AcpiTableList[TableIndex++] = SpcrHeader();
@@ -54,7 +54,6 @@
[FixedPcd]
gAmdStyxTokenSpaceGuid.PcdParkingProtocolVersion
- gAmdStyxTokenSpaceGuid.PcdParkingProtocolBase
gAmdStyxTokenSpaceGuid.PcdParkingProtocolSize
gAmdStyxTokenSpaceGuid.PcdPsciOsSupport
gAmdStyxTokenSpaceGuid.PcdTrustedFWSupport
@@ -69,11 +69,9 @@ AmdStyxBringupSecondary (
VOID
EFIAPI
AmdStyxParkSecondaryCores (
- VOID
+ EFI_PHYSICAL_ADDRESS MpParkingBase
)
{
- EFI_STATUS Status;
- EFI_PHYSICAL_ADDRESS MpParkingBase;
UINTN MpParkingSize;
EFI_PHYSICAL_ADDRESS PenBase;
UINTN PenSize;
@@ -88,9 +86,6 @@ AmdStyxParkSecondaryCores (
ArmCoreInfoTable = AmdStyxGetArmCoreInfoTable (&ArmCoreCount);
ASSERT (ArmCoreInfoTable != NULL);
- // Get Parking area (4KB-aligned, 4KB per core)
- MpParkingBase = FixedPcdGet64 (PcdParkingProtocolBase);
- ASSERT ((MpParkingBase & (SIZE_4KB - 1)) == 0);
MpParkingSize = ArmCoreCount * SIZE_4KB;
ASSERT (MpParkingSize <= FixedPcdGet64 (PcdParkingProtocolSize));
@@ -102,11 +97,6 @@ AmdStyxParkSecondaryCores (
PenBase = (EFI_PHYSICAL_ADDRESS)((UINTN)MpParkingBase + SIZE_2KB + sizeof(UINT64));
PenSize = (UINTN)&SecondariesPenEnd - (UINTN)&SecondariesPenStart;
- // Reserve the memory as RuntimeServices
- Status = gBS->AllocatePages (AllocateAddress, EfiRuntimeServicesCode,
- EFI_SIZE_TO_PAGES (MpParkingSize ), &MpParkingBase );
- ASSERT_EFI_ERROR (Status);
-
// Relocate the Pen code
CopyMem ((VOID*)(PenBase), (VOID*)&SecondariesPenStart, PenSize);
@@ -15,5 +15,5 @@
VOID
EFIAPI
AmdStyxParkSecondaryCores (
- VOID
+ EFI_PHYSICAL_ADDRESS MpParkingBase
);
Now that the ACPI parking protocol pen is allocated in the same module that populates the MADT table, we can simply use a dynamic allocation rather than using an a priori fixed address. This is better for two reasons: - the static allocation could potentially be occupied by the time we try to allocate it, - it allows the DXE core to group the allocation with other allocations of the same type, which reduces memory map fragmentation. Also change the type of the allocation to reserved memory. Otherwise, it will be mapped cacheable during UEFI Runtime Service invocations by the OS, which conflicts with the uncached mappings mandated by the ACPI parking protocol. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- Platforms/AMD/Styx/AcpiTables/AcpiTables.inf | 1 - Platforms/AMD/Styx/AcpiTables/Madt.c | 16 +++++++++------- Platforms/AMD/Styx/AmdStyx.dec | 3 +-- Platforms/AMD/Styx/Common/AmdStyxAcpiLib.h | 2 +- Platforms/AMD/Styx/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 14 ++++++++++++-- Platforms/AMD/Styx/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf | 1 - Platforms/AMD/Styx/Drivers/AcpiPlatformDxe/AcpiPlatformParkingProtocol.c | 12 +----------- Platforms/AMD/Styx/Drivers/AcpiPlatformDxe/AcpiPlatformParkingProtocol.h | 2 +- 8 files changed, 25 insertions(+), 26 deletions(-)