[PATCH] fwts_acpi: acpidump: update TCPA table and acpidump accordingly

Alex Hung alex.hung at canonical.com
Fri Jun 26 04:24:59 UTC 2015


The update is according to TCG ACPI Specification
Family 1.2 and 2.0
Revision 00.36
June 26, 2014

Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
 src/acpi/acpidump/acpidump.c | 47 +++++++++++++++++++++++++++++++++++++-------
 src/lib/include/fwts_acpi.h  | 28 +++++++++++++++++++++++---
 2 files changed, 65 insertions(+), 10 deletions(-)

diff --git a/src/acpi/acpidump/acpidump.c b/src/acpi/acpidump/acpidump.c
index c439b80..1269db8 100644
--- a/src/acpi/acpidump/acpidump.c
+++ b/src/acpi/acpidump/acpidump.c
@@ -1146,14 +1146,47 @@ static void acpidump_srat(fwts_framework *fw, const fwts_acpi_table_info *table)
 
 static void acpidump_tcpa(fwts_framework *fw, const fwts_acpi_table_info *table)
 {
-	static const fwts_acpidump_field fields[] = {
-		FIELD_UINT("Reserved", 		fwts_acpi_table_tcpa, reserved),
-		FIELD_UINT("Log Zone Length", 	fwts_acpi_table_tcpa, log_zone_length),
-		FIELD_UINT("Log Zone Address", 	fwts_acpi_table_tcpa, log_zone_addr),
-		FIELD_END
-	};
+	fwts_acpi_table_tcpa *tcpa = (fwts_acpi_table_tcpa*)table->data;
+
+	switch (tcpa->platform_class) {
+		case 0: {
+				static const fwts_acpidump_field fields[] = {
+					FIELD_UINT("Platform Class",	fwts_acpi_table_tcpa, platform_class),
+					FIELD_UINT("Log Zone Length", 	fwts_acpi_table_tcpa, client.log_zone_length),
+					FIELD_UINT("Log Zone Address", 	fwts_acpi_table_tcpa, client.log_zone_addr),
+					FIELD_END
+				};
+
+				acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
+			}
+			break;
+		case 1: {
+				static const fwts_acpidump_field fields[] = {
+					FIELD_UINT("Platform Class",		fwts_acpi_table_tcpa, platform_class),
+					FIELD_UINT("Reserved",			fwts_acpi_table_tcpa, server.reserved),
+					FIELD_UINT("Log Zone Length", 		fwts_acpi_table_tcpa, server.log_zone_length),
+					FIELD_UINT("Log Zone Address",	 	fwts_acpi_table_tcpa, server.log_zone_addr),
+					FIELD_UINT("Specification Revision",	fwts_acpi_table_tcpa, server.spec_revision),
+					FIELD_UINT("Device Flag", 		fwts_acpi_table_tcpa, server.device_flag),
+					FIELD_UINT("Interrupt Flag", 		fwts_acpi_table_tcpa, server.interrupt_flag),
+					FIELD_UINT("GPE",			fwts_acpi_table_tcpa, server.gpe),
+					FIELD_UINT("Reserved",			fwts_acpi_table_tcpa, server.reserved2),
+					FIELD_UINT("Global System Interrupt",	fwts_acpi_table_tcpa, server.global_sys_interrupt),
+					FIELD_GAS ("Base Address", 		fwts_acpi_table_tcpa, server.base_addr),
+					FIELD_UINT("Reserved",	 		fwts_acpi_table_tcpa, server.reserved3),
+					FIELD_GAS ("Configuration Address",	fwts_acpi_table_tcpa, server.config_addr),
+					FIELD_UINT("PCI Segment Group", 	fwts_acpi_table_tcpa, server.pci_seg_number),
+					FIELD_UINT("PCI Bus Number",	 	fwts_acpi_table_tcpa, server.pci_bus_number),
+					FIELD_UINT("PCI Device Number", 	fwts_acpi_table_tcpa, server.pci_dev_number),
+					FIELD_UINT("PCI Function Number", 	fwts_acpi_table_tcpa, server.pci_func_number),
+					FIELD_END
+				};
+				acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
+
+			}
+			break;
+	}
 
-	acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
 }
 
 /*
diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
index 63138b9..15aabaf 100644
--- a/src/lib/include/fwts_acpi.h
+++ b/src/lib/include/fwts_acpi.h
@@ -508,9 +508,31 @@ typedef struct {
    and also http://www.cl.cam.ac.uk/~rja14/tcpa-faq.html */
 typedef struct {
 	fwts_acpi_table_header	header;
-	uint16_t	reserved;
-	uint32_t	log_zone_length;
-	uint64_t	log_zone_addr;
+	uint16_t	platform_class;
+	union {
+		struct client_hdr {
+			uint32_t log_zone_length;
+			uint64_t log_zone_addr;
+		}  __attribute__ ((packed)) client;
+		struct server_hdr {
+			uint16_t reserved;
+			uint64_t log_zone_length;
+			uint64_t log_zone_addr;
+			uint16_t spec_revision;
+			uint8_t device_flag;
+			uint8_t interrupt_flag;
+			uint8_t gpe;
+			uint8_t reserved2[3];
+			uint32_t global_sys_interrupt;
+			fwts_acpi_gas base_addr;
+			uint32_t reserved3;
+			fwts_acpi_gas config_addr;
+			uint8_t pci_seg_number;
+			uint8_t pci_bus_number;
+			uint8_t pci_dev_number;
+			uint8_t pci_func_number;
+		} __attribute__ ((packed)) server;
+	};
 }  __attribute__ ((packed)) fwts_acpi_table_tcpa;
 
 /* Following ASF definitions from
-- 
1.9.1




More information about the fwts-devel mailing list