]> xenbits.xensource.com Git - people/andrewcoop/seabios.git/commitdiff
acpi: Generalize find_fadt() and find_tcpa_by_rsdp() into find_acpi_table()
authorKevin O'Connor <kevin@koconnor.net>
Sun, 10 Jan 2016 15:53:24 +0000 (10:53 -0500)
committerKevin O'Connor <kevin@koconnor.net>
Sun, 27 Nov 2016 20:04:48 +0000 (15:04 -0500)
The find_fadt() and find_tcpa_by_rsdp() functions are very similar.
Create a new find_acpi_table() function and replace the two functions
with this new function.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
src/fw/biostables.c
src/std/acpi.h
src/tcgbios.c
src/util.h

index 9fb9ff9df25b7fe08347ff9b817f08533c5a0274..fe8626efc05d2b96c2e5b30740430bd1b7b057d3 100644 (file)
@@ -134,8 +134,8 @@ void *find_acpi_rsdp(void)
     return NULL;
 }
 
-static struct fadt_descriptor_rev1 *
-find_fadt(void)
+void *
+find_acpi_table(u32 signature)
 {
     dprintf(4, "rsdp=%p\n", RsdpAddr);
     if (!RsdpAddr || RsdpAddr->signature != RSDP_SIGNATURE)
@@ -147,20 +147,20 @@ find_fadt(void)
     void *end = (void*)rsdt + rsdt->length;
     int i;
     for (i=0; (void*)&rsdt->table_offset_entry[i] < end; i++) {
-        struct fadt_descriptor_rev1 *fadt = (void*)rsdt->table_offset_entry[i];
-        if (!fadt || fadt->signature != FACP_SIGNATURE)
+        struct acpi_table_header *tbl = (void*)rsdt->table_offset_entry[i];
+        if (!tbl || tbl->signature != signature)
             continue;
-        dprintf(4, "fadt=%p\n", fadt);
-        return fadt;
+        dprintf(4, "table(%x)=%p\n", signature, tbl);
+        return tbl;
     }
-    dprintf(4, "no fadt found\n");
+    dprintf(4, "no table %x found\n", signature);
     return NULL;
 }
 
 u32
 find_resume_vector(void)
 {
-    struct fadt_descriptor_rev1 *fadt = find_fadt();
+    struct fadt_descriptor_rev1 *fadt = find_acpi_table(FACP_SIGNATURE);
     if (!fadt)
         return 0;
     struct facs_descriptor_rev1 *facs = (void*)fadt->firmware_ctrl;
@@ -218,7 +218,7 @@ acpi_set_reset_reg(struct acpi_20_generic_address *reg, u8 val)
 void
 find_acpi_features(void)
 {
-    struct fadt_descriptor_rev1 *fadt = find_fadt();
+    struct fadt_descriptor_rev1 *fadt = find_acpi_table(FACP_SIGNATURE);
     if (!fadt)
         return;
     u32 pm_tmr = le32_to_cpu(fadt->pm_tmr_blk);
index b672bbee450cd4a1c3a7daf56ec64560dc89747e..c2ea7075951083b02eb20dcb62e5520b8e89362f 100644 (file)
@@ -294,12 +294,6 @@ struct acpi_table_mcfg {
     struct acpi_mcfg_allocation allocation[0];
 } PACKED;
 
-
-struct rsdt_descriptor {
-    ACPI_TABLE_HEADER_DEF
-    u32 entry[1];
-} PACKED;
-
 #define TCPA_SIGNATURE 0x41504354
 struct tcpa_descriptor_rev2
 {
@@ -313,5 +307,4 @@ struct tcpa_descriptor_rev2
 #define TCPA_ACPI_CLASS_CLIENT          0
 #define TCPA_ACPI_CLASS_SERVER          1
 
-
 #endif // acpi.h
index 5c40d62ed65db8a5c8d21890d42a391164a49437..5475535ac445723b736f50a9d1c472c12a4c48cb 100644 (file)
@@ -71,42 +71,10 @@ struct {
     u8 *          log_area_last_entry;
 } tpm_state VARLOW;
 
-static struct tcpa_descriptor_rev2 *
-find_tcpa_by_rsdp(struct rsdp_descriptor *rsdp)
-{
-    if (!rsdp) {
-        dprintf(DEBUG_tcg,
-                "TCGBIOS: RSDP was NOT found! -- Disabling interface.\n");
-        return NULL;
-    }
-    struct rsdt_descriptor *rsdt = (void*)rsdp->rsdt_physical_address;
-    if (!rsdt)
-        return NULL;
-
-    u32 length = rsdt->length;
-    u16 off = offsetof(struct rsdt_descriptor, entry);
-    u32 ctr = 0;
-    while ((off + sizeof(rsdt->entry[0])) <= length) {
-        /* try all pointers to structures */
-        struct tcpa_descriptor_rev2 *tcpa = (void*)rsdt->entry[ctr];
-
-        /* valid TCPA ACPI table ? */
-        if (tcpa->signature == TCPA_SIGNATURE
-            && checksum(tcpa, tcpa->length) == 0)
-            return tcpa;
-
-        off += sizeof(rsdt->entry[0]);
-        ctr++;
-    }
-
-    dprintf(DEBUG_tcg, "TCGBIOS: TCPA ACPI was NOT found!\n");
-    return NULL;
-}
-
 static int
 tpm_tcpa_probe(void)
 {
-    struct tcpa_descriptor_rev2 *tcpa = find_tcpa_by_rsdp(RsdpAddr);
+    struct tcpa_descriptor_rev2 *tcpa = find_acpi_table(TCPA_SIGNATURE);
     if (!tcpa)
         return -1;
 
index 557eb8b0d085beb6b3900fb2c7cbc0a1dda5bfb2..336eaaf13bd5d3391c68e50e8eb8f8a6b3c35e90 100644 (file)
@@ -72,6 +72,7 @@ extern struct rsdp_descriptor *RsdpAddr;
 extern u32 acpi_pm1a_cnt;
 extern u16 acpi_pm_base;
 void *find_acpi_rsdp(void);
+void *find_acpi_table(u32 signature);
 u32 find_resume_vector(void);
 void acpi_reboot(void);
 void find_acpi_features(void);