kernel/acpi: Add two debug tunables, debug.acpi.{ignore_xsdt,fadt_addr32}.
authorSascha Wildner <saw@online.de>
Sat, 29 Nov 2014 19:17:07 +0000 (20:17 +0100)
committerSascha Wildner <saw@online.de>
Sat, 29 Nov 2014 19:17:07 +0000 (20:17 +0100)
Used for affecting AcpiGbl_DoNotUseXsdt and AcpiGbl_Use32BitFadtAddresses,
which came in with 20131218.

share/man/man4/acpi.4
sys/dev/acpica/acpi.c

index 5edfec7..88379c5 100644 (file)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD: src/share/man/man4/acpi.4,v 1.61.8.1 2009/04/15 03:14:26 kensmith Exp $
 .\"
-.Dd July 1, 2014
+.Dd November 29, 2014
 .Dt ACPI 4
 .Os
 .Sh NAME
@@ -231,6 +231,10 @@ debugging purposes.
 .It Va debug.acpi.enabled
 Selectively enables portions of ACPI that are disabled by default, for
 debugging purposes.
+.It Va debug.acpi.fadt_addr32
+Favor 32-bit FADT register addresses over the 64-bit addresses.
+.It Va debug.acpi.ignore_xsdt
+Ignore the XSDT, forcing the use of the RSDT.
 .It Va debug.acpi.interpreter_slack
 Enable less strict ACPI implementations.
 Default is 1, ignore common BIOS mistakes.
index 00149a6..7bf2175 100644 (file)
@@ -256,7 +256,13 @@ static int acpi_debug_objects;
 TUNABLE_INT("debug.acpi.enable_debug_objects", &acpi_debug_objects);
 SYSCTL_PROC(_debug_acpi, OID_AUTO, enable_debug_objects,
     CTLFLAG_RW | CTLTYPE_INT, NULL, 0, acpi_debug_objects_sysctl, "I",
-    "Enable Debug objects");
+    "Enable Debug objects.");
+
+/* Allow ignoring the XSDT. */
+static int acpi_ignore_xsdt;
+TUNABLE_INT("debug.acpi.ignore_xsdt", &acpi_ignore_xsdt);
+SYSCTL_INT(_debug_acpi, OID_AUTO, ignore_xsdt, CTLFLAG_RD,
+    &acpi_ignore_xsdt, 1, "Ignore the XSDT, forcing the use of the RSDT.");
 
 /* Allow the interpreter to ignore common mistakes in BIOS. */
 static int acpi_interpreter_slack = 1;
@@ -264,6 +270,13 @@ TUNABLE_INT("debug.acpi.interpreter_slack", &acpi_interpreter_slack);
 SYSCTL_INT(_debug_acpi, OID_AUTO, interpreter_slack, CTLFLAG_RD,
     &acpi_interpreter_slack, 1, "Turn on interpreter slack mode.");
 
+/* Allow preferring 32-bit FADT register addresses over the 64-bit ones. */
+static int acpi_fadt_addr32;
+TUNABLE_INT("debug.acpi.fadt_addr32", &acpi_fadt_addr32);
+SYSCTL_INT(_debug_acpi, OID_AUTO, fadt_addr32, CTLFLAG_RD,
+    &acpi_fadt_addr32, 1,
+    "Prefer 32-bit FADT register addresses over 64-bit ones.");
+
 /* Power devices off and on in suspend and resume.  XXX Remove once tested. */
 static int acpi_do_powerstate = 1;
 TUNABLE_INT("debug.acpi.do_powerstate", &acpi_do_powerstate);
@@ -404,7 +417,8 @@ acpi_probe(device_t dev)
     if ((paddr = AcpiOsGetRootPointer()) == 0 ||
        (rsdp = AcpiOsMapMemory(paddr, sizeof(ACPI_TABLE_RSDP))) == NULL)
        return_VALUE (ENXIO);
-    if (rsdp->Revision > 1 && rsdp->XsdtPhysicalAddress != 0)
+    if (acpi_ignore_xsdt == 0 &&
+       rsdp->Revision > 1 && rsdp->XsdtPhysicalAddress != 0)
        paddr = (ACPI_PHYSICAL_ADDRESS)rsdp->XsdtPhysicalAddress;
     else
        paddr = (ACPI_PHYSICAL_ADDRESS)rsdp->RsdtPhysicalAddress;
@@ -472,8 +486,10 @@ acpi_attach(device_t dev)
      * uses UINT8 for some values and we have no tunable_byte.
      */
     AcpiGbl_AutoSerializeMethods = acpi_auto_serialize_methods ? TRUE : FALSE;
-    AcpiGbl_EnableInterpreterSlack = acpi_interpreter_slack ? TRUE : FALSE;
+    AcpiGbl_DoNotUseXsdt = acpi_ignore_xsdt ? TRUE : FALSE;
     AcpiGbl_EnableAmlDebugObject = acpi_debug_objects ? TRUE : FALSE;
+    AcpiGbl_EnableInterpreterSlack = acpi_interpreter_slack ? TRUE : FALSE;
+    AcpiGbl_Use32BitFadtAddresses = acpi_fadt_addr32 ? TRUE : FALSE;
 
 #ifndef ACPI_DEBUG
     /*