DynamicTablesPkg: Update MADT generator for ACPI 6.5

The ACPI 6.5 specification updates the MADT table to add
a new field to GICC for specifying the TRBE interrupt and
also adds support for Online Capable flag to the GICC flags.

The Online Capable flags should be passed transparently
through as specified in the CM_ARM_GICC_INFO.Flags field
and only require the MADT table revision to be setup to
6 to reflect the ACPI 6.5 specification.

The TRBE field needs to be appropriately setup in the
GICC structure.

Therefore, update the MADT generator to reflect the
above updates required for supporting ACPI 6.5

Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
Reviewed-by: Pierre Gondois <pierre.gondois@arm.com>
This commit is contained in:
Sami Mujawar 2023-09-22 15:35:08 +01:00 committed by mergify[bot]
parent cf62548a35
commit 36e9f3d08a
1 changed files with 42 additions and 37 deletions

View File

@ -1,11 +1,11 @@
/** @file /** @file
MADT Table Generator MADT Table Generator
Copyright (c) 2017 - 2020, ARM Limited. All rights reserved. Copyright (c) 2017 - 2023, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
@par Reference(s): @par Reference(s):
- ACPI 6.3 Specification - January 2019 - ACPI 6.5 Specification - Aug 29, 2022
**/ **/
@ -82,7 +82,7 @@ GET_OBJECT_LIST (
); );
/** This function updates the GIC CPU Interface Information in the /** This function updates the GIC CPU Interface Information in the
EFI_ACPI_6_3_GIC_STRUCTURE structure. EFI_ACPI_6_5_GIC_STRUCTURE structure.
@param [in] Gicc Pointer to GIC CPU Interface structure. @param [in] Gicc Pointer to GIC CPU Interface structure.
@param [in] GicCInfo Pointer to the GIC CPU Interface Information. @param [in] GicCInfo Pointer to the GIC CPU Interface Information.
@ -91,7 +91,7 @@ GET_OBJECT_LIST (
STATIC STATIC
VOID VOID
AddGICC ( AddGICC (
IN EFI_ACPI_6_3_GIC_STRUCTURE *CONST Gicc, IN EFI_ACPI_6_5_GIC_STRUCTURE *CONST Gicc,
IN CONST CM_ARM_GICC_INFO *CONST GicCInfo, IN CONST CM_ARM_GICC_INFO *CONST GicCInfo,
IN CONST UINT8 MadtRev IN CONST UINT8 MadtRev
) )
@ -100,9 +100,9 @@ AddGICC (
ASSERT (GicCInfo != NULL); ASSERT (GicCInfo != NULL);
// UINT8 Type // UINT8 Type
Gicc->Type = EFI_ACPI_6_3_GIC; Gicc->Type = EFI_ACPI_6_5_GIC;
// UINT8 Length // UINT8 Length
Gicc->Length = sizeof (EFI_ACPI_6_3_GIC_STRUCTURE); Gicc->Length = sizeof (EFI_ACPI_6_5_GIC_STRUCTURE);
// UINT16 Reserved // UINT16 Reserved
Gicc->Reserved = EFI_ACPI_RESERVED_WORD; Gicc->Reserved = EFI_ACPI_RESERVED_WORD;
@ -148,6 +148,11 @@ AddGICC (
// in EFI_ACPI_6_2_GIC_STRUCTURE. // in EFI_ACPI_6_2_GIC_STRUCTURE.
Gicc->SpeOverflowInterrupt = 0; Gicc->SpeOverflowInterrupt = 0;
} }
// UINT16 TrbeInterrupt
if (MadtRev > EFI_ACPI_6_4_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION) {
Gicc->TrbeInterrupt = GicCInfo->TrbeInterrupt;
}
} }
/** /**
@ -214,7 +219,7 @@ IsAcpiUidEqual (
STATIC STATIC
EFI_STATUS EFI_STATUS
AddGICCList ( AddGICCList (
IN EFI_ACPI_6_3_GIC_STRUCTURE *Gicc, IN EFI_ACPI_6_5_GIC_STRUCTURE *Gicc,
IN CONST CM_ARM_GICC_INFO *GicCInfo, IN CONST CM_ARM_GICC_INFO *GicCInfo,
IN UINT32 GicCCount, IN UINT32 GicCCount,
IN CONST UINT8 MadtRev IN CONST UINT8 MadtRev
@ -252,7 +257,7 @@ AddGICCList (
STATIC STATIC
VOID VOID
AddGICD ( AddGICD (
EFI_ACPI_6_3_GIC_DISTRIBUTOR_STRUCTURE *CONST Gicd, EFI_ACPI_6_5_GIC_DISTRIBUTOR_STRUCTURE *CONST Gicd,
CONST CM_ARM_GICD_INFO *CONST GicDInfo CONST CM_ARM_GICD_INFO *CONST GicDInfo
) )
{ {
@ -260,9 +265,9 @@ AddGICD (
ASSERT (GicDInfo != NULL); ASSERT (GicDInfo != NULL);
// UINT8 Type // UINT8 Type
Gicd->Type = EFI_ACPI_6_3_GICD; Gicd->Type = EFI_ACPI_6_5_GICD;
// UINT8 Length // UINT8 Length
Gicd->Length = sizeof (EFI_ACPI_6_3_GIC_DISTRIBUTOR_STRUCTURE); Gicd->Length = sizeof (EFI_ACPI_6_5_GIC_DISTRIBUTOR_STRUCTURE);
// UINT16 Reserved // UINT16 Reserved
Gicd->Reserved1 = EFI_ACPI_RESERVED_WORD; Gicd->Reserved1 = EFI_ACPI_RESERVED_WORD;
// UINT32 Identifier // UINT32 Identifier
@ -289,15 +294,15 @@ AddGICD (
STATIC STATIC
VOID VOID
AddGICMsiFrame ( AddGICMsiFrame (
IN EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE *CONST GicMsiFrame, IN EFI_ACPI_6_5_GIC_MSI_FRAME_STRUCTURE *CONST GicMsiFrame,
IN CONST CM_ARM_GIC_MSI_FRAME_INFO *CONST GicMsiFrameInfo IN CONST CM_ARM_GIC_MSI_FRAME_INFO *CONST GicMsiFrameInfo
) )
{ {
ASSERT (GicMsiFrame != NULL); ASSERT (GicMsiFrame != NULL);
ASSERT (GicMsiFrameInfo != NULL); ASSERT (GicMsiFrameInfo != NULL);
GicMsiFrame->Type = EFI_ACPI_6_3_GIC_MSI_FRAME; GicMsiFrame->Type = EFI_ACPI_6_5_GIC_MSI_FRAME;
GicMsiFrame->Length = sizeof (EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE); GicMsiFrame->Length = sizeof (EFI_ACPI_6_5_GIC_MSI_FRAME_STRUCTURE);
GicMsiFrame->Reserved1 = EFI_ACPI_RESERVED_WORD; GicMsiFrame->Reserved1 = EFI_ACPI_RESERVED_WORD;
GicMsiFrame->GicMsiFrameId = GicMsiFrameInfo->GicMsiFrameId; GicMsiFrame->GicMsiFrameId = GicMsiFrameInfo->GicMsiFrameId;
GicMsiFrame->PhysicalBaseAddress = GicMsiFrameInfo->PhysicalBaseAddress; GicMsiFrame->PhysicalBaseAddress = GicMsiFrameInfo->PhysicalBaseAddress;
@ -316,7 +321,7 @@ AddGICMsiFrame (
STATIC STATIC
VOID VOID
AddGICMsiFrameInfoList ( AddGICMsiFrameInfoList (
IN EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE *GicMsiFrame, IN EFI_ACPI_6_5_GIC_MSI_FRAME_STRUCTURE *GicMsiFrame,
IN CONST CM_ARM_GIC_MSI_FRAME_INFO *GicMsiFrameInfo, IN CONST CM_ARM_GIC_MSI_FRAME_INFO *GicMsiFrameInfo,
IN UINT32 GicMsiFrameCount IN UINT32 GicMsiFrameCount
) )
@ -337,15 +342,15 @@ AddGICMsiFrameInfoList (
STATIC STATIC
VOID VOID
AddGICRedistributor ( AddGICRedistributor (
IN EFI_ACPI_6_3_GICR_STRUCTURE *CONST Gicr, IN EFI_ACPI_6_5_GICR_STRUCTURE *CONST Gicr,
IN CONST CM_ARM_GIC_REDIST_INFO *CONST GicRedistributorInfo IN CONST CM_ARM_GIC_REDIST_INFO *CONST GicRedistributorInfo
) )
{ {
ASSERT (Gicr != NULL); ASSERT (Gicr != NULL);
ASSERT (GicRedistributorInfo != NULL); ASSERT (GicRedistributorInfo != NULL);
Gicr->Type = EFI_ACPI_6_3_GICR; Gicr->Type = EFI_ACPI_6_5_GICR;
Gicr->Length = sizeof (EFI_ACPI_6_3_GICR_STRUCTURE); Gicr->Length = sizeof (EFI_ACPI_6_5_GICR_STRUCTURE);
Gicr->Reserved = EFI_ACPI_RESERVED_WORD; Gicr->Reserved = EFI_ACPI_RESERVED_WORD;
Gicr->DiscoveryRangeBaseAddress = Gicr->DiscoveryRangeBaseAddress =
GicRedistributorInfo->DiscoveryRangeBaseAddress; GicRedistributorInfo->DiscoveryRangeBaseAddress;
@ -361,7 +366,7 @@ AddGICRedistributor (
STATIC STATIC
VOID VOID
AddGICRedistributorList ( AddGICRedistributorList (
IN EFI_ACPI_6_3_GICR_STRUCTURE *Gicr, IN EFI_ACPI_6_5_GICR_STRUCTURE *Gicr,
IN CONST CM_ARM_GIC_REDIST_INFO *GicRInfo, IN CONST CM_ARM_GIC_REDIST_INFO *GicRInfo,
IN UINT32 GicRCount IN UINT32 GicRCount
) )
@ -382,15 +387,15 @@ AddGICRedistributorList (
STATIC STATIC
VOID VOID
AddGICInterruptTranslationService ( AddGICInterruptTranslationService (
IN EFI_ACPI_6_3_GIC_ITS_STRUCTURE *CONST GicIts, IN EFI_ACPI_6_5_GIC_ITS_STRUCTURE *CONST GicIts,
IN CONST CM_ARM_GIC_ITS_INFO *CONST GicItsInfo IN CONST CM_ARM_GIC_ITS_INFO *CONST GicItsInfo
) )
{ {
ASSERT (GicIts != NULL); ASSERT (GicIts != NULL);
ASSERT (GicItsInfo != NULL); ASSERT (GicItsInfo != NULL);
GicIts->Type = EFI_ACPI_6_3_GIC_ITS; GicIts->Type = EFI_ACPI_6_5_GIC_ITS;
GicIts->Length = sizeof (EFI_ACPI_6_3_GIC_ITS_STRUCTURE); GicIts->Length = sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE);
GicIts->Reserved = EFI_ACPI_RESERVED_WORD; GicIts->Reserved = EFI_ACPI_RESERVED_WORD;
GicIts->GicItsId = GicItsInfo->GicItsId; GicIts->GicItsId = GicItsInfo->GicItsId;
GicIts->PhysicalBaseAddress = GicItsInfo->PhysicalBaseAddress; GicIts->PhysicalBaseAddress = GicItsInfo->PhysicalBaseAddress;
@ -407,7 +412,7 @@ AddGICInterruptTranslationService (
STATIC STATIC
VOID VOID
AddGICItsList ( AddGICItsList (
IN EFI_ACPI_6_3_GIC_ITS_STRUCTURE *GicIts, IN EFI_ACPI_6_5_GIC_ITS_STRUCTURE *GicIts,
IN CONST CM_ARM_GIC_ITS_INFO *GicItsInfo, IN CONST CM_ARM_GIC_ITS_INFO *GicItsInfo,
IN UINT32 GicItsCount IN UINT32 GicItsCount
) )
@ -470,7 +475,7 @@ BuildMadtTable (
UINT32 GicRedistOffset; UINT32 GicRedistOffset;
UINT32 GicItsOffset; UINT32 GicItsOffset;
EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *Madt; EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *Madt;
ASSERT (This != NULL); ASSERT (This != NULL);
ASSERT (AcpiTableInfo != NULL); ASSERT (AcpiTableInfo != NULL);
@ -602,22 +607,22 @@ BuildMadtTable (
goto error_handler; goto error_handler;
} }
TableSize = sizeof (EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER); TableSize = sizeof (EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER);
GicCOffset = TableSize; GicCOffset = TableSize;
TableSize += (sizeof (EFI_ACPI_6_3_GIC_STRUCTURE) * GicCCount); TableSize += (sizeof (EFI_ACPI_6_5_GIC_STRUCTURE) * GicCCount);
GicDOffset = TableSize; GicDOffset = TableSize;
TableSize += (sizeof (EFI_ACPI_6_3_GIC_DISTRIBUTOR_STRUCTURE) * GicDCount); TableSize += (sizeof (EFI_ACPI_6_5_GIC_DISTRIBUTOR_STRUCTURE) * GicDCount);
GicMSIOffset = TableSize; GicMSIOffset = TableSize;
TableSize += (sizeof (EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE) * GicMSICount); TableSize += (sizeof (EFI_ACPI_6_5_GIC_MSI_FRAME_STRUCTURE) * GicMSICount);
GicRedistOffset = TableSize; GicRedistOffset = TableSize;
TableSize += (sizeof (EFI_ACPI_6_3_GICR_STRUCTURE) * GicRedistCount); TableSize += (sizeof (EFI_ACPI_6_5_GICR_STRUCTURE) * GicRedistCount);
GicItsOffset = TableSize; GicItsOffset = TableSize;
TableSize += (sizeof (EFI_ACPI_6_3_GIC_ITS_STRUCTURE) * GicItsCount); TableSize += (sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE) * GicItsCount);
// Allocate the Buffer for MADT table // Allocate the Buffer for MADT table
*Table = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (TableSize); *Table = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (TableSize);
@ -633,7 +638,7 @@ BuildMadtTable (
goto error_handler; goto error_handler;
} }
Madt = (EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *)*Table; Madt = (EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *)*Table;
DEBUG (( DEBUG ((
DEBUG_INFO, DEBUG_INFO,
@ -659,7 +664,7 @@ BuildMadtTable (
} }
Status = AddGICCList ( Status = AddGICCList (
(EFI_ACPI_6_3_GIC_STRUCTURE *)((UINT8 *)Madt + GicCOffset), (EFI_ACPI_6_5_GIC_STRUCTURE *)((UINT8 *)Madt + GicCOffset),
GicCInfo, GicCInfo,
GicCCount, GicCCount,
Madt->Header.Revision Madt->Header.Revision
@ -674,13 +679,13 @@ BuildMadtTable (
} }
AddGICD ( AddGICD (
(EFI_ACPI_6_3_GIC_DISTRIBUTOR_STRUCTURE *)((UINT8 *)Madt + GicDOffset), (EFI_ACPI_6_5_GIC_DISTRIBUTOR_STRUCTURE *)((UINT8 *)Madt + GicDOffset),
GicDInfo GicDInfo
); );
if (GicMSICount != 0) { if (GicMSICount != 0) {
AddGICMsiFrameInfoList ( AddGICMsiFrameInfoList (
(EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE *)((UINT8 *)Madt + GicMSIOffset), (EFI_ACPI_6_5_GIC_MSI_FRAME_STRUCTURE *)((UINT8 *)Madt + GicMSIOffset),
GicMSIInfo, GicMSIInfo,
GicMSICount GicMSICount
); );
@ -688,7 +693,7 @@ BuildMadtTable (
if (GicRedistCount != 0) { if (GicRedistCount != 0) {
AddGICRedistributorList ( AddGICRedistributorList (
(EFI_ACPI_6_3_GICR_STRUCTURE *)((UINT8 *)Madt + GicRedistOffset), (EFI_ACPI_6_5_GICR_STRUCTURE *)((UINT8 *)Madt + GicRedistOffset),
GicRedistInfo, GicRedistInfo,
GicRedistCount GicRedistCount
); );
@ -696,7 +701,7 @@ BuildMadtTable (
if (GicItsCount != 0) { if (GicItsCount != 0) {
AddGICItsList ( AddGICItsList (
(EFI_ACPI_6_3_GIC_ITS_STRUCTURE *)((UINT8 *)Madt + GicItsOffset), (EFI_ACPI_6_5_GIC_ITS_STRUCTURE *)((UINT8 *)Madt + GicItsOffset),
GicItsInfo, GicItsInfo,
GicItsCount GicItsCount
); );
@ -764,9 +769,9 @@ ACPI_TABLE_GENERATOR MadtGenerator = {
// Generator Description // Generator Description
L"ACPI.STD.MADT.GENERATOR", L"ACPI.STD.MADT.GENERATOR",
// ACPI Table Signature // ACPI Table Signature
EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
// ACPI Table Revision supported by this Generator // ACPI Table Revision supported by this Generator
EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
// Minimum supported ACPI Table Revision // Minimum supported ACPI Table Revision
EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
// Creator ID // Creator ID