From 4639733287dc9cf63ce8d55b7851abc9c160ee59 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Fri, 24 Oct 2025 11:03:20 +0100 Subject: [PATCH] DynamicTablesPkg: MadtGenerator: make GICD info as option GICD information is not a mandatory in the platform where use the GicV5 interrupt controller. Therefore, make GICD information as optional one. Signed-off-by: Yeoreum Yun --- .../Acpi/Arm/AcpiMadtLibArm/MadtGenerator.c | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/MadtGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/MadtGenerator.c index 67690d0f3b..9eeb77c7ed 100644 --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/MadtGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/MadtGenerator.c @@ -815,7 +815,10 @@ BuildMadtTable ( &GicDInfo, &GicDCount ); - if (EFI_ERROR (Status)) { + if (EFI_ERROR (Status) && + ((AcpiTableInfo->AcpiTableRevision < EFI_ACPI_6_7_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION) || + (Status != EFI_NOT_FOUND))) + { DEBUG (( DEBUG_ERROR, "ERROR: MADT: Failed to get GICD Info. Status = %r\n", @@ -824,16 +827,6 @@ BuildMadtTable ( goto error_handler; } - if (GicDCount == 0) { - DEBUG (( - DEBUG_ERROR, - "ERROR: MADT: GIC Distributor information not provided.\n" - )); - ASSERT (GicDCount != 0); - Status = EFI_INVALID_PARAMETER; - goto error_handler; - } - if (GicDCount > 1) { DEBUG (( DEBUG_ERROR, @@ -936,6 +929,28 @@ BuildMadtTable ( goto error_handler; } + if (((GicIrsCount == 0) && (GicDCount == 0)) || + ((GicIrsCount > 0) && (GicDCount > 0))) + { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "ERROR: MADT: No GicIrs and GicD Info or have both. Status = %r\n", + Status + )); + goto error_handler; + } + + if ((GicItsV5Count != 0) && (GicItsV5Count > GicItsV5TransFrameCount)) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "ERROR: MADT: Each GicItsV5 should have at least 1 Translate Frame. Status = %r\n", + Status + )); + goto error_handler; + } + TableSize = sizeof (EFI_ACPI_6_7_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER); GicCOffset = TableSize; @@ -1019,10 +1034,12 @@ BuildMadtTable ( goto error_handler; } - AddGICD ( - (EFI_ACPI_6_5_GIC_DISTRIBUTOR_STRUCTURE *)((UINT8 *)Madt + GicDOffset), - GicDInfo - ); + if (GicDCount != 0) { + AddGICD ( + (EFI_ACPI_6_5_GIC_DISTRIBUTOR_STRUCTURE *)((UINT8 *)Madt + GicDOffset), + GicDInfo + ); + } if (GicMSICount != 0) { AddGICMsiFrameInfoList (