Message ID | 20210126203040.6101-13-alex.hung@canonical.com |
---|---|
State | Accepted |
Headers | show |
Series | [01/16] acpi: update ACPI version to 6.4 | expand |
On 26/01/2021 20:30, Alex Hung wrote: > Signed-off-by: Alex Hung <alex.hung@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: Colin Ian King <colin.king@canonical.com>
On 1/27/21 4:30 AM, Alex Hung wrote: > Signed-off-by: Alex Hung <alex.hung@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@canonical.com>
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,
Signed-off-by: Alex Hung <alex.hung@canonical.com> --- src/acpi/madt/madt.c | 57 +++++++++++++++++++++++++++++++++++-- src/lib/include/fwts_acpi.h | 31 +++++++++++++------- 2 files changed, 74 insertions(+), 14 deletions(-)