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>
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)
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;
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);
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
{
#define TCPA_ACPI_CLASS_CLIENT 0
#define TCPA_ACPI_CLASS_SERVER 1
-
#endif // acpi.h
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;
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);