diff mbox series

acpi: madt: enforce PSCI when parking protocol deprecated (mantis 2425)

Message ID 20251111074647.170853-1-ivan.hu@canonical.com
State Accepted
Headers show
Series acpi: madt: enforce PSCI when parking protocol deprecated (mantis 2425) | expand

Commit Message

Ivan Hu Nov. 11, 2025, 7:46 a.m. UTC
BugLink: https://bugs.launchpad.net/fwts/+bug/2130879

MADT revision 7 deprecates the parking protocol for Arm GICC entries.
Flag non-zero parking protocol versions once the table revision is at least 7
and require the FADT ARM_BOOT_ARCH PSCI bit to be set.

Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
---
 src/acpi/madt/madt.c | 66 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 53 insertions(+), 13 deletions(-)
diff mbox series

Patch

diff --git a/src/acpi/madt/madt.c b/src/acpi/madt/madt.c
index f0d6e1a7..caa4b96c 100644
--- a/src/acpi/madt/madt.c
+++ b/src/acpi/madt/madt.c
@@ -1085,6 +1085,9 @@  static int madt_gicc(fwts_framework *fw,
 {
 	/* specific checks for subtable type 0xb: GICC */
 	fwts_acpi_madt_gic *gic = (fwts_acpi_madt_gic *)data;
+	fwts_acpi_table_madt *madt = (fwts_acpi_table_madt *)mtable->data;
+	fwts_acpi_table_fadt *fadt = ftable ?
+		(fwts_acpi_table_fadt *)ftable->data : NULL;
 	uint32_t mask;
 	int start;
 
@@ -1133,19 +1136,56 @@  static int madt_gicc(fwts_framework *fw,
 				    "is reserved and must be zero.",madt_sub_names[hdr->type]);
 	}
 
-	if (gic->parking_protocol_version != 0 &&
-	    gic->parking_protocol_version != 1)
-		fwts_failed(fw, LOG_LEVEL_MEDIUM,
-			    "SPECMADTGICCParkingVersion",
-			    "MADT %s, protocol versions defined are 0..1 but "
-			    "%" PRIu32 " is being used.",
-			    madt_sub_names[hdr->type],
-			    gic->parking_protocol_version);
-	else
-		fwts_passed(fw,
-			    "MADT %s, is using a defined parking protocol "
-			    "version.",
-			    madt_sub_names[hdr->type]);
+	if (madt && madt->header.revision >= 7) {
+		if (gic->parking_protocol_version != 0)
+			fwts_failed(fw, LOG_LEVEL_MEDIUM,
+				    "SPECMADTGICCParkingVersion",
+				    "MADT revision %" PRIu8 " requires the Parking Protocol "
+				    "Version field to be zero, but MADT %s reports %" PRIu32 ".",
+				    madt->header.revision,
+				    madt_sub_names[hdr->type],
+				    gic->parking_protocol_version);
+		else
+			fwts_passed(fw,
+				    "MADT %s uses Parking Protocol Version 0 as "
+				    "required for MADT revision %" PRIu8 ".",
+				    madt_sub_names[hdr->type],
+				    madt->header.revision);
+
+		if (!fadt)
+			fwts_failed(fw, LOG_LEVEL_MEDIUM,
+				    "MADTArmPsciCompliance",
+				    "MADT revision %" PRIu8 " requires verifying PSCI compliance "
+				    "but the FADT table is not available.",
+				    madt->header.revision);
+		else if (!(fadt->arm_boot_flags & FWTS_FACP_ARM_BOOT_ARCH_PSCI_COMPLIANT))
+			fwts_failed(fw, LOG_LEVEL_MEDIUM,
+				    "MADTArmPsciCompliance",
+				    "MADT revision %" PRIu8 " requires PSCI to be implemented, "
+				    "but the FADT ARM Boot Architecture PSCI_COMPLIANT flag "
+				    "is not set (flags = 0x%4.4" PRIx16 ").",
+				    madt->header.revision,
+				    fadt->arm_boot_flags);
+		else
+			fwts_passed(fw,
+				    "FADT ARM Boot Architecture PSCI_COMPLIANT flag is set "
+				    "as required for MADT revision %" PRIu8 ".",
+				    madt->header.revision);
+	} else {
+		if (gic->parking_protocol_version != 0 &&
+		    gic->parking_protocol_version != 1)
+			fwts_failed(fw, LOG_LEVEL_MEDIUM,
+				    "SPECMADTGICCParkingVersion",
+				    "MADT %s, protocol versions defined are 0..1 but "
+				    "%" PRIu32 " is being used.",
+				    madt_sub_names[hdr->type],
+				    gic->parking_protocol_version);
+		else
+			fwts_passed(fw,
+				    "MADT %s is using a defined parking protocol "
+				    "version.",
+				    madt_sub_names[hdr->type]);
+	}
 
 	/*
 	 * TODO: is it even possible to verify the MPIDR is valid?  Or,