diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/MadtGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/MadtGenerator.c index 2102a59faf..df8734ed7f 100644 --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/MadtGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/MadtGenerator.c @@ -1,11 +1,11 @@ /** @file 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 @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 - 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] GicCInfo Pointer to the GIC CPU Interface Information. @@ -91,7 +91,7 @@ GET_OBJECT_LIST ( STATIC VOID 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 UINT8 MadtRev ) @@ -100,9 +100,9 @@ AddGICC ( ASSERT (GicCInfo != NULL); // UINT8 Type - Gicc->Type = EFI_ACPI_6_3_GIC; + Gicc->Type = EFI_ACPI_6_5_GIC; // UINT8 Length - Gicc->Length = sizeof (EFI_ACPI_6_3_GIC_STRUCTURE); + Gicc->Length = sizeof (EFI_ACPI_6_5_GIC_STRUCTURE); // UINT16 Reserved Gicc->Reserved = EFI_ACPI_RESERVED_WORD; @@ -148,6 +148,11 @@ AddGICC ( // in EFI_ACPI_6_2_GIC_STRUCTURE. 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 EFI_STATUS 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 UINT32 GicCCount, IN CONST UINT8 MadtRev @@ -252,7 +257,7 @@ AddGICCList ( STATIC VOID 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 ) { @@ -260,9 +265,9 @@ AddGICD ( ASSERT (GicDInfo != NULL); // UINT8 Type - Gicd->Type = EFI_ACPI_6_3_GICD; + Gicd->Type = EFI_ACPI_6_5_GICD; // UINT8 Length - Gicd->Length = sizeof (EFI_ACPI_6_3_GIC_DISTRIBUTOR_STRUCTURE); + Gicd->Length = sizeof (EFI_ACPI_6_5_GIC_DISTRIBUTOR_STRUCTURE); // UINT16 Reserved Gicd->Reserved1 = EFI_ACPI_RESERVED_WORD; // UINT32 Identifier @@ -289,15 +294,15 @@ AddGICD ( STATIC VOID 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 ) { ASSERT (GicMsiFrame != NULL); ASSERT (GicMsiFrameInfo != NULL); - GicMsiFrame->Type = EFI_ACPI_6_3_GIC_MSI_FRAME; - GicMsiFrame->Length = sizeof (EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE); + GicMsiFrame->Type = EFI_ACPI_6_5_GIC_MSI_FRAME; + GicMsiFrame->Length = sizeof (EFI_ACPI_6_5_GIC_MSI_FRAME_STRUCTURE); GicMsiFrame->Reserved1 = EFI_ACPI_RESERVED_WORD; GicMsiFrame->GicMsiFrameId = GicMsiFrameInfo->GicMsiFrameId; GicMsiFrame->PhysicalBaseAddress = GicMsiFrameInfo->PhysicalBaseAddress; @@ -316,7 +321,7 @@ AddGICMsiFrame ( STATIC VOID 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 UINT32 GicMsiFrameCount ) @@ -337,15 +342,15 @@ AddGICMsiFrameInfoList ( STATIC VOID 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 ) { ASSERT (Gicr != NULL); ASSERT (GicRedistributorInfo != NULL); - Gicr->Type = EFI_ACPI_6_3_GICR; - Gicr->Length = sizeof (EFI_ACPI_6_3_GICR_STRUCTURE); + Gicr->Type = EFI_ACPI_6_5_GICR; + Gicr->Length = sizeof (EFI_ACPI_6_5_GICR_STRUCTURE); Gicr->Reserved = EFI_ACPI_RESERVED_WORD; Gicr->DiscoveryRangeBaseAddress = GicRedistributorInfo->DiscoveryRangeBaseAddress; @@ -361,7 +366,7 @@ AddGICRedistributor ( STATIC VOID 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 UINT32 GicRCount ) @@ -382,15 +387,15 @@ AddGICRedistributorList ( STATIC VOID 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 ) { ASSERT (GicIts != NULL); ASSERT (GicItsInfo != NULL); - GicIts->Type = EFI_ACPI_6_3_GIC_ITS; - GicIts->Length = sizeof (EFI_ACPI_6_3_GIC_ITS_STRUCTURE); + GicIts->Type = EFI_ACPI_6_5_GIC_ITS; + GicIts->Length = sizeof (EFI_ACPI_6_5_GIC_ITS_STRUCTURE); GicIts->Reserved = EFI_ACPI_RESERVED_WORD; GicIts->GicItsId = GicItsInfo->GicItsId; GicIts->PhysicalBaseAddress = GicItsInfo->PhysicalBaseAddress; @@ -407,7 +412,7 @@ AddGICInterruptTranslationService ( STATIC VOID 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 UINT32 GicItsCount ) @@ -470,7 +475,7 @@ BuildMadtTable ( UINT32 GicRedistOffset; 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 (AcpiTableInfo != NULL); @@ -602,22 +607,22 @@ BuildMadtTable ( 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; - TableSize += (sizeof (EFI_ACPI_6_3_GIC_STRUCTURE) * GicCCount); + TableSize += (sizeof (EFI_ACPI_6_5_GIC_STRUCTURE) * GicCCount); GicDOffset = TableSize; - TableSize += (sizeof (EFI_ACPI_6_3_GIC_DISTRIBUTOR_STRUCTURE) * GicDCount); + TableSize += (sizeof (EFI_ACPI_6_5_GIC_DISTRIBUTOR_STRUCTURE) * GicDCount); 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; - TableSize += (sizeof (EFI_ACPI_6_3_GICR_STRUCTURE) * GicRedistCount); + TableSize += (sizeof (EFI_ACPI_6_5_GICR_STRUCTURE) * GicRedistCount); 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 *Table = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (TableSize); @@ -633,7 +638,7 @@ BuildMadtTable ( 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_INFO, @@ -659,7 +664,7 @@ BuildMadtTable ( } Status = AddGICCList ( - (EFI_ACPI_6_3_GIC_STRUCTURE *)((UINT8 *)Madt + GicCOffset), + (EFI_ACPI_6_5_GIC_STRUCTURE *)((UINT8 *)Madt + GicCOffset), GicCInfo, GicCCount, Madt->Header.Revision @@ -674,13 +679,13 @@ BuildMadtTable ( } AddGICD ( - (EFI_ACPI_6_3_GIC_DISTRIBUTOR_STRUCTURE *)((UINT8 *)Madt + GicDOffset), + (EFI_ACPI_6_5_GIC_DISTRIBUTOR_STRUCTURE *)((UINT8 *)Madt + GicDOffset), GicDInfo ); if (GicMSICount != 0) { AddGICMsiFrameInfoList ( - (EFI_ACPI_6_3_GIC_MSI_FRAME_STRUCTURE *)((UINT8 *)Madt + GicMSIOffset), + (EFI_ACPI_6_5_GIC_MSI_FRAME_STRUCTURE *)((UINT8 *)Madt + GicMSIOffset), GicMSIInfo, GicMSICount ); @@ -688,7 +693,7 @@ BuildMadtTable ( if (GicRedistCount != 0) { AddGICRedistributorList ( - (EFI_ACPI_6_3_GICR_STRUCTURE *)((UINT8 *)Madt + GicRedistOffset), + (EFI_ACPI_6_5_GICR_STRUCTURE *)((UINT8 *)Madt + GicRedistOffset), GicRedistInfo, GicRedistCount ); @@ -696,7 +701,7 @@ BuildMadtTable ( if (GicItsCount != 0) { AddGICItsList ( - (EFI_ACPI_6_3_GIC_ITS_STRUCTURE *)((UINT8 *)Madt + GicItsOffset), + (EFI_ACPI_6_5_GIC_ITS_STRUCTURE *)((UINT8 *)Madt + GicItsOffset), GicItsInfo, GicItsCount ); @@ -764,9 +769,9 @@ ACPI_TABLE_GENERATOR MadtGenerator = { // Generator Description L"ACPI.STD.MADT.GENERATOR", // 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 - EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, + EFI_ACPI_6_5_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, // Minimum supported ACPI Table Revision EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, // Creator ID