diff mbox

acpi: update MADT GICC Structure and related tests

Message ID 1437459364-25378-1-git-send-email-alex.hung@canonical.com
State Rejected
Headers show

Commit Message

Alex Hung July 21, 2015, 6:16 a.m. UTC
Signed-off-by: Alex Hung <alex.hung@canonical.com>
---
 src/acpi/acpidump/acpidump.c | 58 ++++++++++++++++++++++++++++++++------------
 src/acpi/madt/madt.c         | 12 +++++++++
 src/lib/include/fwts_acpi.h  |  2 ++
 3 files changed, 56 insertions(+), 16 deletions(-)

Comments

Colin Ian King July 22, 2015, 9:17 a.m. UTC | #1
On 21/07/15 07:16, Alex Hung wrote:
> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> ---
>  src/acpi/acpidump/acpidump.c | 58 ++++++++++++++++++++++++++++++++------------
>  src/acpi/madt/madt.c         | 12 +++++++++
>  src/lib/include/fwts_acpi.h  |  2 ++
>  3 files changed, 56 insertions(+), 16 deletions(-)
> 
> diff --git a/src/acpi/acpidump/acpidump.c b/src/acpi/acpidump/acpidump.c
> index 9ff28cb..9ab5645 100644
> --- a/src/acpi/acpidump/acpidump.c
> +++ b/src/acpi/acpidump/acpidump.c
> @@ -953,22 +953,48 @@ static void acpidump_madt(fwts_framework *fw, const fwts_acpi_table_info *table)
>  			}
>  			break;
>  		case FWTS_ACPI_MADT_GIC_C_CPU_INTERFACE: {
> -				static const fwts_acpidump_field fields_madt_gic[] = {
> -					FIELD_UINT("  Reserved", 	fwts_acpi_madt_gic, reserved),
> -					FIELD_UINT("  GIC ID", 		fwts_acpi_madt_gic, gic_id),
> -					FIELD_UINT("  Processor UID", 	fwts_acpi_madt_gic, processor_uid),
> -					FIELD_UINT("  Flags", 		fwts_acpi_madt_gic, flags),
> -					FIELD_UINT("  Parking Protocol",fwts_acpi_madt_gic, parking_protocol_version),
> -					FIELD_UINT("  Perf. Int. GSIV",	fwts_acpi_madt_gic, performance_interrupt_gsiv),
> -					FIELD_UINT("  Parked Address",	fwts_acpi_madt_gic, parked_address),
> -					FIELD_UINT("  Phys. Base. Addr",fwts_acpi_madt_gic, physical_base_address),
> -					FIELD_UINT("  GICV",		fwts_acpi_madt_gic, gicv),
> -					FIELD_UINT("  GICH",		fwts_acpi_madt_gic, gich),
> -					FIELD_UINT("  VGIC Interrupt",	fwts_acpi_madt_gic, vgic),
> -					FIELD_UINT("  GICR Base. Addr", fwts_acpi_madt_gic, gicr_base_address),
> -					FIELD_UINT("  MPIDR",		fwts_acpi_madt_gic, mpidr),
> -				};
> -				__acpi_dump_table_fields(fw, data, fields_madt_gic, offset);
> +				// ACPI 5.1

I'd rather not have // comments if possible in fwts.  It's just a style
thing really.

> +				if (table->length == 76) {
> +					static const fwts_acpidump_field fields_madt_gic[] = {
> +						FIELD_UINT("  Reserved", 	fwts_acpi_madt_gic, reserved),
> +						FIELD_UINT("  GIC ID", 		fwts_acpi_madt_gic, gic_id),
> +						FIELD_UINT("  Processor UID", 	fwts_acpi_madt_gic, processor_uid),
> +						FIELD_UINT("  Flags", 		fwts_acpi_madt_gic, flags),
> +						FIELD_UINT("  Parking Protocol",fwts_acpi_madt_gic, parking_protocol_version),
> +						FIELD_UINT("  Perf. Int. GSIV",	fwts_acpi_madt_gic, performance_interrupt_gsiv),
> +						FIELD_UINT("  Parked Address",	fwts_acpi_madt_gic, parked_address),
> +						FIELD_UINT("  Phys. Base. Addr",fwts_acpi_madt_gic, physical_base_address),
> +						FIELD_UINT("  GICV",		fwts_acpi_madt_gic, gicv),
> +						FIELD_UINT("  GICH",		fwts_acpi_madt_gic, gich),
> +						FIELD_UINT("  VGIC Interrupt",	fwts_acpi_madt_gic, vgic),
> +						FIELD_UINT("  GICR Base. Addr", fwts_acpi_madt_gic, gicr_base_address),
> +						FIELD_UINT("  MPIDR",		fwts_acpi_madt_gic, mpidr),
> +					};
> +					__acpi_dump_table_fields(fw, data, fields_madt_gic, offset);
> +				}
> +
> +				// ACPI 6.0
> +				if (table->length == 80) {
> +					static const fwts_acpidump_field fields_madt_gic[] = {
> +						FIELD_UINT("  Reserved", 	fwts_acpi_madt_gic, reserved),
> +						FIELD_UINT("  GIC ID", 		fwts_acpi_madt_gic, gic_id),
> +						FIELD_UINT("  Processor UID", 	fwts_acpi_madt_gic, processor_uid),
> +						FIELD_UINT("  Flags", 		fwts_acpi_madt_gic, flags),
> +						FIELD_UINT("  Parking Protocol",fwts_acpi_madt_gic, parking_protocol_version),
> +						FIELD_UINT("  Perf. Int. GSIV",	fwts_acpi_madt_gic, performance_interrupt_gsiv),
> +						FIELD_UINT("  Parked Address",	fwts_acpi_madt_gic, parked_address),
> +						FIELD_UINT("  Phys. Base. Addr",fwts_acpi_madt_gic, physical_base_address),
> +						FIELD_UINT("  GICV",		fwts_acpi_madt_gic, gicv),
> +						FIELD_UINT("  GICH",		fwts_acpi_madt_gic, gich),
> +						FIELD_UINT("  VGIC Interrupt",	fwts_acpi_madt_gic, vgic),
> +						FIELD_UINT("  GICR Base. Addr", fwts_acpi_madt_gic, gicr_base_address),
> +						FIELD_UINT("  MPIDR",		fwts_acpi_madt_gic, mpidr),
> +						FIELD_UINT("  Processor Power Efficiency Class",	fwts_acpi_madt_gic, processor_power_efficiency_class),
> +						FIELD_UINTS("  Reserved", 	fwts_acpi_madt_gic, reserved2),
> +					};
> +					__acpi_dump_table_fields(fw, data, fields_madt_gic, offset);
> +				}
> +
>  				skip = sizeof(fwts_acpi_madt_gic);
>  			}
>  			break;
> diff --git a/src/acpi/madt/madt.c b/src/acpi/madt/madt.c
> index 8afceb6..f776745 100644
> --- a/src/acpi/madt/madt.c
> +++ b/src/acpi/madt/madt.c
> @@ -235,6 +235,18 @@ static int madt_test1(fwts_framework *fw)
>  						gic->flags & 0xfffffffc);
>  				}
>  				skip = sizeof(fwts_acpi_madt_gic);
> +
> +				// new in ACPI 6.0
> +				if (table->length == 80) {
> +					uint32_t gic_reserve2 = gic->reserved2[0] + (gic->reserved2[1] << 4) + (gic->reserved2[2] << 8);
> +					if (gic_reserve2) {
> +						passed = false;
> +						fwts_failed(fw, LOG_LEVEL_LOW,
> +							"MADTGICCReserved2NonZero",
> +							"MADT GICC Structure second reserved field should be zero, "
> +							"instead got 0x%" PRIx32 ".", gic_reserve2);
> +					}
> +				}
>  			}
>  			break;
>  		case FWTS_ACPI_MADT_GIC_D_GOC_DISTRIBUTOR: {
> diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
> index aa7c1a3..c80c362 100644
> --- a/src/lib/include/fwts_acpi.h
> +++ b/src/lib/include/fwts_acpi.h
> @@ -472,6 +472,8 @@ typedef struct {
>  	uint32_t	vgic;
>  	uint64_t	gicr_base_address;
>  	uint64_t	mpidr;
> +	uint8_t		processor_power_efficiency_class;
> +	uint8_t		reserved2[3];
>  } __attribute__ ((packed)) fwts_acpi_madt_gic;
>  
>  /* New in ACPI 5.0, GICD, section 5.2.12.15 */
>
diff mbox

Patch

diff --git a/src/acpi/acpidump/acpidump.c b/src/acpi/acpidump/acpidump.c
index 9ff28cb..9ab5645 100644
--- a/src/acpi/acpidump/acpidump.c
+++ b/src/acpi/acpidump/acpidump.c
@@ -953,22 +953,48 @@  static void acpidump_madt(fwts_framework *fw, const fwts_acpi_table_info *table)
 			}
 			break;
 		case FWTS_ACPI_MADT_GIC_C_CPU_INTERFACE: {
-				static const fwts_acpidump_field fields_madt_gic[] = {
-					FIELD_UINT("  Reserved", 	fwts_acpi_madt_gic, reserved),
-					FIELD_UINT("  GIC ID", 		fwts_acpi_madt_gic, gic_id),
-					FIELD_UINT("  Processor UID", 	fwts_acpi_madt_gic, processor_uid),
-					FIELD_UINT("  Flags", 		fwts_acpi_madt_gic, flags),
-					FIELD_UINT("  Parking Protocol",fwts_acpi_madt_gic, parking_protocol_version),
-					FIELD_UINT("  Perf. Int. GSIV",	fwts_acpi_madt_gic, performance_interrupt_gsiv),
-					FIELD_UINT("  Parked Address",	fwts_acpi_madt_gic, parked_address),
-					FIELD_UINT("  Phys. Base. Addr",fwts_acpi_madt_gic, physical_base_address),
-					FIELD_UINT("  GICV",		fwts_acpi_madt_gic, gicv),
-					FIELD_UINT("  GICH",		fwts_acpi_madt_gic, gich),
-					FIELD_UINT("  VGIC Interrupt",	fwts_acpi_madt_gic, vgic),
-					FIELD_UINT("  GICR Base. Addr", fwts_acpi_madt_gic, gicr_base_address),
-					FIELD_UINT("  MPIDR",		fwts_acpi_madt_gic, mpidr),
-				};
-				__acpi_dump_table_fields(fw, data, fields_madt_gic, offset);
+				// ACPI 5.1
+				if (table->length == 76) {
+					static const fwts_acpidump_field fields_madt_gic[] = {
+						FIELD_UINT("  Reserved", 	fwts_acpi_madt_gic, reserved),
+						FIELD_UINT("  GIC ID", 		fwts_acpi_madt_gic, gic_id),
+						FIELD_UINT("  Processor UID", 	fwts_acpi_madt_gic, processor_uid),
+						FIELD_UINT("  Flags", 		fwts_acpi_madt_gic, flags),
+						FIELD_UINT("  Parking Protocol",fwts_acpi_madt_gic, parking_protocol_version),
+						FIELD_UINT("  Perf. Int. GSIV",	fwts_acpi_madt_gic, performance_interrupt_gsiv),
+						FIELD_UINT("  Parked Address",	fwts_acpi_madt_gic, parked_address),
+						FIELD_UINT("  Phys. Base. Addr",fwts_acpi_madt_gic, physical_base_address),
+						FIELD_UINT("  GICV",		fwts_acpi_madt_gic, gicv),
+						FIELD_UINT("  GICH",		fwts_acpi_madt_gic, gich),
+						FIELD_UINT("  VGIC Interrupt",	fwts_acpi_madt_gic, vgic),
+						FIELD_UINT("  GICR Base. Addr", fwts_acpi_madt_gic, gicr_base_address),
+						FIELD_UINT("  MPIDR",		fwts_acpi_madt_gic, mpidr),
+					};
+					__acpi_dump_table_fields(fw, data, fields_madt_gic, offset);
+				}
+
+				// ACPI 6.0
+				if (table->length == 80) {
+					static const fwts_acpidump_field fields_madt_gic[] = {
+						FIELD_UINT("  Reserved", 	fwts_acpi_madt_gic, reserved),
+						FIELD_UINT("  GIC ID", 		fwts_acpi_madt_gic, gic_id),
+						FIELD_UINT("  Processor UID", 	fwts_acpi_madt_gic, processor_uid),
+						FIELD_UINT("  Flags", 		fwts_acpi_madt_gic, flags),
+						FIELD_UINT("  Parking Protocol",fwts_acpi_madt_gic, parking_protocol_version),
+						FIELD_UINT("  Perf. Int. GSIV",	fwts_acpi_madt_gic, performance_interrupt_gsiv),
+						FIELD_UINT("  Parked Address",	fwts_acpi_madt_gic, parked_address),
+						FIELD_UINT("  Phys. Base. Addr",fwts_acpi_madt_gic, physical_base_address),
+						FIELD_UINT("  GICV",		fwts_acpi_madt_gic, gicv),
+						FIELD_UINT("  GICH",		fwts_acpi_madt_gic, gich),
+						FIELD_UINT("  VGIC Interrupt",	fwts_acpi_madt_gic, vgic),
+						FIELD_UINT("  GICR Base. Addr", fwts_acpi_madt_gic, gicr_base_address),
+						FIELD_UINT("  MPIDR",		fwts_acpi_madt_gic, mpidr),
+						FIELD_UINT("  Processor Power Efficiency Class",	fwts_acpi_madt_gic, processor_power_efficiency_class),
+						FIELD_UINTS("  Reserved", 	fwts_acpi_madt_gic, reserved2),
+					};
+					__acpi_dump_table_fields(fw, data, fields_madt_gic, offset);
+				}
+
 				skip = sizeof(fwts_acpi_madt_gic);
 			}
 			break;
