ACK: [PATCH 13/16] acpi: madt: add Multiprocessor Wakeup support (mantis 2087)
ivanhu
ivan.hu at canonical.com
Mon Feb 1 06:34:00 UTC 2021
On 1/27/21 4:30 AM, Alex Hung wrote:
> 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,
>
Acked-by: Ivan Hu <ivan.hu at canonical.com>
More information about the fwts-devel
mailing list