[PATCH] acpi: update MADT GICC Structure and related tests
Alex Hung
alex.hung at canonical.com
Tue Jul 21 06:16:04 UTC 2015
Signed-off-by: Alex Hung <alex.hung at 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
+ 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 */
--
1.9.1
More information about the fwts-devel
mailing list