ACPI_STATUS AeInstallTables ( void) { ACPI_STATUS Status; ACPI_TABLE_HEADER Header; ACPI_TABLE_HEADER *Table; Status = AcpiInitializeTables (Tables, ACPI_MAX_INIT_TABLES, TRUE); AE_CHECK_OK (AcpiInitializeTables, Status); Status = AcpiReallocateRootTable (); AE_CHECK_OK (AcpiReallocateRootTable, Status); Status = AcpiLoadTables (); AE_CHECK_OK (AcpiLoadTables, Status); /* * Test run-time control method installation. Do it twice to test code * for an existing name. */ Status = AcpiInstallMethod (MethodCode); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("%s, Could not install method\n", AcpiFormatException (Status)); } Status = AcpiInstallMethod (MethodCode); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("%s, Could not install method\n", AcpiFormatException (Status)); } /* Test multiple table/UEFI support. First, get the headers */ Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 1, &Header); AE_CHECK_OK (AcpiGetTableHeader, Status); Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 2, &Header); AE_CHECK_OK (AcpiGetTableHeader, Status); Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 3, &Header); AE_CHECK_STATUS (AcpiGetTableHeader, Status, AE_NOT_FOUND); /* Now get the actual tables */ Status = AcpiGetTable (ACPI_SIG_UEFI, 1, &Table); AE_CHECK_OK (AcpiGetTable, Status); Status = AcpiGetTable (ACPI_SIG_UEFI, 2, &Table); AE_CHECK_OK (AcpiGetTable, Status); Status = AcpiGetTable (ACPI_SIG_UEFI, 3, &Table); AE_CHECK_STATUS (AcpiGetTable, Status, AE_NOT_FOUND); return (AE_OK); }
ACPI_STATUS AeInstallTables ( void) { ACPI_STATUS Status; ACPI_TABLE_HEADER Header; ACPI_TABLE_HEADER *Table; UINT32 i; Status = AcpiInitializeTables (NULL, ACPI_MAX_INIT_TABLES, TRUE); ACPI_CHECK_OK (AcpiInitializeTables, Status); if (AcpiGbl_LoadTestTables) { /* Test multiple table/UEFI support. First, get the headers */ Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 1, &Header); ACPI_CHECK_OK (AcpiGetTableHeader, Status); Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 2, &Header); ACPI_CHECK_OK (AcpiGetTableHeader, Status); Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 3, &Header); ACPI_CHECK_STATUS (AcpiGetTableHeader, Status, AE_NOT_FOUND); /* Now get the actual tables */ Status = AcpiGetTable (ACPI_SIG_UEFI, 1, &Table); ACPI_CHECK_OK (AcpiGetTable, Status); Status = AcpiGetTable (ACPI_SIG_UEFI, 2, &Table); ACPI_CHECK_OK (AcpiGetTable, Status); Status = AcpiGetTable (ACPI_SIG_UEFI, 3, &Table); ACPI_CHECK_STATUS (AcpiGetTable, Status, AE_NOT_FOUND); } /* Check that we can get all of the ACPI tables */ for (i = 0; ; i++) { Status = AcpiGetTableByIndex (i, &Table); if ((Status == AE_BAD_PARAMETER) || !Table) { break; } ACPI_CHECK_OK (AcpiGetTableByIndex, Status); } return (AE_OK); }
int acpi_table_quirks(int *quirks) { const struct acpi_q_entry *entry; const struct acpi_q_rule *match; ACPI_TABLE_HEADER fadt, dsdt, xsdt, *hdr; int done; /* First, allow the machdep system to set its idea of quirks. */ KASSERT(quirks != NULL, ("acpi quirks ptr is NULL")); acpi_machdep_quirks(quirks); if (ACPI_FAILURE(AcpiGetTableHeader(ACPI_SIG_FADT, 0, &fadt))) bzero(&fadt, sizeof(fadt)); if (ACPI_FAILURE(AcpiGetTableHeader(ACPI_SIG_DSDT, 0, &dsdt))) bzero(&dsdt, sizeof(dsdt)); if (ACPI_FAILURE(AcpiGetTableHeader(ACPI_SIG_XSDT, 0, &xsdt))) bzero(&xsdt, sizeof(xsdt)); /* Then, override the quirks with any matched from table signatures. */ for (entry = acpi_quirks_table; entry->match; entry++) { done = TRUE; for (match = entry->match; match->sig[0] != '\0'; match++) { if (!strncmp(match->sig, "FADT", ACPI_NAME_SIZE)) hdr = &fadt; else if (!strncmp(match->sig, ACPI_SIG_DSDT, ACPI_NAME_SIZE)) hdr = &dsdt; else if (!strncmp(match->sig, ACPI_SIG_XSDT, ACPI_NAME_SIZE)) hdr = &xsdt; else panic("invalid quirk header\n"); /* If we don't match any, skip to the next entry. */ if (aq_match_header(hdr, match) == FALSE) { done = FALSE; break; } } /* If all entries matched, update the quirks and return. */ if (done) { *quirks = entry->quirks; break; } } return (0); }
/* * Simple function to search the quirk table. Only to be * used after AcpiLoadTables() has been successfully called. */ int acpi_find_quirks(void) { ACPI_TABLE_HEADER fadt, dsdt, xsdt, *hdr; struct acpi_quirk *aq; ACPI_STATUS rv; size_t i, len; #ifdef ACPI_BLACKLIST_YEAR int year = acpi_quirks_bios_year(); if (year != -1 && year <= ACPI_BLACKLIST_YEAR) return ACPI_QUIRK_OLDBIOS; #endif rv = AcpiGetTableHeader(ACPI_SIG_FADT, 0, &fadt); if (ACPI_FAILURE(rv)) (void)memset(&fadt, 0, sizeof(fadt)); rv = AcpiGetTableHeader(ACPI_SIG_DSDT, 0, &dsdt); if (ACPI_FAILURE(rv)) (void)memset(&dsdt, 0, sizeof(dsdt)); rv = AcpiGetTableHeader(ACPI_SIG_XSDT, 0, &xsdt); if (ACPI_FAILURE(rv)) (void)memset(&xsdt, 0, sizeof(xsdt)); for (i = 0; i < __arraycount(acpi_quirks); i++) { aq = &acpi_quirks[i]; if (strncmp(aq->aq_tabletype, ACPI_SIG_DSDT, 4) == 0) hdr = &dsdt; else if (strncmp(aq->aq_tabletype, ACPI_SIG_XSDT, 4) == 0) hdr = &xsdt; else if (strncmp(aq->aq_tabletype, ACPI_SIG_FADT, 4) == 0) hdr = &fadt; else { continue; } len = strlen(aq->aq_oemid); if (strncmp(aq->aq_oemid, hdr->OemId, len) != 0) continue; if (acpi_quirks_revcmp(aq->aq_oemrev, hdr->OemRevision, aq->aq_cmpop) != 0) continue; len = strlen(aq->aq_tabid); if (strncmp(aq->aq_tabid, hdr->OemTableId, len) != 0) continue; return aq->aq_quirks; } return 0; }