diff --git a/src/acpi/madt/madt.c b/src/acpi/madt/madt.c
index 8afceb6..f776745 100644
--- a/src/acpi/madt/madt.c
+++ b/src/acpi/madt/madt.c
@@ -235,6 +235,18 @@  static int madt_test1(fwts_framework *fw)
 						gic->flags & 0xfffffffc);
 				}
 				skip = sizeof(fwts_acpi_madt_gic);
+
+				// new in ACPI 6.0
+				if (table->length == 80) {
+					uint32_t gic_reserve2 = gic->reserved2[0] + (gic->reserved2[1] << 4) + (gic->reserved2[2] << 8);
+					if (gic_reserve2) {
+						passed = false;
+						fwts_failed(fw, LOG_LEVEL_LOW,
+							"MADTGICCReserved2NonZero",
+							"MADT GICC Structure second reserved field should be zero, "
+							"instead got 0x%" PRIx32 ".", gic_reserve2);
+					}
+				}
 			}
 			break;
 		case FWTS_ACPI_MADT_GIC_D_GOC_DISTRIBUTOR: {
diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
index aa7c1a3..c80c362 100644
--- a/src/lib/include/fwts_acpi.h
+++ b/src/lib/include/fwts_acpi.h
@@ -472,6 +472,8 @@  typedef struct {
 	uint32_t	vgic;
 	uint64_t	gicr_base_address;
 	uint64_t	mpidr;
+	uint8_t		processor_power_efficiency_class;
+	uint8_t		reserved2[3];
 } __attribute__ ((packed)) fwts_acpi_madt_gic;
 
 /* New in ACPI 5.0, GICD, section 5.2.12.15 */