[PATCH 13/16] acpi: madt: add Multiprocessor Wakeup support (mantis 2087)

Alex Hung alex.hung at canonical.com
Tue Jan 26 20:30:37 UTC 2021


Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
 src/acpi/madt/madt.c        | 57 +++++++++++++++++++++++++++++++++++--
 src/lib/include/fwts_acpi.h | 31 +++++++++++++-------
 2 files changed, 74 insertions(+), 14 deletions(-)

diff --git a/src/acpi/madt/madt.c b/src/acpi/madt/madt.c
index 1abd6922..2c858792 100644
--- a/src/acpi/madt/madt.c
+++ b/src/acpi/madt/madt.c
@@ -560,7 +560,8 @@ static const char *madt_sub_names[] = {
 	/* 0x0d */ "GICv2m MSI Frame",
 	/* 0x0e */ "GICR Redistributor",
 	/* 0x0f */ "GIC Interrupt Translation Service (ITS)",
-	/* 0x10 - 0x7f */ "Reserved. OSPM skips structures of the reserved type.",
+	/* 0x10 */ "Multiprocessor Wakeup",
+	/* 0x11 - 0x7f */ "Reserved. OSPM skips structures of the reserved type.",
 	/* 0x80 - 0xff */ "Reserved for OEM use",
 	NULL
 };
@@ -1382,6 +1383,52 @@ static int madt_gic_its(fwts_framework *fw,
 	return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header));
 }
 
+static int madt_mp_wakup(fwts_framework *fw,
+			     fwts_acpi_madt_sub_table_header *hdr,
+			     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_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
+		fwts_passed(fw,
+			    "MADT %s mailbox version is in 0.",
+			    madt_sub_names[hdr->type]);
+
+	if (mp_wakeup->reserved)
+		fwts_failed(fw, LOG_LEVEL_LOW,
+			    "SPECMADTMPWAKEUPReservedNonZero",
+			    "MADT %s reserved field should be zero, "
+			    "instead got 0x%" PRIx32 ".",
+			    madt_sub_names[hdr->type], mp_wakeup->reserved);
+	else
+		fwts_passed(fw,
+			    "MADT %s reserved field is properly set "
+			    "to zero.",
+			    madt_sub_names[hdr->type]);
+
+	if (mp_wakeup->mail_box_address % 0x1000)
+		fwts_failed(fw, LOG_LEVEL_HIGH,
+			    "SPECMADTMPWAKEUPAddress",
+			    "MADT %s mailbox adress should be 4K bytes aligned, "
+			    "but instead have 0x%" PRIx64 ".",
+			    madt_sub_names[hdr->type], mp_wakeup->mail_box_address);
+	else
+		fwts_passed(fw,
+			    "MADT %s mailbox version is in 0.",
+			    madt_sub_names[hdr->type]);
+
+
+
+	return (hdr->length - sizeof(fwts_acpi_madt_sub_table_header));
+}
+
 static void madt_ioapic_sapic_compare(fwts_framework *fw,
 				     int num_ioapics,
 				     int num_iosapics)
@@ -1604,15 +1651,19 @@ static int madt_subtables(fwts_framework *fw)
 			skip = madt_gic_its(fw, hdr, data);
 			break;
 
+		case FWTS_ACPI_MADT_MP_WAKEUP:
+			skip = madt_mp_wakup(fw, hdr, data);
+			break;
+
 		case FWTS_ACPI_MADT_RESERVED:
 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
 				    "SPECMADTSubReservedID",
 				    "MADT subtable %d (offset 0x%x) is "
 				    "using the reserved value 0x%" PRIx8 " for a "
-				    "type.  Subtable type values 0x10..0x7f "
+				    "type.  Subtable type values 0x%" PRIx8 "..0x7f "
 				    "are reserved; 0x80..0xff can be "
 				    "used by OEMs.",
-				    ii, offset, hdr->type);
+				    ii, offset, hdr->type, FWTS_ACPI_MADT_RESERVED);
 			skip = (hdr->length -
 				sizeof(fwts_acpi_madt_sub_table_header));
 			break;
diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
index 0f92bce1..9a075c2f 100644
--- a/src/lib/include/fwts_acpi.h
+++ b/src/lib/include/fwts_acpi.h
@@ -507,22 +507,23 @@ typedef struct {
 } __attribute__ ((packed)) fwts_acpi_table_madt;
 
 typedef enum {
-        FWTS_ACPI_MADT_LOCAL_APIC = 0,
-        FWTS_ACPI_MADT_IO_APIC,
-        FWTS_ACPI_MADT_INTERRUPT_OVERRIDE,
-        FWTS_ACPI_MADT_NMI_SOURCE,
-        FWTS_ACPI_MADT_LOCAL_APIC_NMI,
-        FWTS_ACPI_MADT_LOCAL_APIC_OVERRIDE,
-        FWTS_ACPI_MADT_IO_SAPIC,
-        FWTS_ACPI_MADT_LOCAL_SAPIC,
-        FWTS_ACPI_MADT_INTERRUPT_SOURCE,
-        FWTS_ACPI_MADT_LOCAL_X2APIC,
-        FWTS_ACPI_MADT_LOCAL_X2APIC_NMI,
+	FWTS_ACPI_MADT_LOCAL_APIC = 0,
+	FWTS_ACPI_MADT_IO_APIC,
+	FWTS_ACPI_MADT_INTERRUPT_OVERRIDE,
+	FWTS_ACPI_MADT_NMI_SOURCE,
+	FWTS_ACPI_MADT_LOCAL_APIC_NMI,
+	FWTS_ACPI_MADT_LOCAL_APIC_OVERRIDE,
+	FWTS_ACPI_MADT_IO_SAPIC,
+	FWTS_ACPI_MADT_LOCAL_SAPIC,
+	FWTS_ACPI_MADT_INTERRUPT_SOURCE,
+	FWTS_ACPI_MADT_LOCAL_X2APIC,
+	FWTS_ACPI_MADT_LOCAL_X2APIC_NMI,
 	FWTS_ACPI_MADT_GIC_C_CPU_INTERFACE,
 	FWTS_ACPI_MADT_GIC_D_GOC_DISTRIBUTOR,
 	FWTS_ACPI_MADT_GIC_V2M_MSI_FRAME,
 	FWTS_ACPI_MADT_GIC_R_REDISTRIBUTOR,
 	FWTS_ACPI_MADT_GIC_ITS,
+	FWTS_ACPI_MADT_MP_WAKEUP,
 	FWTS_ACPI_MADT_RESERVED, /* does not have defined structure */
 	FWTS_ACPI_MADT_OEM /* does not have defined structure */
 } fwts_acpi_madt_type;
@@ -675,6 +676,14 @@ typedef struct {
 	uint32_t	reserved2;
 } __attribute__ ((packed)) fwts_acpi_madt_gic_its;
 
+/* New in ACPI 6.4, Multiprocessor Wakeup structure, 5.2.12.19 */
+/* Type 16, FWTS_ACPI_MADT_MP_WAKEUP */
+typedef struct {
+	uint16_t	mail_box_version;
+	uint32_t	reserved;
+	uint64_t	mail_box_address;
+} __attribute__ ((packed)) fwts_acpi_madt_mp_wakeup;
+
 /*
  * ACPI TCPA (Trusted Computing Platform Alliance Capabilities Table)
  *   http://www.kuro5hin.org/story/2002/10/27/16622/530,
-- 
2.25.1




More information about the fwts-devel mailing list