mirror of https://github.com/acidanthera/audk.git
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:
parent
cf62548a35
commit
36e9f3d08a
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue