diff mbox series

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

Message ID 20210126203040.6101-13-alex.hung@canonical.com
State Accepted
Headers show
Series [01/16] acpi: update ACPI version to 6.4 | expand

Commit Message

Alex Hung Jan. 26, 2021, 8:30 p.m. UTC
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(-)

Comments

Colin Ian King Jan. 26, 2021, 8:56 p.m. UTC | #1
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>
Ivan Hu Feb. 1, 2021, 6:34 a.m. UTC | #2
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 mbox series

Patch

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,