diff mbox series

acpi: madt: align MP wakeup struct with ACPI 6.6 (mantis 2404)

Message ID 20251117054800.419526-1-ivan.hu@canonical.com
State Accepted
Headers show
Series acpi: madt: align MP wakeup struct with ACPI 6.6 (mantis 2404) | expand

Commit Message

Ivan Hu Nov. 17, 2025, 5:48 a.m. UTC
BugLink: https://bugs.launchpad.net/fwts/+bug/2131641

ACPI 6.6 intruduced a new ResetVector into the base MP Wakeup struct,
modify the madt test accordingly.

Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
---
 src/acpi/madt/madt.c        | 28 ++++++++++++++++------------
 src/lib/include/fwts_acpi.h |  1 +
 2 files changed, 17 insertions(+), 12 deletions(-)
diff mbox series

Patch

diff --git a/src/acpi/madt/madt.c b/src/acpi/madt/madt.c
index 3b574b6e..3ab63763 100644
--- a/src/acpi/madt/madt.c
+++ b/src/acpi/madt/madt.c
@@ -1532,18 +1532,24 @@  static int madt_mp_wakup(fwts_framework *fw,
 			     uint8_t *data)
 {
 	/* specific checks for subtable type 0x10: Multiprocessor Wakeup */
-	fwts_acpi_madt_mp_wakeup *mp_wakeup = (fwts_acpi_madt_mp_wakeup *) data;
-
-	if (mp_wakeup->mail_box_version != 0)
+	fwts_acpi_madt_mp_wakeup *mp_wakeup = (fwts_acpi_madt_mp_wakeup *)data;
+	fwts_acpi_table_madt *madt = (fwts_acpi_table_madt *)mtable->data;
+	uint8_t madt_revision = madt ? madt->header.revision : 0;
+	uint32_t expected_version = (madt_revision >= 7) ? 1 : 0;
+	if (mp_wakeup->mail_box_version != expected_version) {
 		fwts_failed(fw, LOG_LEVEL_LOW,
 			    "SPECMADTMPWAKEUPVersion",
-			    "MADT %s mailbox version should be in 0, "
-			    "but instead have 0x%" PRIx32 ".",
-			    madt_sub_names[hdr->type], mp_wakeup->mail_box_version);
-	else
+			    "MADT %s mailbox version should be %" PRIu32
+			    " for MADT revision %" PRIu8 ", but instead has 0x%" PRIx32 ".",
+			    madt_sub_names[hdr->type],
+			    expected_version,
+			    madt_revision,
+			    mp_wakeup->mail_box_version);
+	} else {
 		fwts_passed(fw,
-			    "MADT %s mailbox version is in 0.",
-			    madt_sub_names[hdr->type]);
+			    "MADT %s mailbox version is set to %" PRIu32 ".",
+			    madt_sub_names[hdr->type], expected_version);
+	}
 
 	if (mp_wakeup->reserved)
 		fwts_failed(fw, LOG_LEVEL_LOW,
@@ -1565,11 +1571,9 @@  static int madt_mp_wakup(fwts_framework *fw,
 			    madt_sub_names[hdr->type], mp_wakeup->mail_box_address);
 	else
 		fwts_passed(fw,
-			    "MADT %s mailbox version is in 0.",
+			    "MADT %s mailbox address is 4K aligned.",
 			    madt_sub_names[hdr->type]);
 
-
-
 	return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header));
 }
 
diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
index a47dd107..72773435 100644
--- a/src/lib/include/fwts_acpi.h
+++ b/src/lib/include/fwts_acpi.h
@@ -729,6 +729,7 @@  typedef struct {
 	uint16_t	mail_box_version;
 	uint32_t	reserved;
 	uint64_t	mail_box_address;
+	uint64_t	reset_vector;	/* Present (ACPI 6.6) */
 } __attribute__ ((packed)) fwts_acpi_madt_mp_wakeup;
 
 /* New in ACPI 6.5 Core Programmable Interrupt Controller (CORE PIC) Structure, 5.2.12.20 */