mirror of https://github.com/acidanthera/audk.git
DynamicTablesPkg: Add ACPI 6.3 SPE support to MADT generator
The Dynamic Tables Framework now supports generating Multiple APIC Description Table (MADT) revision 5 for ARM platforms while maintaining backward-compatibility with ACPI 6.2. The relevant change is the enablement of the Statistical Profiling Extension (SPE). Signed-off-by: Krzysztof Koch <krzysztof.koch@arm.com> Reviewed-by: Alexei Fedorov <Alexei.Fedorov@arm.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
This commit is contained in:
parent
ccc97f6df4
commit
5506701f79
|
@ -155,6 +155,13 @@ typedef struct CmArmGicCInfo {
|
|||
ACPI Specification.
|
||||
*/
|
||||
UINT8 ProcessorPowerEfficiencyClass;
|
||||
|
||||
/** Statistical Profiling Extension buffer overflow GSIV. Zero if
|
||||
unsupported by this processor. This field was introduced in
|
||||
ACPI 6.3 (MADT revision 5) and is therefore ignored when
|
||||
generating MADT revision 4 or lower.
|
||||
*/
|
||||
UINT16 SpeOverflowInterrupt;
|
||||
} CM_ARM_GICC_INFO;
|
||||
|
||||
/** A structure that describes the
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
@par Reference(s):
|
||||
- ACPI 6.2 Specification - Errata A, September 2017
|
||||
- ACPI 6.3 Specification - January 2019
|
||||
|
||||
**/
|
||||
|
||||
|
@ -82,25 +82,27 @@ GET_OBJECT_LIST (
|
|||
);
|
||||
|
||||
/** This function updates the GIC CPU Interface Information in the
|
||||
EFI_ACPI_6_2_GIC_STRUCTURE structure.
|
||||
EFI_ACPI_6_3_GIC_STRUCTURE structure.
|
||||
|
||||
@param [in] Gicc Pointer to GIC CPU Interface structure.
|
||||
@param [in] GicCInfo Pointer to the GIC CPU Interface Information.
|
||||
@param [in] Gicc Pointer to GIC CPU Interface structure.
|
||||
@param [in] GicCInfo Pointer to the GIC CPU Interface Information.
|
||||
@param [in] MadtRev MADT table revision.
|
||||
**/
|
||||
STATIC
|
||||
VOID
|
||||
AddGICC (
|
||||
IN EFI_ACPI_6_2_GIC_STRUCTURE * CONST Gicc,
|
||||
IN CONST CM_ARM_GICC_INFO * CONST GicCInfo
|
||||
IN EFI_ACPI_6_3_GIC_STRUCTURE * CONST Gicc,
|
||||
IN CONST CM_ARM_GICC_INFO * CONST GicCInfo,
|
||||
IN CONST UINT8 MadtRev
|
||||
)
|
||||
{
|
||||
ASSERT (Gicc != NULL);
|
||||
ASSERT (GicCInfo != NULL);
|
||||
|
||||
// UINT8 Type
|
||||
Gicc->Type = EFI_ACPI_6_2_GIC;
|
||||
Gicc->Type = EFI_ACPI_6_3_GIC;
|
||||
// UINT8 Length
|
||||
Gicc->Length = sizeof (EFI_ACPI_6_2_GIC_STRUCTURE);
|
||||
Gicc->Length = sizeof (EFI_ACPI_6_3_GIC_STRUCTURE);
|
||||
// UINT16 Reserved
|
||||
Gicc->Reserved = EFI_ACPI_RESERVED_WORD;
|
||||
|
||||
|
@ -134,10 +136,18 @@ AddGICC (
|
|||
// UINT8 ProcessorPowerEfficiencyClass
|
||||
Gicc->ProcessorPowerEfficiencyClass =
|
||||
GicCInfo->ProcessorPowerEfficiencyClass;
|
||||
// UINT8 Reserved2[3]
|
||||
Gicc->Reserved2[0] = EFI_ACPI_RESERVED_BYTE;
|
||||
Gicc->Reserved2[1] = EFI_ACPI_RESERVED_BYTE;
|
||||
Gicc->Reserved2[2] = EFI_ACPI_RESERVED_BYTE;
|
||||
// UINT8 Reserved2
|
||||
Gicc->Reserved2 = EFI_ACPI_RESERVED_BYTE;
|
||||
|
||||
// UINT16 SpeOverflowInterrupt
|
||||
if (MadtRev > EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION) {
|
||||
Gicc->SpeOverflowInterrupt = GicCInfo->SpeOverflowInterrupt;
|
||||
} else {
|
||||
// Setting SpeOverflowInterrupt to 0 ensures backward compatibility with
|
||||
// ACPI 6.2 by also clearing the Reserved2[1] and Reserved2[2] fields
|
||||
// in EFI_ACPI_6_2_GIC_STRUCTURE.
|
||||
Gicc->SpeOverflowInterrupt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -193,6 +203,7 @@ IsAcpiUidEqual (
|
|||
@param [in] Gicc Pointer to GIC CPU Interface structure list.
|
||||
@param [in] GicCInfo Pointer to the GIC CPU Information list.
|
||||
@param [in] GicCCount Count of GIC CPU Interfaces.
|
||||
@param [in] MadtRev MADT table revision.
|
||||
|
||||
@retval EFI_SUCCESS GIC CPU Interface Information was added
|
||||
successfully.
|
||||
|
@ -203,9 +214,10 @@ IsAcpiUidEqual (
|
|||
STATIC
|
||||
EFI_STATUS
|
||||
AddGICCList (
|
||||
IN EFI_ACPI_6_2_GIC_STRUCTURE * Gicc,
|
||||
IN EFI_ACPI_6_3_GIC_STRUCTURE * Gicc,
|
||||
IN CONST CM_ARM_GICC_INFO * GicCInfo,
|
||||
IN UINT32 GicCCount
|
||||
IN UINT32 GicCCount,
|
||||
IN CONST UINT8 MadtRev
|
||||
)
|
||||
{
|
||||
BOOLEAN IsAcpiProcUidDuplicated;
|
||||
|
@ -226,7 +238,7 @@ AddGICCList (
|
|||
}
|
||||
|
||||
while (GicCCount-- != 0) {
|
||||
AddGICC (Gicc++, GicCInfo++);
|
||||
AddGICC (Gicc++, GicCInfo++, MadtRev);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
@ -240,7 +252,7 @@ AddGICCList (
|
|||
STATIC
|
||||
VOID
|
||||
AddGICD (
|
||||
EFI_ACPI_6_2_GIC_DISTRIBUTOR_STRUCTURE * CONST Gicd,
|
||||
EFI_ACPI_6_3_GIC_DISTRIBUTOR_STRUCTURE * CONST Gicd,
|
||||
CONST CM_ARM_GICD_INFO * CONST GicDInfo
|
||||
)
|
||||
{
|
||||
|
@ -248,9 +260,9 @@ AddGICD (
|
|||
ASSERT (GicDInfo != NULL);
|
||||
|
||||
// UINT8 Type
|
||||
Gicd->Type = EFI_ACPI_6_2_GICD;
|
||||
Gicd->Type = EFI_ACPI_6_3_GICD;
|
||||
// UINT8 Length
|
||||
Gicd->Length = sizeof (EFI_ACPI_6_2_GIC_DISTRIBUTOR_STRUCTURE);
|
||||
Gicd->Length = sizeof (EFI_ACPI_6_3_GIC_DISTRIBUTOR_STRUCTURE);
|
||||
// UINT16 Reserved
|
||||
Gicd->Reserved1 = EFI_ACPI_RESERVED_WORD;
|
||||
// UINT32 Identifier
|
||||
|
@ -277,15 +289,15 @@ AddGICD (
|
|||
STATIC
|
||||
VOID
|
||||
AddGICMsiFrame (
|
||||
IN EFI_ACPI_6_2_GIC_MSI_FRAME_STRUCTURE * CONST GicMsiFrame,
|
||||
IN EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE * CONST GicMsiFrame,
|
||||
IN CONST CM_ARM_GIC_MSI_FRAME_INFO * CONST GicMsiFrameInfo
|
||||
)
|
||||
{
|
||||
ASSERT (GicMsiFrame != NULL);
|
||||
ASSERT (GicMsiFrameInfo != NULL);
|
||||
|
||||
GicMsiFrame->Type = EFI_ACPI_6_2_GIC_MSI_FRAME;
|
||||
GicMsiFrame->Length = sizeof (EFI_ACPI_6_2_GIC_MSI_FRAME_STRUCTURE);
|
||||
GicMsiFrame->Type = EFI_ACPI_6_3_GIC_MSI_FRAME;
|
||||
GicMsiFrame->Length = sizeof (EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE);
|
||||
GicMsiFrame->Reserved1 = EFI_ACPI_RESERVED_WORD;
|
||||
GicMsiFrame->GicMsiFrameId = GicMsiFrameInfo->GicMsiFrameId;
|
||||
GicMsiFrame->PhysicalBaseAddress = GicMsiFrameInfo->PhysicalBaseAddress;
|
||||
|
@ -304,7 +316,7 @@ AddGICMsiFrame (
|
|||
STATIC
|
||||
VOID
|
||||
AddGICMsiFrameInfoList (
|
||||
IN EFI_ACPI_6_2_GIC_MSI_FRAME_STRUCTURE * GicMsiFrame,
|
||||
IN EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE * GicMsiFrame,
|
||||
IN CONST CM_ARM_GIC_MSI_FRAME_INFO * GicMsiFrameInfo,
|
||||
IN UINT32 GicMsiFrameCount
|
||||
)
|
||||
|
@ -325,15 +337,15 @@ AddGICMsiFrameInfoList (
|
|||
STATIC
|
||||
VOID
|
||||
AddGICRedistributor (
|
||||
IN EFI_ACPI_6_2_GICR_STRUCTURE * CONST Gicr,
|
||||
IN EFI_ACPI_6_3_GICR_STRUCTURE * CONST Gicr,
|
||||
IN CONST CM_ARM_GIC_REDIST_INFO * CONST GicRedisributorInfo
|
||||
)
|
||||
{
|
||||
ASSERT (Gicr != NULL);
|
||||
ASSERT (GicRedisributorInfo != NULL);
|
||||
|
||||
Gicr->Type = EFI_ACPI_6_2_GICR;
|
||||
Gicr->Length = sizeof (EFI_ACPI_6_2_GICR_STRUCTURE);
|
||||
Gicr->Type = EFI_ACPI_6_3_GICR;
|
||||
Gicr->Length = sizeof (EFI_ACPI_6_3_GICR_STRUCTURE);
|
||||
Gicr->Reserved = EFI_ACPI_RESERVED_WORD;
|
||||
Gicr->DiscoveryRangeBaseAddress =
|
||||
GicRedisributorInfo->DiscoveryRangeBaseAddress;
|
||||
|
@ -349,7 +361,7 @@ AddGICRedistributor (
|
|||
STATIC
|
||||
VOID
|
||||
AddGICRedistributorList (
|
||||
IN EFI_ACPI_6_2_GICR_STRUCTURE * Gicr,
|
||||
IN EFI_ACPI_6_3_GICR_STRUCTURE * Gicr,
|
||||
IN CONST CM_ARM_GIC_REDIST_INFO * GicRInfo,
|
||||
IN UINT32 GicRCount
|
||||
)
|
||||
|
@ -370,15 +382,15 @@ AddGICRedistributorList (
|
|||
STATIC
|
||||
VOID
|
||||
AddGICInterruptTranslationService (
|
||||
IN EFI_ACPI_6_2_GIC_ITS_STRUCTURE * CONST GicIts,
|
||||
IN EFI_ACPI_6_3_GIC_ITS_STRUCTURE * CONST GicIts,
|
||||
IN CONST CM_ARM_GIC_ITS_INFO * CONST GicItsInfo
|
||||
)
|
||||
{
|
||||
ASSERT (GicIts != NULL);
|
||||
ASSERT (GicItsInfo != NULL);
|
||||
|
||||
GicIts->Type = EFI_ACPI_6_2_GIC_ITS;
|
||||
GicIts->Length = sizeof (EFI_ACPI_6_2_GIC_ITS_STRUCTURE);
|
||||
GicIts->Type = EFI_ACPI_6_3_GIC_ITS;
|
||||
GicIts->Length = sizeof (EFI_ACPI_6_3_GIC_ITS_STRUCTURE);
|
||||
GicIts->Reserved = EFI_ACPI_RESERVED_WORD;
|
||||
GicIts->GicItsId = GicItsInfo->GicItsId;
|
||||
GicIts->PhysicalBaseAddress = GicItsInfo->PhysicalBaseAddress;
|
||||
|
@ -395,7 +407,7 @@ AddGICInterruptTranslationService (
|
|||
STATIC
|
||||
VOID
|
||||
AddGICItsList (
|
||||
IN EFI_ACPI_6_2_GIC_ITS_STRUCTURE * GicIts,
|
||||
IN EFI_ACPI_6_3_GIC_ITS_STRUCTURE * GicIts,
|
||||
IN CONST CM_ARM_GIC_ITS_INFO * GicItsInfo,
|
||||
IN UINT32 GicItsCount
|
||||
)
|
||||
|
@ -458,7 +470,7 @@ BuildMadtTable (
|
|||
UINT32 GicRedistOffset;
|
||||
UINT32 GicItsOffset;
|
||||
|
||||
EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER * Madt;
|
||||
EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER * Madt;
|
||||
|
||||
ASSERT (This != NULL);
|
||||
ASSERT (AcpiTableInfo != NULL);
|
||||
|
@ -589,22 +601,22 @@ BuildMadtTable (
|
|||
goto error_handler;
|
||||
}
|
||||
|
||||
TableSize = sizeof (EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER);
|
||||
TableSize = sizeof (EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER);
|
||||
|
||||
GicCOffset = TableSize;
|
||||
TableSize += (sizeof (EFI_ACPI_6_2_GIC_STRUCTURE) * GicCCount);
|
||||
TableSize += (sizeof (EFI_ACPI_6_3_GIC_STRUCTURE) * GicCCount);
|
||||
|
||||
GicDOffset = TableSize;
|
||||
TableSize += (sizeof (EFI_ACPI_6_2_GIC_DISTRIBUTOR_STRUCTURE) * GicDCount);
|
||||
TableSize += (sizeof (EFI_ACPI_6_3_GIC_DISTRIBUTOR_STRUCTURE) * GicDCount);
|
||||
|
||||
GicMSIOffset = TableSize;
|
||||
TableSize += (sizeof (EFI_ACPI_6_2_GIC_MSI_FRAME_STRUCTURE) * GicMSICount);
|
||||
TableSize += (sizeof (EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE) * GicMSICount);
|
||||
|
||||
GicRedistOffset = TableSize;
|
||||
TableSize += (sizeof (EFI_ACPI_6_2_GICR_STRUCTURE) * GicRedistCount);
|
||||
TableSize += (sizeof (EFI_ACPI_6_3_GICR_STRUCTURE) * GicRedistCount);
|
||||
|
||||
GicItsOffset = TableSize;
|
||||
TableSize += (sizeof (EFI_ACPI_6_2_GIC_ITS_STRUCTURE) * GicItsCount);
|
||||
TableSize += (sizeof (EFI_ACPI_6_3_GIC_ITS_STRUCTURE) * GicItsCount);
|
||||
|
||||
// Allocate the Buffer for MADT table
|
||||
*Table = (EFI_ACPI_DESCRIPTION_HEADER*)AllocateZeroPool (TableSize);
|
||||
|
@ -620,7 +632,7 @@ BuildMadtTable (
|
|||
goto error_handler;
|
||||
}
|
||||
|
||||
Madt = (EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER*)*Table;
|
||||
Madt = (EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER*)*Table;
|
||||
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
|
@ -646,9 +658,10 @@ BuildMadtTable (
|
|||
}
|
||||
|
||||
Status = AddGICCList (
|
||||
(EFI_ACPI_6_2_GIC_STRUCTURE*)((UINT8*)Madt + GicCOffset),
|
||||
(EFI_ACPI_6_3_GIC_STRUCTURE*)((UINT8*)Madt + GicCOffset),
|
||||
GicCInfo,
|
||||
GicCCount
|
||||
GicCCount,
|
||||
Madt->Header.Revision
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((
|
||||
|
@ -660,13 +673,13 @@ BuildMadtTable (
|
|||
}
|
||||
|
||||
AddGICD (
|
||||
(EFI_ACPI_6_2_GIC_DISTRIBUTOR_STRUCTURE*)((UINT8*)Madt + GicDOffset),
|
||||
(EFI_ACPI_6_3_GIC_DISTRIBUTOR_STRUCTURE*)((UINT8*)Madt + GicDOffset),
|
||||
GicDInfo
|
||||
);
|
||||
|
||||
if (GicMSICount != 0) {
|
||||
AddGICMsiFrameInfoList (
|
||||
(EFI_ACPI_6_2_GIC_MSI_FRAME_STRUCTURE*)((UINT8*)Madt + GicMSIOffset),
|
||||
(EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE*)((UINT8*)Madt + GicMSIOffset),
|
||||
GicMSIInfo,
|
||||
GicMSICount
|
||||
);
|
||||
|
@ -674,7 +687,7 @@ BuildMadtTable (
|
|||
|
||||
if (GicRedistCount != 0) {
|
||||
AddGICRedistributorList (
|
||||
(EFI_ACPI_6_2_GICR_STRUCTURE*)((UINT8*)Madt + GicRedistOffset),
|
||||
(EFI_ACPI_6_3_GICR_STRUCTURE*)((UINT8*)Madt + GicRedistOffset),
|
||||
GicRedistInfo,
|
||||
GicRedistCount
|
||||
);
|
||||
|
@ -682,7 +695,7 @@ BuildMadtTable (
|
|||
|
||||
if (GicItsCount != 0) {
|
||||
AddGICItsList (
|
||||
(EFI_ACPI_6_2_GIC_ITS_STRUCTURE*)((UINT8*)Madt + GicItsOffset),
|
||||
(EFI_ACPI_6_3_GIC_ITS_STRUCTURE*)((UINT8*)Madt + GicItsOffset),
|
||||
GicItsInfo,
|
||||
GicItsCount
|
||||
);
|
||||
|
@ -749,9 +762,9 @@ ACPI_TABLE_GENERATOR MadtGenerator = {
|
|||
// Generator Description
|
||||
L"ACPI.STD.MADT.GENERATOR",
|
||||
// ACPI Table Signature
|
||||
EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
|
||||
EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
|
||||
// ACPI Table Revision supported by this Generator
|
||||
EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
|
||||
EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
|
||||
// Minimum supported ACPI Table Revision
|
||||
EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
|
||||
// Creator ID
|
||||
|
|
Loading…
Reference in New Issue