From patchwork Tue Jan 1 00:53:14 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: acpi: acpidump: fix ACPI FPDT dump Date: Mon, 31 Dec 2012 14:53:14 -0000 From: Colin King X-Patchwork-Id: 208898 Message-Id: <1357001594-30771-1-git-send-email-colin.king@canonical.com> To: fwts-devel@lists.ubuntu.com From: Colin Ian King Fix the output of the ACPI FPDT dump. This now prints the performance record types correctly as well as binary dumps the reserved fields that are not described in the ACPI specification. Signed-off-by: Colin Ian King Acked-by: Alex Hung Acked-by: Keng-Yu Lin --- src/acpi/acpidump/acpidump.c | 54 ++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/src/acpi/acpidump/acpidump.c b/src/acpi/acpidump/acpidump.c index 88dbc10..5f3e25e 100644 --- a/src/acpi/acpidump/acpidump.c +++ b/src/acpi/acpidump/acpidump.c @@ -1550,6 +1550,7 @@ static void acpidump_fpdt(fwts_framework *fw, fwts_acpi_table_info *table) uint8_t *data = (uint8_t *)table->data; uint8_t *ptr = data; size_t length = table->length; + const size_t fpdt_hdr_len = sizeof(fwts_acpi_table_fpdt_header); static fwts_acpidump_field fpdt_header_fields[] = { FIELD_UINT("Type", fwts_acpi_table_fpdt_header, type), @@ -1558,17 +1559,19 @@ static void acpidump_fpdt(fwts_framework *fw, fwts_acpi_table_info *table) FIELD_END }; + static fwts_acpidump_field fpdt_basic_boot_perf_ptr_fields[] = { + FIELD_UINT("Reserved", fwts_acpi_table_fpdt_basic_boot_perf_ptr, reserved), + FIELD_UINT("FBPT Pointer", fwts_acpi_table_fpdt_basic_boot_perf_ptr, fbpt_addr), + FIELD_END + }; + static fwts_acpidump_field fpdt_s3_perf_ptr_fields[] = { FIELD_UINT("Reserved", fwts_acpi_table_fpdt_s3_perf_ptr, reserved), FIELD_UINT("S3PT Pointer", fwts_acpi_table_fpdt_s3_perf_ptr, s3pt_addr), FIELD_END }; - static fwts_acpidump_field fpdt_basic_boot_perf_ptr_fields[] = { - FIELD_UINT("Reserved", fwts_acpi_table_fpdt_basic_boot_perf_ptr, reserved), - FIELD_UINT("FBPT Pointer", fwts_acpi_table_fpdt_basic_boot_perf_ptr, fbpt_addr), - FIELD_END - }; + ptr += sizeof(fwts_acpi_table_header); /* * Currently we just dump out the various pointer records. A more complete @@ -1578,24 +1581,45 @@ static void acpidump_fpdt(fwts_framework *fw, fwts_acpi_table_info *table) while (ptr < data + length) { fwts_acpi_table_fpdt_header *fpdt = (fwts_acpi_table_fpdt_header*)ptr; - __acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data); + fwts_log_nl(fw); + switch (fpdt->type) { - case 0: - fwts_log_info_verbatum(fw, "S3 resume performance record pointer:"); - __acpi_dump_table_fields(fw, ptr, fpdt_s3_perf_ptr_fields, ptr - data); + case 0x0000: + fwts_log_info_verbatum(fw, "Basic Boot Performance Data Record pointer:"); + __acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data); + __acpi_dump_table_fields(fw, ptr, fpdt_basic_boot_perf_ptr_fields, ptr - data); break; - case 1: - fwts_log_info_verbatum(fw, "S3 suspend performance record pointer:"); + case 0x0001: + fwts_log_info_verbatum(fw, "S3 Performance Table pointer:"); + __acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data); __acpi_dump_table_fields(fw, ptr, fpdt_s3_perf_ptr_fields, ptr - data); break; - case 2: - fwts_log_info_verbatum(fw, "Boot performance record pointer:"); - __acpi_dump_table_fields(fw, ptr, fpdt_basic_boot_perf_ptr_fields, ptr - data); + case 0x0002 ... 0x0fff: + fwts_log_info_verbatum(fw, "Reserved for ACPI specification useage:"); + __acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data); + acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data); + break; + case 0x1000 ... 0x1fff: + fwts_log_info_verbatum(fw, "Reserved for Platform Vendor useage:"); + __acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data); + acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data); + break; + case 0x2000 ... 0x2fff: + fwts_log_info_verbatum(fw, "Reserved for Hardware Vendor useage:"); + __acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data); + acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data); + break; + case 0x3000 ... 0x3fff: + fwts_log_info_verbatum(fw, "Reserved for BIOS Vendor useage:"); + __acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data); + acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data); break; default: + fwts_log_info_verbatum(fw, "Reserved for future useage:"); + __acpi_dump_table_fields(fw, ptr, fpdt_header_fields, ptr - data); + acpi_dump_raw_data(fw, ptr + fpdt_hdr_len, fpdt->length - fpdt_hdr_len, ptr + fpdt_hdr_len - data); break; } - ptr += fpdt->length; } }