From patchwork Fri Dec 6 04:26:53 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Hu X-Patchwork-Id: 297569 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 503562C00AD for ; Fri, 6 Dec 2013 15:27:07 +1100 (EST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1Von0K-0008R2-AL; Fri, 06 Dec 2013 04:27:04 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1Von0E-0008P2-H4 for fwts-devel@lists.ubuntu.com; Fri, 06 Dec 2013 04:26:58 +0000 Received: from [175.41.48.77] (helo=canonical.com) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1Von0D-0006zl-VX; Fri, 06 Dec 2013 04:26:58 +0000 From: Ivan Hu To: fwts-devel@lists.ubuntu.com Subject: [PATCH] lib: fwts_acpi_table: multi-FADT table support fimware make sure the table from XSDT be checked first. (LP: #1258378) Date: Fri, 6 Dec 2013 12:26:53 +0800 Message-Id: <1386304013-25029-1-git-send-email-ivan.hu@canonical.com> X-Mailer: git-send-email 1.7.9.5 X-BeenThere: fwts-devel@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Firmware Test Suite Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: fwts-devel-bounces@lists.ubuntu.com Sender: fwts-devel-bounces@lists.ubuntu.com Some fimwares that contain two FADT tables, one comes from the RSDT and the other comes from the XSDT. The FWTS will add the FADT tables followed the order RSDT and XSDT. And the fadt test will load the fadt table first added to the table what was from RSDT. Unfortunately, some firmware provide the multi-fadt tables, one(from XSDT) is correct and the other is uncompleted/wrong (from RSDT). See the bug(LP: #1253871) From the ACPI spec: it said "An ACPI-compatible OS must use the XSDT if present.". So change table adding order to XSDT, RSDT to make sure fwts check the fadt from XSDT first. Signed-off-by: Ivan Hu Acked-by: Colin Ian King Acked-by: Alex Hung --- src/lib/src/fwts_acpi_tables.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c index b23efa7..6f1e964 100644 --- a/src/lib/src/fwts_acpi_tables.c +++ b/src/lib/src/fwts_acpi_tables.c @@ -260,19 +260,19 @@ static int fwts_acpi_load_tables_from_firmware(void) return FWTS_ERROR; fwts_acpi_add_table("RSDP", rsdp, (uint64_t)(off_t)rsdp_addr, rsdp_len, FWTS_ACPI_TABLE_FROM_FIRMWARE); - /* Load any tables from RSDT if it's valid */ - if (rsdp->rsdt_address) { - if ((rsdt = fwts_acpi_load_table((off_t)rsdp->rsdt_address)) != NULL) { - fwts_acpi_add_table("RSDT", rsdt, (uint64_t)rsdp->rsdt_address, - rsdt->header.length, FWTS_ACPI_TABLE_FROM_FIRMWARE); - num_entries = (rsdt->header.length - sizeof(fwts_acpi_table_header)) / 4; + /* Load any tables from XSDT if it's valid */ + if (rsdp->xsdt_address) { + if ((xsdt = fwts_acpi_load_table((off_t)rsdp->xsdt_address)) != NULL) { + fwts_acpi_add_table("XSDT", xsdt, (uint64_t)rsdp->xsdt_address, + xsdt->header.length, FWTS_ACPI_TABLE_FROM_FIRMWARE); + num_entries = (xsdt->header.length - sizeof(fwts_acpi_table_header)) / 8; for (i=0; ientries[i]) { - if ((header = fwts_acpi_load_table((off_t)rsdt->entries[i])) != NULL) { + if (xsdt->entries[i]) { + if ((header = fwts_acpi_load_table((off_t)xsdt->entries[i])) != NULL) { if (strncmp("FACP", header->signature, 4) == 0) fwts_acpi_handle_fadt((fwts_acpi_table_fadt*)header, FWTS_ACPI_TABLE_FROM_FIRMWARE); - fwts_acpi_add_table(header->signature, header, (uint64_t)rsdt->entries[i], + fwts_acpi_add_table(header->signature, header, xsdt->entries[i], header->length, FWTS_ACPI_TABLE_FROM_FIRMWARE); } } @@ -280,19 +280,19 @@ static int fwts_acpi_load_tables_from_firmware(void) } } - /* Load any tables from XSDT if it's valid */ - if (rsdp->xsdt_address) { - if ((xsdt = fwts_acpi_load_table((off_t)rsdp->xsdt_address)) != NULL) { - fwts_acpi_add_table("XSDT", xsdt, (uint64_t)rsdp->xsdt_address, - xsdt->header.length, FWTS_ACPI_TABLE_FROM_FIRMWARE); - num_entries = (xsdt->header.length - sizeof(fwts_acpi_table_header)) / 8; + /* Load any tables from RSDT if it's valid */ + if (rsdp->rsdt_address) { + if ((rsdt = fwts_acpi_load_table((off_t)rsdp->rsdt_address)) != NULL) { + fwts_acpi_add_table("RSDT", rsdt, (uint64_t)rsdp->rsdt_address, + rsdt->header.length, FWTS_ACPI_TABLE_FROM_FIRMWARE); + num_entries = (rsdt->header.length - sizeof(fwts_acpi_table_header)) / 4; for (i=0; ientries[i]) { - if ((header = fwts_acpi_load_table((off_t)xsdt->entries[i])) != NULL) { + if (rsdt->entries[i]) { + if ((header = fwts_acpi_load_table((off_t)rsdt->entries[i])) != NULL) { if (strncmp("FACP", header->signature, 4) == 0) fwts_acpi_handle_fadt((fwts_acpi_table_fadt*)header, FWTS_ACPI_TABLE_FROM_FIRMWARE); - fwts_acpi_add_table(header->signature, header, xsdt->entries[i], + fwts_acpi_add_table(header->signature, header, (uint64_t)rsdt->entries[i], header->length, FWTS_ACPI_TABLE_FROM_FIRMWARE); } }