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