[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