diff --git a/hal/halx86/acpi/halacpi.c b/hal/halx86/acpi/halacpi.c index 0d7b7887112..83a5ff64235 100644 --- a/hal/halx86/acpi/halacpi.c +++ b/hal/halx86/acpi/halacpi.c @@ -871,34 +871,85 @@ HalpSetupAcpiPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Setup the boot table */ HalpInitBootTable(LoaderBlock); - /* Debugging code */ + /* Log some ACPI data */ { - PLIST_ENTRY ListHead, NextEntry; - PACPI_CACHED_TABLE CachedTable; + PLIST_ENTRY NextEntry; + PCSTR AcpiVersion = NULL; - /* Loop cached tables */ - ListHead = &HalpAcpiTableCacheList; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) + /* Find the ACPI version (range) out */ + // v1.0+: Revision is major version. + // v5.1+: minor_revision is minor version. + // v6.4+: errata bits are errata version. + switch (Fadt->Header.Revision) { - /* Get the table */ - CachedTable = CONTAINING_RECORD(NextEntry, ACPI_CACHED_TABLE, Links); + case 0: // Should not happen. + AcpiVersion = "Unknown_0"; + break; + case 1: + AcpiVersion = "1.0-1.0b"; + break; + case 2: // Should not happen. + AcpiVersion = "Unknown_2"; + break; + case 3: + AcpiVersion = "1.5-2.0_C"; + break; + case 4: + AcpiVersion = "3.0-4.0_A"; + break; + case 5: + if (Fadt->minor_revision == 0) + AcpiVersion = "5.0-5.0_B"; + else if (Fadt->minor_revision == 1) + AcpiVersion = "5.1-5.1_B"; + break; + case 6: + if (Fadt->minor_revision == 0) + AcpiVersion = "6.0-6.0_A"; + else if (Fadt->minor_revision == 1) + AcpiVersion = "6.1-6.1_A"; + else if (Fadt->minor_revision == 2) + AcpiVersion = "6.2-6.2_B"; + else if (Fadt->minor_revision == 3) + AcpiVersion = "6.3-6.3_A"; + else if ((Fadt->minor_revision & 0x0F) == 0x04) + { + if ((Fadt->minor_revision & 0xF0) == 0x00) + AcpiVersion = "6.4"; + else if ((Fadt->minor_revision & 0xF0) == 0x10) + AcpiVersion = "6.4_A"; + } + else if (Fadt->minor_revision == 5) // v6.5_A too is documented as errata=0. + AcpiVersion = "6.5-6.6"; + break; + } - /* Compare signatures */ - if ((CachedTable->Header.Signature == RSDT_SIGNATURE) || - (CachedTable->Header.Signature == XSDT_SIGNATURE)) - { - DPRINT1("ACPI %u.0 Detected. Tables:", CachedTable->Header.Revision + 1); - } + /* Print the ACPI version */ + DPRINT1("ACPI v"); + if (AcpiVersion == NULL) + { + // Unknown past values, or newer than v6.6 (documented as 6.5). + DbgPrint("Unknown_%u_%u", Fadt->Header.Revision, Fadt->minor_revision); + } + else + { + DbgPrint("%s", AcpiVersion); + } + DbgPrint(" detected. Tables:"); + /* List cached tables */ + for (NextEntry = HalpAcpiTableCacheList.Flink; + NextEntry != &HalpAcpiTableCacheList; + NextEntry = NextEntry->Flink) + { + PACPI_CACHED_TABLE CachedTable = CONTAINING_RECORD(NextEntry, ACPI_CACHED_TABLE, Links); + + /* Print the table signature */ DbgPrint(" [%c%c%c%c]", CachedTable->Header.Signature & 0x000000FF, (CachedTable->Header.Signature & 0x0000FF00) >> 8, (CachedTable->Header.Signature & 0x00FF0000) >> 16, (CachedTable->Header.Signature & 0xFF000000) >> 24); - - /* Keep going */ - NextEntry = NextEntry->Flink; } DbgPrint("\n"); }