[PATCH] ACPI: Fix up GTDT corrections as in ACPI 5.1 (LP: #1348618)

Colin King colin.king at canonical.com
Fri Jul 25 12:39:29 UTC 2014


From: Colin Ian King <colin.king at canonical.com>

Re-sync the definitions of the GTDT for ACPI 5.1 and fix up
acpidump accordingly.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/acpi/acpidump/acpidump.c | 30 +++++++++++++++++++++++++-----
 src/lib/include/fwts_acpi.h  | 12 ++++++++++--
 2 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/src/acpi/acpidump/acpidump.c b/src/acpi/acpidump/acpidump.c
index 02a0d23..18de789 100644
--- a/src/acpi/acpidump/acpidump.c
+++ b/src/acpi/acpidump/acpidump.c
@@ -1561,21 +1561,41 @@ static void acpidump_bgrt(fwts_framework *fw, const fwts_acpi_table_info *table)
  */
 static void acpidump_gtdt(fwts_framework *fw, const fwts_acpi_table_info *table)
 {
+	uint8_t *data = (uint8_t *)table->data, *ptr = data;
+
 	static const fwts_acpidump_field gtdt_fields[] = {
-		FIELD_UINT("Physical Address", 		fwts_acpi_table_gtdt, phys_addr),
-		FIELD_UINT("Global Flags", 		fwts_acpi_table_gtdt, global_flags),
+		FIELD_UINT("Count Ctrl Physical Addr", 	fwts_acpi_table_gtdt, cnt_control_base_phys_addr),
+		FIELD_UINT("Reserved", 			fwts_acpi_table_gtdt, reserved),
 		FIELD_UINT("Secure PL1 Timer GSIV", 	fwts_acpi_table_gtdt, secure_PL1_timer_GSIV),
 		FIELD_UINT("Secure PL1 Timer Flags", 	fwts_acpi_table_gtdt, secure_PL1_timer_flags),
 		FIELD_UINT("Non-Secure PL1 Timer GSIV", fwts_acpi_table_gtdt, non_secure_PL1_timer_GSIV),
-		FIELD_UINT("Non-Secure PL1 Timer Flags", fwts_acpi_table_gtdt, non_secure_PL1_timer_flags),
+		FIELD_UINT("Non-Secure PL1 Timer Flags",fwts_acpi_table_gtdt, non_secure_PL1_timer_flags),
 		FIELD_UINT("Virtual Timer GSIV", 	fwts_acpi_table_gtdt, virtual_timer_GSIV),
 		FIELD_UINT("Virtual Timer flags", 	fwts_acpi_table_gtdt, virtual_timer_flags),
 		FIELD_UINT("Non-Secure PL2 Timer GSIV", fwts_acpi_table_gtdt, non_secure_PL2_timer_GSIV),
-		FIELD_UINT("Non-Secure PL2 Timer Flags", fwts_acpi_table_gtdt, non_secure_PL2_timer_flags),
+		FIELD_UINT("Non-Secure PL2 Timer Flags",fwts_acpi_table_gtdt, non_secure_PL2_timer_flags),
+		FIELD_UINT("Count Read Physical Addr",	fwts_acpi_table_gtdt, cnt_read_base_phys_addr),
+		FIELD_UINT("Platform Timer Count",	fwts_acpi_table_gtdt, platform_timer_count),
+		FIELD_UINT("Platform Timer Offset",	fwts_acpi_table_gtdt, platform_timer_offset),
+		FIELD_END
+	};
+
+	static const fwts_acpidump_field gtdt_platform_timer_fields[] = {
+		FIELD_BITF("  Timer Interrupt Mode", 	fwts_acpi_table_gtdt_platform_timer, timer_flags, 1, 0),
+		FIELD_BITF("  Timer Interrupt Polarity",fwts_acpi_table_gtdt_platform_timer, timer_flags, 1, 1),
+		FIELD_BITF("  Always-on Capability", 	fwts_acpi_table_gtdt_platform_timer, timer_flags, 1, 2),
 		FIELD_END
 	};
 
-	acpi_dump_table_fields(fw, table->data, gtdt_fields, 0, table->length);
+	acpi_dump_table_fields(fw, data, gtdt_fields, 0, table->length);
+
+	ptr += sizeof(fwts_acpi_table_gtdt);
+
+	/* Now scan through the array of platform timer structures */
+	while (ptr < data + table->length) {
+		__acpi_dump_table_fields(fw, ptr, gtdt_platform_timer_fields, ptr - data);
+		ptr += sizeof(fwts_acpi_table_gtdt_platform_timer);
+	}
 }
 
 /*
diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
index de7a889..b5d6863 100644
--- a/src/lib/include/fwts_acpi.h
+++ b/src/lib/include/fwts_acpi.h
@@ -682,8 +682,8 @@ typedef struct {
 
 /* 5.2.24 Generic Timer Description Table (GTDT) ACPI 5.0 Spec */
 typedef struct {
-	uint64_t	phys_addr;
-	uint32_t	global_flags;
+	uint64_t	cnt_control_base_phys_addr;
+	uint32_t	reserved;
 	uint32_t	secure_PL1_timer_GSIV;
 	uint32_t	secure_PL1_timer_flags;
 	uint32_t	non_secure_PL1_timer_GSIV;
@@ -692,8 +692,16 @@ typedef struct {
 	uint32_t	virtual_timer_flags;
 	uint32_t	non_secure_PL2_timer_GSIV;
 	uint32_t	non_secure_PL2_timer_flags;
+	uint64_t	cnt_read_base_phys_addr;
+	uint32_t	platform_timer_count;
+	uint32_t	platform_timer_offset;
 } __attribute__ ((packed)) fwts_acpi_table_gtdt;
 
+/* 5.2.24 Generic Timer Description Table (GTDT) ACPI 5.0 Spec, table 5-117 */
+typedef struct {
+	uint32_t	timer_flags;
+} __attribute__ ((packed)) fwts_acpi_table_gtdt_platform_timer;
+
 /* 5.2.20 ACPI RAS FeatureTable (RASF) */
 typedef struct {
         uint8_t         platform_cc_id[12];
-- 
2.0.1




More information about the fwts-devel mailing list