diff mbox

fwts_acpi: acpidump: update TCPA table and acpidump accordingly

Message ID 1435292699-8579-1-git-send-email-alex.hung@canonical.com
State Accepted
Headers show

Commit Message

Alex Hung June 26, 2015, 4:24 a.m. UTC
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@canonical.com>
---
 src/acpi/acpidump/acpidump.c | 47 +++++++++++++++++++++++++++++++++++++-------
 src/lib/include/fwts_acpi.h  | 28 +++++++++++++++++++++++---
 2 files changed, 65 insertions(+), 10 deletions(-)

Comments

Colin Ian King June 26, 2015, 9:10 a.m. UTC | #1
On 26/06/15 05:24, Alex Hung wrote:
> 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@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
> 
The fwts-tests need to be updated for this too. If you can send that too
sometime, that would be useful :-)

Acked-by: Colin Ian King <colin.king@canonical.com>
Ivan Hu June 29, 2015, 6:55 a.m. UTC | #2
On 2015年06月26日 12:24, Alex Hung wrote:
> 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@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 fr

Acked-by: Ivan Hu<ivan.hu@canonical.com>
diff mbox

Patch

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