Bring in YONETANI Tomokazu's acpi-update-2.patch (27-May-2004), a major
authorMatthew Dillon <dillon@dragonflybsd.org>
Sun, 27 Jun 2004 08:52:46 +0000 (08:52 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sun, 27 Jun 2004 08:52:46 +0000 (08:52 +0000)
update to acpica5 support in the system that fixes more issues that can
be counted on 12, er, 10 fingers.

Submitted-by: YONETANI Tomokazu <qhwt+dragonfly-bugs@les.ath.cx>
53 files changed:
sys/dev/Makefile
sys/dev/acpica5/Makefile
sys/dev/acpica5/Makefile.inc [new file with mode: 0644]
sys/dev/acpica5/Osd/OsdDebug.c
sys/dev/acpica5/Osd/OsdHardware.c
sys/dev/acpica5/Osd/OsdInterrupt.c
sys/dev/acpica5/Osd/OsdMemory.c
sys/dev/acpica5/Osd/OsdSchedule.c
sys/dev/acpica5/Osd/OsdStream.c
sys/dev/acpica5/Osd/OsdSynch.c
sys/dev/acpica5/Osd/OsdTable.c
sys/dev/acpica5/acpi.c
sys/dev/acpica5/acpi_acad.c
sys/dev/acpica5/acpi_button.c
sys/dev/acpica5/acpi_cmbat.c
sys/dev/acpica5/acpi_cpu.c
sys/dev/acpica5/acpi_ec.c
sys/dev/acpica5/acpi_isab.c
sys/dev/acpica5/acpi_lid.c
sys/dev/acpica5/acpi_package.c
sys/dev/acpica5/acpi_pci.c
sys/dev/acpica5/acpi_pci_link.c
sys/dev/acpica5/acpi_pcib.c
sys/dev/acpica5/acpi_pcib_acpi.c
sys/dev/acpica5/acpi_pcib_pci.c
sys/dev/acpica5/acpi_powerres.c
sys/dev/acpica5/acpi_resource.c
sys/dev/acpica5/acpi_thermal.c
sys/dev/acpica5/acpi_timer.c
sys/dev/acpica5/acpi_toshiba/Makefile [new file with mode: 0644]
sys/dev/acpica5/acpica_support.c [deleted file]
sys/dev/acpica5/acpica_support.h [deleted file]
sys/dev/acpica5/acpivar.h
sys/i386/acpica5/Makefile
sys/i386/acpica5/OsdEnvironment.c
sys/i386/acpica5/acpi_machdep.c
sys/i386/acpica5/acpi_toshiba.c
sys/i386/acpica5/acpi_wakeup.c
sys/i386/acpica5/madt.c
sys/i386/apic/apicvar.h
sys/i386/i386/machdep.c
sys/i386/include/acpica_machdep.h
sys/i386/include/apicvar.h
sys/platform/pc32/acpica5/Makefile
sys/platform/pc32/acpica5/OsdEnvironment.c
sys/platform/pc32/acpica5/acpi_machdep.c
sys/platform/pc32/acpica5/acpi_toshiba.c
sys/platform/pc32/acpica5/acpi_wakeup.c
sys/platform/pc32/acpica5/madt.c
sys/platform/pc32/apic/apicvar.h
sys/platform/pc32/i386/machdep.c
sys/platform/pc32/include/acpica_machdep.h
sys/platform/pc32/include/apicvar.h

index 70871f1..3ea8a96 100644 (file)
@@ -1,7 +1,7 @@
-# $DragonFly: src/sys/dev/Makefile,v 1.4 2004/04/25 17:40:21 drhodus Exp $
+# $DragonFly: src/sys/dev/Makefile,v 1.5 2004/06/27 08:52:35 dillon Exp $
 #
 
-SUBDIR=agp crypto disk drm misc netif pccard powermng raid \
+SUBDIR=acpica5 agp crypto disk drm misc netif pccard powermng raid \
        serial sound usbmisc video
 
 .include <bsd.subdir.mk>
index 08f8cc9..2a91c3d 100644 (file)
@@ -1,7 +1,7 @@
 # $FreeBSD: src/sys/modules/acpi/acpi/Makefile,v 1.3 2004/01/08 16:38:32 njl Exp $
-# $DragonFly: src/sys/dev/acpica5/Makefile,v 1.1 2004/02/21 06:48:08 dillon Exp $
+# $DragonFly: src/sys/dev/acpica5/Makefile,v 1.2 2004/06/27 08:52:39 dillon Exp $
 
-SYSACPICA?= contrib/dev/acpica-unix-20031203
+.include "Makefile.inc"
 
 .PATH: ${.CURDIR}/../../${MACHINE_ARCH}/acpica5        \
        ${.CURDIR}/../../bus/pci                        \
@@ -81,9 +81,9 @@ opt_ddb.h: Makefile
 
 # Machine-specific code such as sleep/wakeup
 SRCS+= acpi_machdep.c acpi_wakecode.h acpi_wakeup.c
-.if ${MACHINE} == "i386"
-SRCS+= madt.c
-.endif
+#.if ${MACHINE} == "i386"
+#SRCS+=        madt.c
+#.endif
 CLEANFILES+=   acpi_wakecode.h acpi_wakecode.o acpi_wakecode.bin ${DBSRC}
 CLEANFILES+=   platform/acenv.h
 
@@ -106,5 +106,8 @@ ${.OBJDIR}/platform/acenv.h: ${.CURDIR}/../../${SYSACPICA}/include/platform/acen
 
 SRCS+= ${.OBJDIR}/acpi.h ${.OBJDIR}/platform/acenv.h
 
-.include <bsd.kmod.mk>
+SUBDIR=        acpi_toshiba
+all: ${PROG} ${SUBDIR}
 
+.include <bsd.kmod.mk>
+.include <bsd.subdir.mk>
diff --git a/sys/dev/acpica5/Makefile.inc b/sys/dev/acpica5/Makefile.inc
new file mode 100644 (file)
index 0000000..5c73686
--- /dev/null
@@ -0,0 +1,3 @@
+# $DragonFly: src/sys/dev/acpica5/Makefile.inc,v 1.1 2004/06/27 08:52:39 dillon Exp $
+
+SYSACPICA?= contrib/dev/acpica-unix-20031203
index dee8cc9..e324062 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/Osd/OsdDebug.c,v 1.5 2003/04/29 18:50:34 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/Osd/OsdDebug.c,v 1.1 2004/02/21 06:48:09 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/Osd/OsdDebug.c,v 1.7 2004/04/14 16:24:28 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/Osd/OsdDebug.c,v 1.2 2004/06/27 08:52:42 dillon Exp $
  */
 
 /*
 
 #include "opt_ddb.h"
 #include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/cons.h>
 #include <sys/kernel.h>
-
 #include <sys/bus.h>
-#include <machine/resource.h>
 #include <machine/bus.h>
-#include <sys/rman.h>
-
 #include <ddb/ddb.h>
 #include <ddb/db_output.h>
 
@@ -60,29 +54,28 @@ AcpiOsGetLine(char *Buffer)
     for (cp = Buffer; *cp != 0; cp++)
        if (*cp == '\n')
            *cp = 0;
-    return(AE_OK);
+    return (AE_OK);
 #else
     printf("AcpiOsGetLine called but no input support");
-    return(AE_NOT_EXIST);
-#endif
+    return (AE_NOT_EXIST);
+#endif /* DDB */
 }
 
 void
-AcpiOsDbgAssert(void *FailedAssertion, void *FileName, UINT32 LineNumber, char *Message)
+AcpiOsDbgAssert(void *FailedAssertion, void *FileName, UINT32 LineNumber,
+    char *Message)
 {
     printf("ACPI: %s:%d - %s\n", (char *)FileName, LineNumber, Message);
     printf("ACPI: assertion  %s\n", (char *)FailedAssertion);
 }
 
 ACPI_STATUS
-AcpiOsSignal (
-    UINT32                  Function,
-    void                    *Info)
+AcpiOsSignal(UINT32 Function, void *Info)
 {
     ACPI_SIGNAL_FATAL_INFO     *fatal;
     char                       *message;
     
-    switch(Function) {
+    switch (Function) {
     case ACPI_SIGNAL_FATAL:
        fatal = (ACPI_SIGNAL_FATAL_INFO *)Info;
        printf("ACPI fatal signal, type 0x%x  code 0x%x  argument 0x%x",
@@ -96,9 +89,9 @@ AcpiOsSignal (
        break;
 
     default:
-       return(AE_BAD_PARAMETER);
+       return (AE_BAD_PARAMETER);
     }
-    return(AE_OK);
+    return (AE_OK);
 }
 
 #ifdef ACPI_DEBUGGER
@@ -117,4 +110,4 @@ acpi_EnterDebugger(void)
     printf("Entering ACPICA debugger...\n");
     AcpiDbUserCommands('A', &obj);
 }
-#endif
+#endif /* ACPI_DEBUGGER */
index c7e1971..5e7d4fc 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/Osd/OsdHardware.c,v 1.11 2003/08/28 21:22:25 jhb Exp $
- * $DragonFly: src/sys/dev/acpica5/Osd/OsdHardware.c,v 1.1 2004/02/21 06:48:09 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/Osd/OsdHardware.c,v 1.13 2004/04/14 03:39:08 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/Osd/OsdHardware.c,v 1.2 2004/06/27 08:52:42 dillon Exp $
  */
 
 /*
 #endif
 
 ACPI_STATUS
-AcpiOsReadPort (
-    ACPI_IO_ADDRESS    InPort,
-    UINT32             *Value,
-    UINT32             Width)
+AcpiOsReadPort(ACPI_IO_ADDRESS InPort, UINT32 *Value, UINT32 Width)
 {
     switch (Width) {
     case 8:
-        *(u_int8_t *)Value = bus_space_read_1(ACPI_BUS_SPACE_IO, ACPI_BUS_HANDLE, InPort);
+        *(u_int8_t *)Value = bus_space_read_1(ACPI_BUS_SPACE_IO,
+           ACPI_BUS_HANDLE, InPort);
         break;
     case 16:
-        *(u_int16_t *)Value = bus_space_read_2(ACPI_BUS_SPACE_IO, ACPI_BUS_HANDLE, InPort);
+        *(u_int16_t *)Value = bus_space_read_2(ACPI_BUS_SPACE_IO,
+           ACPI_BUS_HANDLE, InPort);
         break;
     case 32:
-        *(u_int32_t *)Value = bus_space_read_4(ACPI_BUS_SPACE_IO, ACPI_BUS_HANDLE, InPort);
+        *(u_int32_t *)Value = bus_space_read_4(ACPI_BUS_SPACE_IO,
+           ACPI_BUS_HANDLE, InPort);
         break;
     default:
         /* debug trap goes here */
        break;
     }
 
-    return(AE_OK);
+    return (AE_OK);
 }
 
 ACPI_STATUS
-AcpiOsWritePort (
-    ACPI_IO_ADDRESS    OutPort,
-    UINT32             Value,
-    UINT32             Width)
+AcpiOsWritePort(ACPI_IO_ADDRESS OutPort, UINT32 Value, UINT32 Width)
 {
     switch (Width) {
     case 8:
@@ -108,23 +105,21 @@ AcpiOsWritePort (
        break;
     }
 
-    return(AE_OK);
+    return (AE_OK);
 }
 
 ACPI_STATUS
-AcpiOsReadPciConfiguration (
-    ACPI_PCI_ID                *PciId,
-    UINT32             Register,
-    void               *Value,
-    UINT32             Width)
+AcpiOsReadPciConfiguration(ACPI_PCI_ID *PciId, UINT32 Register, void *Value,
+    UINT32 Width)
 {
     u_int32_t  byte_width = Width / 8;
     u_int32_t  val;
 
     if (!pci_cfgregopen())
-        return(AE_NOT_EXIST);
+        return (AE_NOT_EXIST);
 
-    val = pci_cfgregread(PciId->Bus, PciId->Device, PciId->Function, Register, byte_width);
+    val = pci_cfgregread(PciId->Bus, PciId->Device, PciId->Function, Register,
+       byte_width);
     switch (Width) {
     case 8:
        *(u_int8_t *)Value = val & 0xff;
@@ -140,30 +135,27 @@ AcpiOsReadPciConfiguration (
        break;
     }
     
-
-    return(AE_OK);
+    return (AE_OK);
 }
 
 
 ACPI_STATUS
-AcpiOsWritePciConfiguration (
-    ACPI_PCI_ID                *PciId,
-    UINT32             Register,
-    ACPI_INTEGER       Value,
-    UINT32             Width)
+AcpiOsWritePciConfiguration(ACPI_PCI_ID *PciId, UINT32 Register,
+    ACPI_INTEGER Value, UINT32 Width)
 {
     u_int32_t  byte_width = Width / 8;
 
     if (!pci_cfgregopen())
-       return(AE_NOT_EXIST);
+       return (AE_NOT_EXIST);
 
-    pci_cfgregwrite(PciId->Bus, PciId->Device, PciId->Function, Register, Value, byte_width);
+    pci_cfgregwrite(PciId->Bus, PciId->Device, PciId->Function, Register,
+       Value, byte_width);
 
-    return(AE_OK);
+    return (AE_OK);
 }
 
 /* XXX should use acpivar.h but too many include dependencies */
-extern ACPI_STATUS acpi_EvaluateInteger(ACPI_HANDLE handle, char *path, int
+extern ACPI_STATUS acpi_GetInteger(ACPI_HANDLE handle, char *path, int
     *number);
 
 /*
@@ -173,33 +165,37 @@ static int
 acpi_bus_number(ACPI_HANDLE root, ACPI_HANDLE curr, ACPI_PCI_ID *PciId)
 {
     ACPI_HANDLE parent;
+    ACPI_STATUS status;
     ACPI_OBJECT_TYPE type;
     UINT32 adr;
     int bus, slot, func, class, subclass, header;
 
-    /* Try to get the _BBN object of the root, otherwise assume it is 0 */
+    /* Try to get the _BBN object of the root, otherwise assume it is 0. */
     bus = 0;
     if (root == curr) {
-        if (ACPI_FAILURE(acpi_EvaluateInteger(root, "_BBN", &bus)) &&
-          bootverbose)
-            printf("acpi_bus_number: root bus has no _BBN, assuming 0\n");
+       status = acpi_GetInteger(root, "_BBN", &bus);
+       if (ACPI_FAILURE(status) && bootverbose)
+           printf("acpi_bus_number: root bus has no _BBN, assuming 0\n");
        return (bus);
     }
-    if (ACPI_FAILURE(AcpiGetParent(curr, &parent)))
-        return (bus);
+    status = AcpiGetParent(curr, &parent);
+    if (ACPI_FAILURE(status))
+       return (bus);
     
-    /* First, recurse up the tree until we find the host bus */
+    /* First, recurse up the tree until we find the host bus. */
     bus = acpi_bus_number(root, parent, PciId);
 
-    /* Validate parent bus device type */
+    /* Validate parent bus device type. */
     if (ACPI_FAILURE(AcpiGetType(parent, &type)) || type != ACPI_TYPE_DEVICE) {
-        printf("acpi_bus_number: not a device, type %d\n", type);
-        return (bus);
+       printf("acpi_bus_number: not a device, type %d\n", type);
+       return (bus);
     }
-    /* Get the parent's slot and function */
-    if (ACPI_FAILURE(acpi_EvaluateInteger(parent, "_ADR", &adr))) {
-        printf("acpi_bus_number: can't get _ADR\n");
-        return (bus);
+
+    /* Get the parent's slot and function. */
+    status = acpi_GetInteger(parent, "_ADR", &adr);
+    if (ACPI_FAILURE(status)) {
+       printf("acpi_bus_number: can't get _ADR\n");
+       return (bus);
     }
     slot = ACPI_HIWORD(adr);
     func = ACPI_LOWORD(adr);
@@ -207,14 +203,15 @@ acpi_bus_number(ACPI_HANDLE root, ACPI_HANDLE curr, ACPI_PCI_ID *PciId)
     /* Is this a PCI-PCI or Cardbus-PCI bridge? */
     class = pci_cfgregread(bus, slot, func, PCIR_CLASS, 1);
     if (class != PCIC_BRIDGE)
-        return (bus);
+       return (bus);
     subclass = pci_cfgregread(bus, slot, func, PCIR_SUBCLASS, 1);
-    /* Find the header type, masking off the multifunction bit */
+
+    /* Find the header type, masking off the multifunction bit. */
     header = pci_cfgregread(bus, slot, func, PCIR_HDRTYPE, 1) & PCIM_HDRTYPE;
     if (header == PCIM_HDRTYPE_BRIDGE && subclass == PCIS_BRIDGE_PCI)
-        bus = pci_cfgregread(bus, slot, func, PCIR_SECBUS_1, 1);
+       bus = pci_cfgregread(bus, slot, func, PCIR_SECBUS_1, 1);
     if (header == PCIM_HDRTYPE_CARDBUS && subclass == PCIS_BRIDGE_CARDBUS)
-        bus = pci_cfgregread(bus, slot, func, PCIR_SECBUS_2, 1);
+       bus = pci_cfgregread(bus, slot, func, PCIR_SECBUS_2, 1);
     return (bus);
 }
 
@@ -226,24 +223,23 @@ acpi_bus_number(ACPI_HANDLE root, ACPI_HANDLE curr, ACPI_PCI_ID *PciId)
  * PciId: pointer to device slot and function, we fill out bus
  */
 void
-AcpiOsDerivePciId (
-    ACPI_HANDLE                rhandle,
-    ACPI_HANDLE                chandle,
-    ACPI_PCI_ID                **PciId)
+AcpiOsDerivePciId(ACPI_HANDLE rhandle, ACPI_HANDLE chandle, ACPI_PCI_ID **PciId)
 {
     ACPI_HANDLE parent;
+    ACPI_STATUS status;
     int bus;
 
     if (pci_cfgregopen() == 0)
-        panic("AcpiOsDerivePciId unable to initialize pci bus");
+       panic("AcpiOsDerivePciId unable to initialize pci bus");
 
     /* Try to read _BBN for bus number if we're at the root */
     bus = 0;
     if (rhandle == chandle) {
-        if (ACPI_FAILURE(acpi_EvaluateInteger(rhandle, "_BBN", &bus)) &&
-          bootverbose)
-            printf("AcpiOsDerivePciId: root bus has no _BBN, assuming 0\n");
+       status = acpi_GetInteger(rhandle, "_BBN", &bus);
+       if (ACPI_FAILURE(status) && bootverbose)
+           printf("AcpiOsDerivePciId: root bus has no _BBN, assuming 0\n");
     }
+
     /*
      * Get the parent handle and call the recursive case.  It is not
      * clear why we seem to be getting a chandle that points to a child
@@ -251,10 +247,10 @@ AcpiOsDerivePciId (
      * here works.
      */
     if (ACPI_SUCCESS(AcpiGetParent(chandle, &parent)))
-        bus = acpi_bus_number(rhandle, parent, *PciId);
+       bus = acpi_bus_number(rhandle, parent, *PciId);
     (*PciId)->Bus = bus;
     if (bootverbose) {
-        printf("AcpiOsDerivePciId: bus %d dev %d func %d\n",
-            (*PciId)->Bus, (*PciId)->Device, (*PciId)->Function);
+       printf("AcpiOsDerivePciId: bus %d dev %d func %d\n",
+           (*PciId)->Bus, (*PciId)->Device, (*PciId)->Function);
     }
 }
index 0a44013..2d6f1ae 100644 (file)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/Osd/OsdInterrupt.c,v 1.15 2003/11/12 16:24:16 jhb Exp $
- * $DragonFly: src/sys/dev/acpica5/Osd/OsdInterrupt.c,v 1.1 2004/02/21 06:48:09 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/Osd/OsdInterrupt.c,v 1.17 2004/04/14 03:41:06 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/Osd/OsdInterrupt.c,v 1.2 2004/06/27 08:52:42 dillon Exp $
  */
 
 /*
  * 6.5 : Interrupt handling
  */
 
-#include "acpi.h"
-
+#include <sys/param.h>
+#include <sys/kernel.h>
 #include <sys/bus.h>
-#include <machine/resource.h>
 #include <machine/bus.h>
+#include <machine/resource.h>
 #include <sys/rman.h>
  
+#include "acpi.h"
 #include <dev/acpica5/acpivar.h>
 
 #define _COMPONENT     ACPI_OS_SERVICES
 ACPI_MODULE_NAME("INTERRUPT")
 
 static void            InterruptWrapper(void *arg);
-static OSD_HANDLER     InterruptHandler;
 
-static UINT32 InterruptOverride = 0;
+static OSD_HANDLER     InterruptHandler;
+static UINT32          InterruptOverride = 0;
 
-/*
- * XXX this does not correctly free resources in the case of partically successful
- * attachment.
- */
 ACPI_STATUS
-AcpiOsInstallInterruptHandler(UINT32 InterruptNumber, OSD_HANDLER ServiceRoutine, void *Context)
+AcpiOsInstallInterruptHandler(UINT32 InterruptNumber,
+    OSD_HANDLER ServiceRoutine, void *Context)
 {
     struct acpi_softc  *sc;
 
@@ -65,71 +63,83 @@ AcpiOsInstallInterruptHandler(UINT32 InterruptNumber, OSD_HANDLER ServiceRoutine
     if (sc->acpi_dev == NULL)
        panic("acpi softc has invalid device");
 
-    if ((InterruptNumber < 0) || (InterruptNumber > 255))
-       return_ACPI_STATUS(AE_BAD_PARAMETER);
+    if (InterruptNumber < 0 || InterruptNumber > 255)
+       return_ACPI_STATUS (AE_BAD_PARAMETER);
     if (ServiceRoutine == NULL)
-       return_ACPI_STATUS(AE_BAD_PARAMETER);
-    if (InterruptHandler != NULL && InterruptHandler != ServiceRoutine) {
-       device_printf(sc->acpi_dev, "can't register more than one ACPI interrupt\n");
-       return_ACPI_STATUS(AE_BAD_PARAMETER);
+       return_ACPI_STATUS (AE_BAD_PARAMETER);
+    if (InterruptHandler != NULL) {
+       device_printf(sc->acpi_dev, "interrupt handler already installed\n");
+       return_ACPI_STATUS (AE_ALREADY_EXISTS);
     }
     InterruptHandler = ServiceRoutine;
 
     /*
-     * This isn't strictly true, as we ought to be able to handle > 1 interrupt.  The ACPI
-     * spec doesn't call for this though.
+     * If the MADT contained an interrupt override directive for the SCI,
+     * we use that value instead of the one from the FADT.
      */
-    if (sc->acpi_irq != NULL) {
-       device_printf(sc->acpi_dev, "attempt to register more than one interrupt handler\n");
-       return_ACPI_STATUS(AE_ALREADY_EXISTS);
-    }
-    sc->acpi_irq_rid = 0;
     if (InterruptOverride != 0) {
            device_printf(sc->acpi_dev,
                "Overriding SCI Interrupt from IRQ %u to IRQ %u\n",
                InterruptNumber, InterruptOverride);
            InterruptNumber = InterruptOverride;
     }
+
+    /* Set up the interrupt resource. */
+    sc->acpi_irq_rid = 0;
     bus_set_resource(sc->acpi_dev, SYS_RES_IRQ, 0, InterruptNumber, 1);
-    if ((sc->acpi_irq = bus_alloc_resource(sc->acpi_dev, SYS_RES_IRQ, &sc->acpi_irq_rid, 0, ~0, 1, 
-                                          RF_SHAREABLE | RF_ACTIVE)) == NULL) {
-       device_printf(sc->acpi_dev, "could not allocate SCI interrupt\n");
-       return_ACPI_STATUS(AE_ALREADY_EXISTS);
+    sc->acpi_irq = bus_alloc_resource_any(sc->acpi_dev, SYS_RES_IRQ,
+       &sc->acpi_irq_rid, RF_SHAREABLE | RF_ACTIVE);
+    if (sc->acpi_irq == NULL) {
+       device_printf(sc->acpi_dev, "could not allocate interrupt\n");
+       goto error;
     }
-    if (bus_setup_intr(sc->acpi_dev, sc->acpi_irq, INTR_TYPE_MISC, (driver_intr_t *)InterruptWrapper,
-                      Context, &sc->acpi_irq_handle)) {
-       device_printf(sc->acpi_dev, "could not set up SCI interrupt\n");
-       return_ACPI_STATUS(AE_ALREADY_EXISTS);
+    if (bus_setup_intr(sc->acpi_dev, sc->acpi_irq, INTR_TYPE_MISC,
+       InterruptWrapper, Context, &sc->acpi_irq_handle)) {
+       device_printf(sc->acpi_dev, "could not set up interrupt\n");
+       goto error;
     }
-       
-    return_ACPI_STATUS(AE_OK);
+
+    return_ACPI_STATUS (AE_OK);
+
+error:
+    if (sc->acpi_irq_handle)
+       bus_teardown_intr(sc->acpi_dev, sc->acpi_irq, sc->acpi_irq_handle);
+    sc->acpi_irq_handle = NULL;
+    if (sc->acpi_irq)
+       bus_release_resource(sc->acpi_dev, SYS_RES_IRQ, 0, sc->acpi_irq);
+    sc->acpi_irq = NULL;
+    bus_delete_resource(sc->acpi_dev, SYS_RES_IRQ, 0);
+    InterruptHandler = NULL;
+
+    return_ACPI_STATUS (AE_ALREADY_EXISTS);
 }
 
 ACPI_STATUS
-AcpiOsRemoveInterruptHandler (UINT32 InterruptNumber, OSD_HANDLER ServiceRoutine)
+AcpiOsRemoveInterruptHandler(UINT32 InterruptNumber, OSD_HANDLER ServiceRoutine)
 {
     struct acpi_softc  *sc;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
-    if ((InterruptNumber < 0) || (InterruptNumber > 255))
-       return_ACPI_STATUS(AE_BAD_PARAMETER);
+    if (InterruptNumber < 0 || InterruptNumber > 255)
+       return_ACPI_STATUS (AE_BAD_PARAMETER);
     if (ServiceRoutine == NULL)
-       return_ACPI_STATUS(AE_BAD_PARAMETER);
+       return_ACPI_STATUS (AE_BAD_PARAMETER);
 
     if ((sc = devclass_get_softc(devclass_find("acpi"), 0)) == NULL)
        panic("can't find ACPI device to deregister interrupt");
 
     if (sc->acpi_irq == NULL)
-       return_ACPI_STATUS(AE_NOT_EXIST);
+       return_ACPI_STATUS (AE_NOT_EXIST);
 
     bus_teardown_intr(sc->acpi_dev, sc->acpi_irq, sc->acpi_irq_handle);
     bus_release_resource(sc->acpi_dev, SYS_RES_IRQ, 0, sc->acpi_irq);
     bus_delete_resource(sc->acpi_dev, SYS_RES_IRQ, 0);
 
     sc->acpi_irq = NULL;
+    InterruptHandler = NULL;
 
-    return_ACPI_STATUS(AE_OK);
+    return_ACPI_STATUS (AE_OK);
 }
 
 ACPI_STATUS
@@ -139,14 +149,11 @@ acpi_OverrideInterruptLevel(UINT32 InterruptNumber)
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     if (InterruptOverride != 0)
-       return_ACPI_STATUS(AE_ALREADY_EXISTS);
+       return_ACPI_STATUS (AE_ALREADY_EXISTS);
     InterruptOverride = InterruptNumber;
-    return_ACPI_STATUS(AE_OK);
+    return_ACPI_STATUS (AE_OK);
 }
 
-/*
- * Interrupt handler wrapper.
- */
 static void
 InterruptWrapper(void *arg)
 {
index 37e44c6..0e33e51 100644 (file)
@@ -25,8 +25,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/Osd/OsdMemory.c,v 1.10 2003/07/14 02:42:15 marcel Exp $
- * $DragonFly: src/sys/dev/acpica5/Osd/OsdMemory.c,v 1.2 2004/05/05 22:18:10 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/Osd/OsdMemory.c,v 1.11 2004/04/14 03:39:08 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/Osd/OsdMemory.c,v 1.3 2004/06/27 08:52:42 dillon Exp $
  */
 
 /*
@@ -40,7 +40,7 @@
 #include <vm/vm.h>
 #include <vm/pmap.h>
 
-static MALLOC_DEFINE(M_ACPICA, "acpica", "ACPI CA memory pool");
+MALLOC_DEFINE(M_ACPICA, "acpica", "ACPI CA memory pool");
 
 struct acpi_memtrack {
     struct acpi_memtrack *next;
@@ -55,24 +55,25 @@ static acpi_memtrack_t acpi_mapbase;
 void *
 AcpiOsAllocate(ACPI_SIZE Size)
 {
-    return(malloc(Size, M_ACPICA, M_INTWAIT));
+    return (malloc(Size, M_ACPICA, M_INTWAIT));
 }
 
 void
-AcpiOsFree (void *Memory)
+AcpiOsFree(void *Memory)
 {
     free(Memory, M_ACPICA);
 }
 
 ACPI_STATUS
-AcpiOsMapMemory (ACPI_PHYSICAL_ADDRESS PhysicalAddress, ACPI_SIZE Length, void **LogicalAddress)
+AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS PhysicalAddress, ACPI_SIZE Length,
+    void **LogicalAddress)
 {
     acpi_memtrack_t track;
 
     *LogicalAddress = pmap_mapdev((vm_offset_t)PhysicalAddress, Length);
-    if (*LogicalAddress == NULL) {
+    if (*LogicalAddress == NULL)
        return(AE_BAD_ADDRESS);
-    else {
+    else {
        track = malloc(sizeof(struct acpi_memtrack), M_ACPICA, M_INTWAIT);
        track->next = acpi_mapbase;
        track->base = *LogicalAddress;
@@ -83,7 +84,7 @@ AcpiOsMapMemory (ACPI_PHYSICAL_ADDRESS PhysicalAddress, ACPI_SIZE Length, void *
 }
 
 void
-AcpiOsUnmapMemory (void *LogicalAddress, ACPI_SIZE Length)
+AcpiOsUnmapMemory(void *LogicalAddress, ACPI_SIZE Length)
 {
     struct acpi_memtrack **ptrack;
     acpi_memtrack_t track;
@@ -132,10 +133,11 @@ again:
 }
 
 ACPI_STATUS
-AcpiOsGetPhysicalAddress(void *LogicalAddress, ACPI_PHYSICAL_ADDRESS *PhysicalAddress)
+AcpiOsGetPhysicalAddress(void *LogicalAddress,
+    ACPI_PHYSICAL_ADDRESS *PhysicalAddress)
 {
-    /* we can't necessarily do this, so cop out */
-    return(AE_BAD_ADDRESS);
+    /* We can't necessarily do this, so cop out. */
+    return (AE_BAD_ADDRESS);
 }
 
 /*
@@ -145,26 +147,22 @@ AcpiOsGetPhysicalAddress(void *LogicalAddress, ACPI_PHYSICAL_ADDRESS *PhysicalAd
 BOOLEAN
 AcpiOsReadable (void *Pointer, ACPI_SIZE Length)
 {
-    return(TRUE);
+    return (TRUE);
 }
 
 BOOLEAN
 AcpiOsWritable (void *Pointer, ACPI_SIZE Length)
 {
-    return(TRUE);
+    return (TRUE);
 }
 
 ACPI_STATUS
-AcpiOsReadMemory (
-    ACPI_PHYSICAL_ADDRESS      Address,
-    UINT32                     *Value,
-    UINT32                     Width)
+AcpiOsReadMemory(ACPI_PHYSICAL_ADDRESS Address, UINT32 *Value, UINT32 Width)
 {
     void       *LogicalAddress;
 
-    if (AcpiOsMapMemory(Address, Width / 8, &LogicalAddress) != AE_OK) {
-       return(AE_NOT_EXIST);
-    }
+    if (AcpiOsMapMemory(Address, Width / 8, &LogicalAddress) != AE_OK)
+       return (AE_NOT_EXIST);
 
     switch (Width) {
     case 8:
@@ -186,20 +184,16 @@ AcpiOsReadMemory (
 
     AcpiOsUnmapMemory(LogicalAddress, Width / 8);
 
-    return(AE_OK);
+    return (AE_OK);
 }
 
 ACPI_STATUS
-AcpiOsWriteMemory (
-    ACPI_PHYSICAL_ADDRESS      Address,
-    UINT32                     Value,
-    UINT32                     Width)
+AcpiOsWriteMemory(ACPI_PHYSICAL_ADDRESS Address, UINT32 Value, UINT32 Width)
 {
     void       *LogicalAddress;
 
-    if (AcpiOsMapMemory(Address, Width / 8, &LogicalAddress) != AE_OK) {
-       return(AE_NOT_EXIST);
-    }
+    if (AcpiOsMapMemory(Address, Width / 8, &LogicalAddress) != AE_OK)
+       return (AE_NOT_EXIST);
 
     switch (Width) {
     case 8:
@@ -221,5 +215,5 @@ AcpiOsWriteMemory (
 
     AcpiOsUnmapMemory(LogicalAddress, Width / 8);
 
-    return(AE_OK);
+    return (AE_OK);
 }
index 25c8cdf..af0b6ea 100644 (file)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/Osd/OsdSchedule.c,v 1.26 2003/10/02 05:09:37 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/Osd/OsdSchedule.c,v 1.2 2004/05/05 22:18:10 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/Osd/OsdSchedule.c,v 1.28 2004/05/06 02:18:58 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/Osd/OsdSchedule.c,v 1.3 2004/06/27 08:52:42 dillon Exp $
  */
 
 /*
  * 6.3 : Scheduling services
  */
 
-#include "acpi.h"
-
 #include "opt_acpi.h"
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -46,8 +44,7 @@
 #include <sys/taskqueue.h>
 #include <machine/clock.h>
 
-#include <sys/bus.h>
-
+#include "acpi.h"
 #include <dev/acpica5/acpivar.h>
 
 #define _COMPONENT     ACPI_OS_SERVICES
@@ -97,7 +94,7 @@ TASKQUEUE_DEFINE(acpi, taskqueue_acpi_enqueue, 0,
                     SWI_TQ, 0, &taskqueue_acpi_ih));
 
 #ifdef ACPI_USE_THREADS
-STAILQ_HEAD(, acpi_task_queue) acpi_task_queue;
+static STAILQ_HEAD(, acpi_task_queue) acpi_task_queue;
 static struct mtx      acpi_task_mtx;
 
 static void
@@ -152,11 +149,13 @@ acpi_task_thread_init(void)
     }
     return (err);
 }
-#endif
-#endif
+#endif /* ACPI_USE_THREADS */
+#endif /* __FreeBSD_version >= 500000 */
 
+/* This function is called in interrupt context. */
 ACPI_STATUS
-AcpiOsQueueForExecution(UINT32 Priority, OSD_EXECUTION_CALLBACK Function, void *Context)
+AcpiOsQueueForExecution(UINT32 Priority, OSD_EXECUTION_CALLBACK Function,
+    void *Context)
 {
     struct acpi_task   *at;
     int pri;
@@ -164,7 +163,7 @@ AcpiOsQueueForExecution(UINT32 Priority, OSD_EXECUTION_CALLBACK Function, void *
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     if (Function == NULL)
-       return_ACPI_STATUS(AE_BAD_PARAMETER);
+       return_ACPI_STATUS (AE_BAD_PARAMETER);
 
     /* Note: Interrupt Context */
     at = malloc(sizeof(*at), M_ACPITASK, M_INTWAIT | M_ZERO);
@@ -185,16 +184,16 @@ AcpiOsQueueForExecution(UINT32 Priority, OSD_EXECUTION_CALLBACK Function, void *
        break;
     default:
        free(at, M_ACPITASK);
-       return_ACPI_STATUS(AE_BAD_PARAMETER);
+       return_ACPI_STATUS (AE_BAD_PARAMETER);
     }
     TASK_INIT(&at->at_task, pri, AcpiOsExecuteQueue, at);
 
-#if __FreeBSD_version < 500000
-    taskqueue_enqueue(taskqueue_swi, (struct task *)at);
-#else
+#if __FreeBSD_version >= 500000
     taskqueue_enqueue(taskqueue_acpi, (struct task *)at);
+#else
+    taskqueue_enqueue(taskqueue_swi, (struct task *)at);
 #endif
-    return_ACPI_STATUS(AE_OK);
+    return_ACPI_STATUS (AE_OK);
 }
 
 static void
@@ -231,10 +230,6 @@ AcpiOsExecuteQueue(void *arg, int pending)
     return_VOID;
 }
 
-/*
- * We don't have any sleep granularity better than hz, so
- * make do with that.
- */
 void
 AcpiOsSleep(UINT32 Seconds, UINT32 Milliseconds)
 {
@@ -270,7 +265,8 @@ UINT32
 AcpiOsGetThreadId(void)
 {
     struct proc *p;
-    /* XXX do not add FUNCTION_TRACE here, results in recursive call */
+
+    /* XXX do not add ACPI_FUNCTION_TRACE here, results in recursive call. */
 
     p = curproc;
 #if __FreeBSD_version < 500000
@@ -278,5 +274,7 @@ AcpiOsGetThreadId(void)
        p = &proc0;
 #endif
     KASSERT(p != NULL, ("%s: curproc is NULL!", __func__));
-    return(p->p_pid + 1);      /* can't return 0 */
+
+    /* Returning 0 is not allowed. */
+    return (p->p_pid + 1);
 }
index 3da30fd..92b6340 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/Osd/OsdStream.c,v 1.3 2003/04/29 18:50:34 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/Osd/OsdStream.c,v 1.1 2004/02/21 06:48:09 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/Osd/OsdStream.c,v 1.4 2004/04/14 03:39:08 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/Osd/OsdStream.c,v 1.2 2004/06/27 08:52:42 dillon Exp $
  */
 
 /*
@@ -35,7 +35,7 @@
 #include "acpi.h"
 
 void
-AcpiOsPrintf (const char *Format, ...)
+AcpiOsPrintf(const char *Format, ...)
 {
     va_list    ap;
 
@@ -45,8 +45,7 @@ AcpiOsPrintf (const char *Format, ...)
 }
 
 void
-AcpiOsVprintf (const char *Format, va_list Args)
+AcpiOsVprintf(const char *Format, va_list Args)
 {
     vprintf(Format, Args);
 }
-
index 736c213..08f974c 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/Osd/OsdSynch.c,v 1.18 2003/09/26 21:22:10 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/Osd/OsdSynch.c,v 1.3 2004/05/05 22:18:10 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/Osd/OsdSynch.c,v 1.21 2004/05/05 20:07:52 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/Osd/OsdSynch.c,v 1.4 2004/06/27 08:52:42 dillon Exp $
  */
 
 /*
@@ -44,7 +44,7 @@
 #define _COMPONENT     ACPI_OS_SERVICES
 ACPI_MODULE_NAME("SYNCH")
 
-static MALLOC_DEFINE(M_ACPISEM, "acpisem", "ACPI semaphore");
+MALLOC_DEFINE(M_ACPISEM, "acpisem", "ACPI semaphore");
 
 #if defined(__DragonFly__)
 # define AS_LOCK(as)           s = splhigh()
@@ -63,7 +63,7 @@ static MALLOC_DEFINE(M_ACPISEM, "acpisem", "ACPI semaphore");
 #endif
 
 /*
- * Simple counting semaphore implemented using a mutex. (Subsequently used
+ * Simple counting semaphore implemented using a mutex.  (Subsequently used
  * in the OSI code to implement a mutex.  Go figure.)
  */
 struct acpi_semaphore {
@@ -86,10 +86,11 @@ TUNABLE_INT("debug.acpi_semaphore_debug", &acpi_semaphore_debug);
 SYSCTL_DECL(_debug_acpi);
 SYSCTL_INT(_debug_acpi, OID_AUTO, semaphore_debug, CTLFLAG_RW,
           &acpi_semaphore_debug, 0, "Enable ACPI semaphore debug messages");
-#endif
+#endif /* !ACPI_NO_SEMAPHORES */
 
 ACPI_STATUS
-AcpiOsCreateSemaphore(UINT32 MaxUnits, UINT32 InitialUnits, ACPI_HANDLE *OutHandle)
+AcpiOsCreateSemaphore(UINT32 MaxUnits, UINT32 InitialUnits,
+    ACPI_HANDLE *OutHandle)
 {
 #ifndef ACPI_NO_SEMAPHORES
     struct acpi_semaphore      *as;
@@ -97,11 +98,12 @@ AcpiOsCreateSemaphore(UINT32 MaxUnits, UINT32 InitialUnits, ACPI_HANDLE *OutHand
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     if (OutHandle == NULL)
-       return(AE_BAD_PARAMETER);
+       return_ACPI_STATUS (AE_BAD_PARAMETER);
     if (InitialUnits > MaxUnits)
-       return_ACPI_STATUS(AE_BAD_PARAMETER);
+       return_ACPI_STATUS (AE_BAD_PARAMETER);
 
     as = malloc(sizeof(*as), M_ACPISEM, M_INTWAIT | M_ZERO);
+
 #if __FreeBSD_version >= 500000
     mtx_init(&as->as_mtx, "ACPI semaphore", NULL, MTX_DEF);
 #endif
@@ -114,20 +116,18 @@ AcpiOsCreateSemaphore(UINT32 MaxUnits, UINT32 InitialUnits, ACPI_HANDLE *OutHand
        as, InitialUnits, MaxUnits));
 
     *OutHandle = (ACPI_HANDLE)as;
-    return_ACPI_STATUS(AE_OK);
 #else
     *OutHandle = (ACPI_HANDLE)OutHandle;
-    return(AE_OK);
-#endif
+#endif /* !ACPI_NO_SEMAPHORES */
+
+    return_ACPI_STATUS (AE_OK);
 }
 
 ACPI_STATUS
-AcpiOsDeleteSemaphore (ACPI_HANDLE Handle)
+AcpiOsDeleteSemaphore(ACPI_HANDLE Handle)
 {
 #ifndef ACPI_NO_SEMAPHORES
-#if __FreeBSD_version >= 500000
     struct acpi_semaphore *as = (struct acpi_semaphore *)Handle;
-#endif
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
@@ -136,10 +136,9 @@ AcpiOsDeleteSemaphore (ACPI_HANDLE Handle)
     mtx_destroy(&as->as_mtx);
 #endif
     free(Handle, M_ACPISEM);
-    return_ACPI_STATUS(AE_OK);
-#else
-    return(AE_OK);
-#endif
+#endif /* !ACPI_NO_SEMAPHORES */
+
+    return_ACPI_STATUS (AE_OK);
 }
 
 /*
@@ -151,8 +150,8 @@ ACPI_STATUS
 AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT16 Timeout)
 {
 #ifndef ACPI_NO_SEMAPHORES
-    struct acpi_semaphore      *as = (struct acpi_semaphore *)Handle;
     ACPI_STATUS                        result;
+    struct acpi_semaphore      *as = (struct acpi_semaphore *)Handle;
     int                                rv, tmo;
     struct timeval             timeouttv, currenttv, timelefttv;
     AS_LOCK_DECL;
@@ -160,10 +159,10 @@ AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT16 Timeout)
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     if (as == NULL)
-       return_ACPI_STATUS(AE_BAD_PARAMETER);
+       return_ACPI_STATUS (AE_BAD_PARAMETER);
 
     if (cold)
-       return_ACPI_STATUS(AE_OK);
+       return_ACPI_STATUS (AE_OK);
 
 #if 0
     if (as->as_units < Units && as->as_timeouts > 10) {
@@ -175,12 +174,11 @@ AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT16 Timeout)
        as->as_timeouts = 0;
        wakeup(as);
        AS_UNLOCK(as);
-       return_ACPI_STATUS(AE_TIME);
+       return_ACPI_STATUS (AE_TIME);
     }
 
-    if (as->as_resetting) {
-       return_ACPI_STATUS(AE_TIME);
-    }
+    if (as->as_resetting)
+       return_ACPI_STATUS (AE_TIME);
 #endif
 
     /* a timeout of ACPI_WAIT_FOREVER means "forever" */
@@ -267,19 +265,22 @@ AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT16 Timeout)
        getmicrotime(&currenttv);
        timevalsub(&timelefttv, &currenttv);
        if (timelefttv.tv_sec < 0) {
-           ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "await semaphore %p timeout\n", as));
+           ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "await semaphore %p timeout\n",
+               as));
            result = AE_TIME;
            break;
        }
 
        /* adjust timeout for the next sleep */
-       tmo = (timelefttv.tv_sec * 1000000 + timelefttv.tv_usec) / (1000000 / hz);
+       tmo = (timelefttv.tv_sec * 1000000 + timelefttv.tv_usec) /
+           (1000000 / hz);
        if (tmo <= 0)
            tmo = 1;
 
        if (acpi_semaphore_debug) {
-           printf("%s: Wakeup timeleft(%lu, %lu), tmo %u, semaphore %p, thread %d\n",
-               __func__, timelefttv.tv_sec, timelefttv.tv_usec, tmo, as, AcpiOsGetThreadId());
+           printf("%s: Wakeup timeleft(%lu, %lu), tmo %u, sem %p, thread %d\n",
+               __func__, timelefttv.tv_sec, timelefttv.tv_usec, tmo, as,
+               AcpiOsGetThreadId());
        }
     }
 
@@ -289,23 +290,22 @@ AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT16 Timeout)
                __func__, Timeout, as->as_pendings, as);
        }
        if (result == AE_OK && (as->as_timeouts > 0 || as->as_pendings > 0)) {
-           printf("%s: Acquire %d, units %d, pending %d, semaphore %p, thread %d\n",
-               __func__, Units, as->as_units, as->as_pendings, as, AcpiOsGetThreadId());
+           printf("%s: Acquire %d, units %d, pending %d, sem %p, thread %d\n",
+               __func__, Units, as->as_units, as->as_pendings, as,
+               AcpiOsGetThreadId());
        }
     }
 
-    if (result == AE_TIME) {
+    if (result == AE_TIME)
        as->as_timeouts++;
-    } else {
+    else
        as->as_timeouts = 0;
-    }
 
     AS_UNLOCK(as);
-
-    return_ACPI_STATUS(result);
+    return_ACPI_STATUS (result);
 #else
-    return(AE_OK);
-#endif
+    return_ACPI_STATUS (AE_OK);
+#endif /* !ACPI_NO_SEMAPHORES */
 }
 
 ACPI_STATUS
@@ -337,14 +337,13 @@ AcpiOsSignalSemaphore(ACPI_HANDLE Handle, UINT32 Units)
 
     wakeup(as);
     AS_UNLOCK(as);
-    return_ACPI_STATUS(AE_OK);
-#else
-    return(AE_OK);
-#endif
+#endif /* !ACPI_NO_SEMAPHORES */
+
+    return_ACPI_STATUS (AE_OK);
 }
 
 ACPI_STATUS
-AcpiOsCreateLock (ACPI_HANDLE *OutHandle)
+AcpiOsCreateLock(ACPI_HANDLE *OutHandle)
 {
     lwkt_rwlock_t lock;
 
@@ -393,3 +392,49 @@ AcpiOsReleaseLock (ACPI_HANDLE Handle, UINT32 Flags)
         return;
     lwkt_exunlock(lock);
 }
+
+#ifdef notyet
+/* Section 5.2.9.1:  global lock acquire/release functions */
+#define GL_ACQUIRED    (-1)
+#define GL_BUSY                0
+#define GL_BIT_PENDING 0x1
+#define GL_BIT_OWNED   0x2
+#define GL_BIT_MASK    (GL_BIT_PENDING | GL_BIT_OWNED)
+
+/*
+ * Acquire the global lock.  If busy, set the pending bit.  The caller
+ * will wait for notification from the BIOS that the lock is available
+ * and then attempt to acquire it again.
+ */
+int
+acpi_acquire_global_lock(uint32_t *lock)
+{
+       uint32_t new, old;
+
+       do {
+               old = *lock;
+               new = ((old & ~GL_BIT_MASK) | GL_BIT_OWNED) |
+                       ((old >> 1) & GL_BIT_PENDING);
+       } while (atomic_cmpset_acq_int(lock, old, new) == 0);
+
+       return ((new < GL_BIT_MASK) ? GL_ACQUIRED : GL_BUSY);
+}
+
+/*
+ * Release the global lock, returning whether there is a waiter pending.
+ * If the BIOS set the pending bit, OSPM must notify the BIOS when it
+ * releases the lock.
+ */
+int
+acpi_release_global_lock(uint32_t *lock)
+{
+       uint32_t new, old;
+
+       do {
+               old = *lock;
+               new = old & ~GL_BIT_MASK;
+       } while (atomic_cmpset_rel_int(lock, old, new) == 0);
+
+       return (old & GL_BIT_PENDING);
+}
+#endif /* notyet */
index ffee06b..afd6c02 100644 (file)
@@ -23,8 +23,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/Osd/OsdTable.c,v 1.6 2004/02/14 03:17:30 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/Osd/OsdTable.c,v 1.1 2004/02/21 06:48:09 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/Osd/OsdTable.c,v 1.7 2004/04/20 17:13:08 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/Osd/OsdTable.c,v 1.2 2004/06/27 08:52:42 dillon Exp $
  */
 
 /*
@@ -67,30 +67,17 @@ AcpiOsTableOverride (
     caddr_t                 acpi_dsdt, p;
 
     if (ExistingTable == NULL || NewTable == NULL)
-    {
         return(AE_BAD_PARAMETER);
-    }
-
-    (*NewTable) = NULL;
 
+    *NewTable = NULL;
     if (strncmp(ExistingTable->Signature, "DSDT", 4) != 0)
-    {
         return(AE_OK);
-    }
-
     if ((acpi_dsdt = preload_search_by_type("acpi_dsdt")) == NULL)
-    {
         return(AE_OK);
-    }
-        
     if ((p = preload_search_info(acpi_dsdt, MODINFO_ADDR)) == NULL)
-    {
         return(AE_OK);
-    }
-
-    (*NewTable) = *(void **)p;
 
+    *NewTable = *(void **)p;
     printf("ACPI: DSDT was overridden.\n");
-
-    return(AE_OK);
+    return (AE_OK);
 }
index 597df64..e62c945 100644 (file)
@@ -26,8 +26,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *     $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.118 2004/02/19 18:20:03 njl Exp $
- *     $DragonFly: src/sys/dev/acpica5/acpi.c,v 1.4 2004/05/19 22:52:40 dillon Exp $
+ *     $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.145 2004/05/06 08:04:34 njl Exp $
+ *     $DragonFly: src/sys/dev/acpica5/acpi.c,v 1.5 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -47,6 +47,7 @@
 #include <sys/sbuf.h>
 
 #include <machine/clock.h>
+#include <machine/globaldata.h>
 #include <machine/resource.h>
 #include <machine/bus.h>
 #include <sys/rman.h>
@@ -79,20 +80,32 @@ static struct cdevsw acpi_cdevsw = {
        .old_ioctl = acpiioctl
 };
 
-static const char* sleep_state_names[] = {
-    "S0", "S1", "S2", "S3", "S4", "S5", "NONE"};
-
-/* this has to be static, as the softc is gone when we need it */
-static int acpi_off_state = ACPI_STATE_S5;
-
 #if __FreeBSD_version >= 500000
 struct mtx     acpi_mutex;
 #endif
 
+struct acpi_quirks {
+    char       *OemId;
+    uint32_t   OemRevision;
+    char       *value;
+};
+
+#define ACPI_OEM_REV_ANY       0
+
+static struct acpi_quirks acpi_quirks_table[] = {
+#ifdef notyet
+    /* Bad PCI routing table.  Used on some SuperMicro boards. */
+    { "PTLTD ", 0x06040000, "pci_link" },
+#endif
+
+    { NULL, 0, NULL }
+};
+
 static int     acpi_modevent(struct module *mod, int event, void *junk);
 static void    acpi_identify(driver_t *driver, device_t parent);
 static int     acpi_probe(device_t dev);
 static int     acpi_attach(device_t dev);
+static void    acpi_quirks_set(void);
 static device_t        acpi_add_child(device_t bus, int order, const char *name,
                        int unit);
 static int     acpi_print_child(device_t bus, device_t child);
@@ -118,12 +131,17 @@ static ACPI_STATUS acpi_probe_child(ACPI_HANDLE handle, UINT32 level,
                        void *context, void **status);
 static void    acpi_shutdown_pre_sync(void *arg, int howto);
 static void    acpi_shutdown_final(void *arg, int howto);
+static void    acpi_shutdown_poweroff(void *arg);
 static void    acpi_enable_fixed_events(struct acpi_softc *sc);
 static void    acpi_system_eventhandler_sleep(void *arg, int state);
 static void    acpi_system_eventhandler_wakeup(void *arg, int state);
 static int     acpi_supported_sleep_state_sysctl(SYSCTL_HANDLER_ARGS);
 static int     acpi_sleep_state_sysctl(SYSCTL_HANDLER_ARGS);
 static int     acpi_pm_func(u_long cmd, void *arg, ...);
+static int     acpi_child_location_str_method(device_t acdev, device_t child,
+                                              char *buf, size_t buflen);
+static int     acpi_child_pnpinfo_str_method(device_t acdev, device_t child,
+                                             char *buf, size_t buflen);
 
 static device_method_t acpi_methods[] = {
     /* Device interface */
@@ -144,6 +162,8 @@ static device_method_t acpi_methods[] = {
     DEVMETHOD(bus_get_resource,                acpi_get_resource),
     DEVMETHOD(bus_alloc_resource,      acpi_alloc_resource),
     DEVMETHOD(bus_release_resource,    acpi_release_resource),
+    DEVMETHOD(bus_child_pnpinfo_str,   acpi_child_pnpinfo_str_method),
+    DEVMETHOD(bus_child_location_str,  acpi_child_location_str_method),
     DEVMETHOD(bus_driver_added,                bus_generic_driver_added),
     DEVMETHOD(bus_activate_resource,   bus_generic_activate_resource),
     DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
@@ -164,13 +184,37 @@ static driver_t acpi_driver = {
 
 static devclass_t acpi_devclass;
 DRIVER_MODULE(acpi, nexus, acpi_driver, acpi_devclass, acpi_modevent, 0);
-MODULE_VERSION(acpi, 100);
+MODULE_VERSION(acpi, 1);
+
+static const char* sleep_state_names[] = {
+    "S0", "S1", "S2", "S3", "S4", "S5", "NONE"};
 
 SYSCTL_NODE(_debug, OID_AUTO, acpi, CTLFLAG_RW, NULL, "ACPI debugging");
 static char acpi_ca_version[12];
 SYSCTL_STRING(_debug_acpi, OID_AUTO, acpi_ca_version, CTLFLAG_RD,
              acpi_ca_version, 0, "Version of Intel ACPI-CA");
 
+/*
+ * Allow override of whether methods execute in parallel or not.
+ * Enable this for serial behavior, which fixes "AE_ALREADY_EXISTS"
+ * errors for AML that really can't handle parallel method execution.
+ * It is off by default since this breaks recursive methods and
+ * some IBMs use such code.
+ */
+static int acpi_serialize_methods;
+TUNABLE_INT("hw.acpi.serialize_methods", &acpi_serialize_methods);
+
+/*
+ * Allow override of whether to support the _OSI method.  This allows us
+ * to claim compatibility with various MS OSs without changing the value
+ * we report for _OS.  This is enabled by default since it fixes some
+ * problems with interrupt routing although it can be disabled if it
+ * causes problems.  See the definition of "AcpiGbl_ValidOsiStrings" for
+ * a list of systems we claim.
+ */
+static int acpi_osi_method = TRUE;
+TUNABLE_INT("hw.acpi.osi_method", &acpi_osi_method);
+
 /*
  * ACPI can only be loaded as a module by the loader; activating it after
  * system bootstrap time is not useful, and can be fatal to the system.
@@ -211,7 +255,7 @@ acpi_Startup(void)
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     if (started)
-       return_VALUE(error);
+       return_VALUE (error);
     started = 1;
 
 #if __FreeBSD_version >= 500000
@@ -219,6 +263,16 @@ acpi_Startup(void)
     mtx_init(&acpi_mutex, "ACPI global lock", NULL, MTX_DEF);
 #endif
 
+#if notyet
+    /*
+     * Set the globals from our tunables.  This is needed because ACPI-CA
+     * uses UINT8 for some values and we have no tunable_uint8.
+     */
+    AcpiGbl_AllMethodsSerialized = acpi_serialize_methods;
+    AcpiGbl_CreateOsiMethod = acpi_osi_method;
+    AcpiGbl_LeaveWakeGpesDisabled = FALSE;
+#endif /* notyet */
+
     /* Start up the ACPI CA subsystem. */
 #ifdef ACPI_DEBUGGER
     debugpoint = getenv("debug.acpi.debugger");
@@ -230,7 +284,7 @@ acpi_Startup(void)
 #endif
     if (ACPI_FAILURE(error = AcpiInitializeSubsystem())) {
        printf("ACPI: initialisation failed: %s\n", AcpiFormatException(error));
-       return_VALUE(error);
+       return_VALUE (error);
     }
 #ifdef ACPI_DEBUGGER
     debugpoint = getenv("debug.acpi.debugger");
@@ -245,7 +299,13 @@ acpi_Startup(void)
        printf("ACPI: table load failed: %s\n", AcpiFormatException(error));
        return_VALUE(error);
     }
-    return_VALUE(AE_OK);
+
+    /* Set up any quirks we have for this XSDT. */
+    acpi_quirks_set();
+    if (acpi_disabled("acpi"))
+       return_VALUE (AE_ERROR);
+
+    return_VALUE (AE_OK);
 }
 
 /*
@@ -265,9 +325,6 @@ acpi_identify(driver_t *driver, device_t parent)
     if (resource_disabled("acpi", 0))
        return_VOID;
 
-    snprintf(acpi_ca_version, sizeof(acpi_ca_version), "0x%x",
-            ACPI_CA_VERSION);
-
     /* Make sure we're not being doubly invoked. */
     if (device_find_child(parent, "acpi", 0) != NULL)
        return_VOID;
@@ -276,6 +333,8 @@ acpi_identify(driver_t *driver, device_t parent)
     if (ACPI_FAILURE(acpi_Startup()))
        return_VOID;
 
+    snprintf(acpi_ca_version, sizeof(acpi_ca_version), "%#x", ACPI_CA_VERSION);
+
     /* Attach the actual ACPI device. */
     if ((child = BUS_ADD_CHILD(parent, 0, "acpi", 0)) == NULL) {
        device_printf(parent, "ACPI: could not attach\n");
@@ -332,8 +391,9 @@ acpi_attach(device_t dev)
 {
     struct acpi_softc  *sc;
     ACPI_STATUS                status;
-    int                        error;
+    int                        error, state;
     UINT32             flags;
+    UINT8              TypeA, TypeB;
     char               *env;
 #ifdef ACPI_DEBUGGER
     char               *debugpoint;
@@ -479,15 +539,22 @@ acpi_attach(device_t dev)
            sc->acpi_s4bios = 1;
 
     /*
-     * Dispatch the default sleep state to devices.
-     * TBD: should be configured from userland policy manager.
+     * Dispatch the default sleep state to devices.  The lid switch is set
+     * to NONE by default to avoid surprising users.
      */
-    sc->acpi_power_button_sx = ACPI_POWER_BUTTON_DEFAULT_SX;
-    sc->acpi_sleep_button_sx = ACPI_SLEEP_BUTTON_DEFAULT_SX;
-    sc->acpi_lid_switch_sx = ACPI_LID_SWITCH_DEFAULT_SX;
+    sc->acpi_power_button_sx = ACPI_STATE_S5;
+    sc->acpi_lid_switch_sx = ACPI_S_STATES_MAX + 1;
     sc->acpi_standby_sx = ACPI_STATE_S1;
     sc->acpi_suspend_sx = ACPI_STATE_S3;
 
+    /* Pick the first valid sleep state for the sleep button default. */
+    sc->acpi_sleep_button_sx = ACPI_S_STATES_MAX + 1;
+    for (state = ACPI_STATE_S1; state < ACPI_STATE_S5; state++)
+       if (ACPI_SUCCESS(AcpiGetSleepTypeData(state, &TypeA, &TypeB))) {
+           sc->acpi_sleep_button_sx = state;
+           break;
+       }
+
     acpi_enable_fixed_events(sc);
 
     /*
@@ -558,6 +625,57 @@ acpi_attach(device_t dev)
     return_VALUE (error);
 }
 
+static void
+acpi_quirks_set()
+{
+    XSDT_DESCRIPTOR *xsdt;
+    struct acpi_quirks *quirk;
+    char *env, *tmp;
+    int len;
+
+    /*
+     * If the user loaded a custom table or disabled "quirks", leave
+     * the settings alone.
+     */
+    len = 0;
+    if ((env = getenv("acpi_dsdt_load")) != NULL) {
+       /* XXX No strcasecmp but this is good enough. */
+       if (*env == 'Y' || *env == 'y')
+           goto out;
+       freeenv(env);
+    }
+    if ((env = getenv("debug.acpi.disabled")) != NULL) {
+       if (strstr("quirks", env) != NULL)
+           goto out;
+       len = strlen(env);
+    }
+
+    /*
+     * Search through our quirk table and concatenate the disabled
+     * values with whatever we find.
+     */
+    xsdt = AcpiGbl_XSDT;
+    for (quirk = acpi_quirks_table; quirk->OemId; quirk++) {
+       if (!strncmp(xsdt->OemId, quirk->OemId, strlen(quirk->OemId)) &&
+           (xsdt->OemRevision == quirk->OemRevision ||
+           quirk->OemRevision == ACPI_OEM_REV_ANY)) {
+               len += strlen(quirk->value) + 2;
+               if ((tmp = malloc(len, M_TEMP, M_NOWAIT)) == NULL)
+                   goto out;
+               sprintf(tmp, "%s %s", env ? env : "", quirk->value);
+#ifdef notyet
+               setenv("debug.acpi.disabled", tmp);
+#endif /* notyet */
+               free(tmp, M_TEMP);
+               break;
+       }
+    }
+
+out:
+    if (env)
+       freeenv(env);
+}
+
 /*
  * Handle a new device being added
  */
@@ -594,6 +712,48 @@ acpi_print_child(device_t bus, device_t child)
     return (retval);
 }
 
+/* Location hint for devctl(8) */
+static int
+acpi_child_location_str_method(device_t cbdev, device_t child, char *buf,
+    size_t buflen)
+{
+    struct acpi_device *dinfo = device_get_ivars(child);
+
+    if (dinfo->ad_handle)
+       snprintf(buf, buflen, "path=%s", acpi_name(dinfo->ad_handle));
+    else
+       snprintf(buf, buflen, "magic=unknown");
+    return (0);
+}
+
+/* PnP information for devctl(8) */
+static int
+acpi_child_pnpinfo_str_method(device_t cbdev, device_t child, char *buf,
+    size_t buflen)
+{
+    ACPI_BUFFER adbuf = {ACPI_ALLOCATE_BUFFER, NULL};
+    ACPI_DEVICE_INFO *adinfo;
+    struct acpi_device *dinfo = device_get_ivars(child);
+    char *end;
+    int error;
+
+    error = AcpiGetObjectInfo(dinfo->ad_handle, &adbuf);
+    adinfo = (ACPI_DEVICE_INFO *) adbuf.Pointer;
+
+    if (error)
+       snprintf(buf, buflen, "Unknown");
+    else
+       snprintf(buf, buflen, "_HID=%s _UID=%lu",
+               (adinfo->Valid & ACPI_VALID_HID) ?
+               adinfo->HardwareId.Value : "UNKNOWN",
+               (adinfo->Valid & ACPI_VALID_UID) ?
+               strtoul(adinfo->UniqueId.Value, &end, 10) : 0);
+
+    if (adinfo)
+       AcpiOsFree(adinfo);
+
+    return (0);
+}
 
 /*
  * Handle per-device ivars
@@ -662,82 +822,6 @@ acpi_write_ivar(device_t dev, device_t child, int index, uintptr_t value)
     return (0);
 }
 
-ACPI_HANDLE
-acpi_get_handle(device_t dev)
-{
-    uintptr_t up;
-    ACPI_HANDLE        h;
-
-    if (BUS_READ_IVAR(device_get_parent(dev), dev, ACPI_IVAR_HANDLE, &up))
-       return(NULL);
-    h = (ACPI_HANDLE)up;
-    return (h);
-}
-           
-int
-acpi_set_handle(device_t dev, ACPI_HANDLE h)
-{
-    uintptr_t up;
-
-    up = (uintptr_t)h;
-    return (BUS_WRITE_IVAR(device_get_parent(dev), dev, ACPI_IVAR_HANDLE, up));
-}
-           
-int
-acpi_get_magic(device_t dev)
-{
-    uintptr_t up;
-    int        m;
-
-    if (BUS_READ_IVAR(device_get_parent(dev), dev, ACPI_IVAR_MAGIC, &up))
-       return(0);
-    m = (int)up;
-    return (m);
-}
-
-int
-acpi_set_magic(device_t dev, int m)
-{
-    uintptr_t up;
-
-    up = (uintptr_t)m;
-    return (BUS_WRITE_IVAR(device_get_parent(dev), dev, ACPI_IVAR_MAGIC, up));
-}
-
-void *
-acpi_get_private(device_t dev)
-{
-    uintptr_t up;
-    void *p;
-
-    if (BUS_READ_IVAR(device_get_parent(dev), dev, ACPI_IVAR_PRIVATE, &up))
-       return (NULL);
-    p = (void *)up;
-    return (p);
-}
-
-int
-acpi_set_private(device_t dev, void *p)
-{
-    uintptr_t up;
-
-    up = (uintptr_t)p;
-    return (BUS_WRITE_IVAR(device_get_parent(dev), dev, ACPI_IVAR_PRIVATE, up));
-}
-
-ACPI_OBJECT_TYPE
-acpi_get_type(device_t dev)
-{
-    ACPI_HANDLE                h;
-    ACPI_OBJECT_TYPE   t;
-
-    if ((h = acpi_get_handle(dev)) == NULL)
-       return (ACPI_TYPE_NOT_FOUND);
-    if (AcpiGetType(h, &t) != AE_OK)
-       return (ACPI_TYPE_NOT_FOUND);
-    return (t);
-}
-
 /*
  * Handle child resource allocation/removal
  */
@@ -815,7 +899,7 @@ acpi_bus_alloc_gas(device_t dev, int *rid, ACPI_GENERIC_ADDRESS *gas)
     }
 
     bus_set_resource(dev, type, *rid, gas->Address, gas->RegisterBitWidth / 8);
-    return (bus_alloc_resource(dev, type, rid, 0, ~0, 1, RF_ACTIVE));
+    return (bus_alloc_resource_any(dev, type, rid, RF_ACTIVE));
 }
 
 /*
@@ -1058,7 +1142,7 @@ acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status)
             * device.  Ignore the return value here; it's OK for the
             * device not to have any resources.
             */
-           acpi_parse_resources(child, handle, &acpi_res_parse_set);
+           acpi_parse_resources(child, handle, &acpi_res_parse_set, NULL);
 
            /* If we're debugging, probe/attach now rather than later */
            ACPI_DEBUG_EXEC(device_probe_and_attach(child));
@@ -1092,31 +1176,57 @@ static void
 acpi_shutdown_final(void *arg, int howto)
 {
     ACPI_STATUS        status;
-
     ACPI_ASSERTLOCK;
 
+    /*
+     * If powering off, run the actual shutdown code on each processor.
+     * It will only perform the shutdown on the BSP.  Some chipsets do
+     * not power off the system correctly if called from an AP.
+     */
     if ((howto & RB_POWEROFF) != 0) {
-       printf("Powering system off using ACPI\n");
-       status = AcpiEnterSleepStatePrep(acpi_off_state);
+       status = AcpiEnterSleepStatePrep(ACPI_STATE_S5);
        if (ACPI_FAILURE(status)) {
            printf("AcpiEnterSleepStatePrep failed - %s\n",
                   AcpiFormatException(status));
            return;
        }
-       ACPI_DISABLE_IRQS();
-       status = AcpiEnterSleepState(acpi_off_state);
-       if (ACPI_FAILURE(status)) {
-           printf("ACPI power-off failed - %s\n", AcpiFormatException(status));
-       } else {
-           DELAY(1000000);
-           printf("ACPI power-off failed - timeout\n");
-       }
+       printf("Powering system off using ACPI\n");
+#ifdef notyet
+       smp_rendezvous(NULL, acpi_shutdown_poweroff, NULL, NULL);
+#else
+       acpi_shutdown_poweroff(NULL);
+#endif /* notyet */
     } else {
        printf("Shutting down ACPI\n");
        AcpiTerminate();
     }
 }
 
+/*
+ * Since this function may be called with locks held or in an unknown
+ * context, it cannot allocate memory, acquire locks, sleep, etc.
+ */
+static void
+acpi_shutdown_poweroff(void *arg)
+{
+    ACPI_STATUS        status;
+
+    ACPI_ASSERTLOCK;
+
+    /* Only attempt to power off if this is the BSP (cpuid 0). */
+    if (mdcpu->mi.gd_cpuid != 0)
+       return;
+
+    ACPI_DISABLE_IRQS();
+    status = AcpiEnterSleepState(ACPI_STATE_S5);
+    if (ACPI_FAILURE(status)) {
+       printf("ACPI power-off failed - %s\n", AcpiFormatException(status));
+    } else {
+       DELAY(1000000);
+       printf("ACPI power-off failed - timeout\n");
+    }
+}
+
 static void
 acpi_enable_fixed_events(struct acpi_softc *sc)
 {
@@ -1286,6 +1396,21 @@ acpi_GetHandleInScope(ACPI_HANDLE parent, char *path, ACPI_HANDLE *result)
     }
 }
 
+/* Find the difference between two PM tick counts. */
+uint32_t
+acpi_TimerDelta(uint32_t end, uint32_t start)
+{
+    uint32_t delta;
+
+    if (end >= start)
+       delta = end - start;
+    else if (AcpiGbl_FADT->TmrValExt == 0)
+       delta = ((0x00FFFFFF - start) + end + 1) & 0x00FFFFFF;
+    else
+       delta = ((0xFFFFFFFF - start) + end + 1);
+    return (delta);
+}
+
 /*
  * Allocate a buffer with a preset data size.
  */
@@ -1300,11 +1425,27 @@ acpi_AllocBuffer(int size)
     return (buf);
 }
 
+ACPI_STATUS
+acpi_SetInteger(ACPI_HANDLE handle, char *path, UINT32 number)
+{
+    ACPI_OBJECT arg1;
+    ACPI_OBJECT_LIST args;
+
+    ACPI_ASSERTLOCK;
+
+    arg1.Type = ACPI_TYPE_INTEGER;
+    arg1.Integer.Value = number;
+    args.Count = 1;
+    args.Pointer = &arg1;
+
+    return (AcpiEvaluateObject(handle, path, &args, NULL));
+}
+
 /*
  * Evaluate a path that should return an integer.
  */
 ACPI_STATUS
-acpi_EvaluateInteger(ACPI_HANDLE handle, char *path, int *number)
+acpi_GetInteger(ACPI_HANDLE handle, char *path, UINT32 *number)
 {
     ACPI_STATUS        status;
     ACPI_BUFFER        buf;
@@ -1351,9 +1492,10 @@ acpi_EvaluateInteger(ACPI_HANDLE handle, char *path, int *number)
 }
 
 ACPI_STATUS
-acpi_ConvertBufferToInteger(ACPI_BUFFER *bufp, int *number)
+acpi_ConvertBufferToInteger(ACPI_BUFFER *bufp, UINT32 *number)
 {
     ACPI_OBJECT        *p;
+    UINT8      *val;
     int                i;
 
     p = (ACPI_OBJECT *)bufp->Pointer;
@@ -1367,8 +1509,9 @@ acpi_ConvertBufferToInteger(ACPI_BUFFER *bufp, int *number)
        return (AE_BAD_DATA);
 
     *number = 0;
+    val = p->Buffer.Pointer;
     for (i = 0; i < p->Buffer.Length; i++)
-       *number += (*(p->Buffer.Pointer + i) << (i * 8));
+       *number += val[i] << (i * 8);
     return (AE_OK);
 }
 
@@ -1508,14 +1651,7 @@ acpi_AppendBufferResource(ACPI_BUFFER *buf, ACPI_RESOURCE *res)
 ACPI_STATUS
 acpi_SetIntrModel(int model)
 {
-    ACPI_OBJECT_LIST ArgList;
-    ACPI_OBJECT Arg;
-
-    Arg.Type = ACPI_TYPE_INTEGER;
-    Arg.Integer.Value = model;
-    ArgList.Count = 1;
-    ArgList.Pointer = &Arg;
-    return (AcpiEvaluateObject(ACPI_ROOT_OBJECT, "_PIC", &ArgList, NULL));
+    return (acpi_SetInteger(ACPI_ROOT_OBJECT, "_PIC", model));
 }
 
 #define ACPI_MINIMUM_AWAKETIME 5
@@ -1835,24 +1971,24 @@ acpi_disabled(char *subsys)
     char       *cp, *env;
     int                len;
 
-    if ((env = getenv("debug.acpi.disable")) == NULL)
+    if ((env = getenv("debug.acpi.disabled")) == NULL)
        return (0);
-    if (!strcmp(env, "all")) {
+    if (strcmp(env, "all") == 0) {
        freeenv(env);
        return (1);
     }
 
-    /* scan the disable list checking for a match */
+    /* Scan the disable list, checking for a match. */
     cp = env;
     for (;;) {
-       while ((*cp != 0) && isspace(*cp))
+       while (*cp != '\0' && isspace(*cp))
            cp++;
-       if (*cp == 0)
+       if (*cp == '\0')
            break;
        len = 0;
-       while ((cp[len] != 0) && !isspace(cp[len]))
+       while (cp[len] != '\0' && !isspace(cp[len]))
            len++;
-       if (!strncmp(cp, subsys, len)) {
+       if (strncmp(cp, subsys, len) == 0) {
            freeenv(env);
            return (1);
        }
@@ -1869,30 +2005,23 @@ acpi_disabled(char *subsys)
 void
 acpi_device_enable_wake_capability(ACPI_HANDLE h, int enable)
 {
-    ACPI_OBJECT_LIST           ArgList;
-    ACPI_OBJECT                        Arg;
-
     /*
      * TBD: All Power Resources referenced by elements 2 through N
      *      of the _PRW object are put into the ON state.
      */
 
-    ArgList.Count = 1;
-    ArgList.Pointer = &Arg;
-
-    Arg.Type = ACPI_TYPE_INTEGER;
-    Arg.Integer.Value = enable;
-
-    (void)AcpiEvaluateObject(h, "_PSW", &ArgList, NULL);
+    (void)acpi_SetInteger(h, "_PSW", enable);
 }
 
 void
 acpi_device_enable_wake_event(ACPI_HANDLE h)
 {
     struct acpi_softc          *sc;
+    uint32_t                   gpe_bit, lowest_wake;
+    ACPI_HANDLE                        handle;
     ACPI_STATUS                        status;
     ACPI_BUFFER                        prw_buffer;
-    ACPI_OBJECT                        *res;
+    ACPI_OBJECT                        *res, *res2;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
@@ -1901,67 +2030,72 @@ acpi_device_enable_wake_event(ACPI_HANDLE h)
        return;
 
     /*
-     * _PRW object is only required for devices that have the ability
-     * to wake the system from a system sleeping state.
+     * The _PRW object (7.2.9) is only required for devices that have the
+     * ability to wake the system from a sleeping state.
      */
+    prw_buffer.Pointer = NULL;
     prw_buffer.Length = ACPI_ALLOCATE_BUFFER;
     status = AcpiEvaluateObject(h, "_PRW", NULL, &prw_buffer);
     if (ACPI_FAILURE(status))
        return;
-
     res = (ACPI_OBJECT *)prw_buffer.Pointer;
     if (res == NULL)
        return;
-
-    if ((res->Type != ACPI_TYPE_PACKAGE) || (res->Package.Count < 2)) {
+    if (!ACPI_PKG_VALID(res, 2))
        goto out;
-    }
 
     /*
-     * The element 1 of the _PRW object:
-     * The lowest power system sleeping state that can be entered
-     * while still providing wake functionality.
-     * The sleeping state being entered must be greater or equal to
-     * the power state declared in element 1 of the _PRW object.
+     * Element 1 of the _PRW object:
+     * The lowest power system sleeping state that can be entered while still
+     * providing wake functionality.  The sleeping state being entered must
+     * be less than (i.e., higher power) or equal to this value.
      */
-    if (res->Package.Elements[1].Type != ACPI_TYPE_INTEGER)
+    if (acpi_PkgInt32(res, 1, &lowest_wake) != 0)
        goto out;
-
-    if (sc->acpi_sstate > res->Package.Elements[1].Integer.Value)
+    if (sc->acpi_sstate > lowest_wake)
        goto out;
 
     /*
-     * The element 0 of the _PRW object:
+     * Element 0 of the _PRW object:
      */
-    switch(res->Package.Elements[0].Type) {
+    switch (res->Package.Elements[0].Type) {
     case ACPI_TYPE_INTEGER:
-       /* 
+       /*
         * If the data type of this package element is numeric, then this
         * _PRW package element is the bit index in the GPEx_EN, in the
         * GPE blocks described in the FADT, of the enable bit that is
         * enabled for the wake event.
         */
-
-       status = AcpiEnableGpe(NULL, res->Package.Elements[0].Integer.Value,
-                              ACPI_EVENT_WAKE_ENABLE);
+       gpe_bit = res->Package.Elements[0].Integer.Value;
+       status = AcpiEnableGpe(NULL, gpe_bit, ACPI_EVENT_WAKE_ENABLE);
        if (ACPI_FAILURE(status))
-           printf("%s: EnableEvent Failed\n", __func__);
+           printf("wake enable: AcpiEnableGpe failed for %u\n",
+                  gpe_bit);
        break;
     case ACPI_TYPE_PACKAGE:
        /*
-        * XXX TBD
-        *
         * If the data type of this package element is a package, then this
         * _PRW package element is itself a package containing two
-        * elements. The first is an object reference to the GPE Block
+        * elements.  The first is an object reference to the GPE Block
         * device that contains the GPE that will be triggered by the wake
-        * event. The second element is numeric and it contains the bit
+        * event.  The second element is numeric and it contains the bit
         * index in the GPEx_EN, in the GPE Block referenced by the
         * first element in the package, of the enable bit that is enabled for
         * the wake event.
+        *
         * For example, if this field is a package then it is of the form:
         * Package() {\_SB.PCI0.ISA.GPE, 2}
         */
+       res2 = &res->Package.Elements[0];
+       if (!ACPI_PKG_VALID(res2, 2))
+           goto out;
+       handle = acpi_GetReference(NULL, &res2->Package.Elements[0]);
+       if (handle == NULL || acpi_PkgInt32(res2, 1, &gpe_bit) != 0)
+           goto out;
+       status = AcpiEnableGpe(handle, gpe_bit, ACPI_EVENT_WAKE_ENABLE);
+       if (ACPI_FAILURE(status))
+           printf("wake enable: AcpiEnableGpe (package) failed for %u\n",
+                  gpe_bit);
        break;
     default:
        break;
@@ -2118,7 +2252,7 @@ acpi_supported_sleep_state_sysctl(SYSCTL_HANDLER_ARGS)
     UINT8 state, TypeA, TypeB;
 
     buf[0] = '\0';
-    for (state = ACPI_STATE_S1; state < ACPI_S_STATES_MAX+1; state++) {
+    for (state = ACPI_STATE_S1; state < ACPI_S_STATES_MAX + 1; state++) {
        if (ACPI_SUCCESS(AcpiGetSleepTypeData(state, &TypeA, &TypeB))) {
            sprintf(sleep_state, "S%d ", state);
            strcat(buf, sleep_state);
@@ -2136,7 +2270,7 @@ acpi_sleep_state_sysctl(SYSCTL_HANDLER_ARGS)
     u_int new_state, old_state;
 
     old_state = *(u_int *)oidp->oid_arg1;
-    if (old_state > ACPI_S_STATES_MAX+1) {
+    if (old_state > ACPI_S_STATES_MAX + 1) {
        strcpy(sleep_state, "unknown");
     } else {
        bzero(sleep_state, sizeof(sleep_state));
@@ -2215,16 +2349,16 @@ static struct debugtag  dbg_layer[] = {
     {"ACPI_CA_DISASSEMBLER",   ACPI_CA_DISASSEMBLER},
     {"ACPI_ALL_COMPONENTS",    ACPI_ALL_COMPONENTS},
 
-    {"ACPI_BUS",               ACPI_BUS},
-    {"ACPI_SYSTEM",            ACPI_SYSTEM},
-    {"ACPI_POWER",             ACPI_POWER},
-    {"ACPI_EC",                ACPI_EC},
     {"ACPI_AC_ADAPTER",                ACPI_AC_ADAPTER},
     {"ACPI_BATTERY",           ACPI_BATTERY},
+    {"ACPI_BUS",               ACPI_BUS},
     {"ACPI_BUTTON",            ACPI_BUTTON},
+    {"ACPI_EC",                ACPI_EC},
+    {"ACPI_FAN",               ACPI_FAN},
+    {"ACPI_POWERRES",          ACPI_POWERRES},
     {"ACPI_PROCESSOR",         ACPI_PROCESSOR},
     {"ACPI_THERMAL",           ACPI_THERMAL},
-    {"ACPI_FAN",               ACPI_FAN},
+    {"ACPI_TIMER",             ACPI_TIMER},
     {"ACPI_ALL_DRIVERS",       ACPI_ALL_DRIVERS},
     {NULL, 0}
 };
@@ -2307,7 +2441,6 @@ acpi_parse_debug(char *cp, struct debugtag *tag, UINT32 *flag)
                    *flag |= tag[i].value;
                else
                    *flag &= ~tag[i].value;
-               printf("ACPI_DEBUG: set '%s'\n", tag[i].name);
            }
        }
        cp = ep;
@@ -2317,26 +2450,32 @@ acpi_parse_debug(char *cp, struct debugtag *tag, UINT32 *flag)
 static void
 acpi_set_debugging(void *junk)
 {
-    char       *cp;
+    char       *layer, *level;
 
     if (cold) {
        AcpiDbgLayer = 0;
        AcpiDbgLevel = 0;
     }
 
-    if ((cp = getenv("debug.acpi.layer")) != NULL) {
-       acpi_parse_debug(cp, &dbg_layer[0], &AcpiDbgLayer);
-       freeenv(cp);
-    }
-    if ((cp = getenv("debug.acpi.level")) != NULL) {
-       acpi_parse_debug(cp, &dbg_level[0], &AcpiDbgLevel);
-       freeenv(cp);
-    }
+    layer = getenv("debug.acpi.layer");
+    level = getenv("debug.acpi.level");
+    if (layer == NULL && level == NULL)
+       return;
 
-    if (cold) {
-       printf("ACPI debug layer 0x%x debug level 0x%x\n",
-              AcpiDbgLayer, AcpiDbgLevel);
+    printf("ACPI set debug");
+    if (layer != NULL) {
+       if (strcmp("NONE", layer) != 0)
+           printf(" layer '%s'", layer);
+       acpi_parse_debug(layer, &dbg_layer[0], &AcpiDbgLayer);
+       freeenv(layer);
+    }
+    if (level != NULL) {
+       if (strcmp("NONE", level) != 0)
+           printf(" level '%s'", level);
+       acpi_parse_debug(level, &dbg_level[0], &AcpiDbgLevel);
+       freeenv(level);
     }
+    printf("\n");
 }
 SYSINIT(acpi_debugging, SI_SUB_TUNABLES, SI_ORDER_ANY, acpi_set_debugging,
        NULL);
@@ -2370,7 +2509,8 @@ acpi_debug_sysctl(SYSCTL_HANDLER_ARGS)
     sbuf_trim(&sb);
     sbuf_finish(&sb);
 
-    error = sysctl_handle_string(oidp, sbuf_data(&sb), sbuf_len(&sb), req);
+    /* Copy out the old values to the user. */
+    error = SYSCTL_OUT(req, sbuf_data(&sb), sbuf_len(&sb));
     sbuf_delete(&sb);
 
     /* If the user is setting a string, parse it. */
index 3dc493b..860b3fa 100644 (file)
@@ -23,8 +23,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_acad.c,v 1.20 2003/10/25 05:03:24 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_acad.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_acad.c,v 1.24 2004/05/06 02:18:58 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_acad.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -84,6 +84,7 @@ static driver_t acpi_acad_driver = {
 
 static devclass_t acpi_acad_devclass;
 DRIVER_MODULE(acpi_acad, acpi, acpi_acad_driver, acpi_acad_devclass, 0, 0);
+MODULE_DEPEND(acpi_acad, acpi, 1, 1, 1);
 
 static void
 acpi_acad_get_status(void *context)
@@ -96,7 +97,7 @@ acpi_acad_get_status(void *context)
     dev = context;
     sc = device_get_softc(dev);
     h = acpi_get_handle(dev);
-    if (ACPI_FAILURE(acpi_EvaluateInteger(h, "_PSR", &newstatus))) {
+    if (ACPI_FAILURE(acpi_GetInteger(h, "_PSR", &newstatus))) {
        sc->status = -1;
        return;
     }
@@ -137,9 +138,8 @@ acpi_acad_notify_handler(ACPI_HANDLE h, UINT32 notify, void *context)
 static int
 acpi_acad_probe(device_t dev)
 {
-    if (acpi_get_type(dev) == ACPI_TYPE_DEVICE &&
+    if (acpi_get_type(dev) == ACPI_TYPE_DEVICE && !acpi_disabled("acad") &&
        acpi_MatchHid(dev, "ACPI0003")) {
-
        device_set_desc(dev, "AC Adapter");
        return (0);
     }
index 13e843b..475cf2e 100644 (file)
@@ -25,8 +25,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_button.c,v 1.20 2004/02/19 18:16:34 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_button.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_button.c,v 1.21 2004/04/09 18:14:32 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_button.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -84,6 +84,7 @@ static driver_t acpi_button_driver = {
 static devclass_t acpi_button_devclass;
 DRIVER_MODULE(acpi_button, acpi, acpi_button_driver, acpi_button_devclass,
              0, 0);
+MODULE_DEPEND(acpi_button, acpi, 1, 1, 1);
 
 static int
 acpi_button_probe(device_t dev)
index 0bd5682..97191d7 100644 (file)
@@ -25,8 +25,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_cmbat.c,v 1.27 2003/12/23 18:27:35 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_cmbat.c,v 1.2 2004/05/05 22:19:24 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_cmbat.c,v 1.28 2004/04/09 18:14:32 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_cmbat.c,v 1.3 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -111,6 +111,7 @@ static driver_t acpi_cmbat_driver = {
 
 static devclass_t acpi_cmbat_devclass;
 DRIVER_MODULE(acpi_cmbat, acpi, acpi_cmbat_driver, acpi_cmbat_devclass, 0, 0);
+MODULE_DEPEND(acpi_cmbat, acpi, 1, 1, 1);
 
 static int
 acpi_cmbat_info_expired(struct timespec *lastupdated)
index d71980e..3d2bdae 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_cpu.c,v 1.29 2003/12/28 22:15:24 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_cpu.c,v 1.2 2004/05/05 22:19:24 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_cpu.c,v 1.36 2004/05/07 05:22:37 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_cpu.c,v 1.3 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -158,7 +158,6 @@ static void acpi_cpu_startup_cx(void);
 static void    acpi_cpu_throttle_set(uint32_t speed);
 static void    acpi_cpu_idle(void);
 static void    acpi_cpu_c1(void);
-static void    acpi_pm_ticksub(uint32_t *end, const uint32_t *start);
 static void    acpi_cpu_notify(ACPI_HANDLE h, UINT32 notify, void *context);
 static int     acpi_cpu_quirks(struct acpi_cpu_softc *sc);
 static int     acpi_cpu_throttle_sysctl(SYSCTL_HANDLER_ARGS);
@@ -175,58 +174,47 @@ static device_method_t acpi_cpu_methods[] = {
 };
 
 static driver_t acpi_cpu_driver = {
-    "acpi_cpu",
+    "cpu",
     acpi_cpu_methods,
     sizeof(struct acpi_cpu_softc),
 };
 
 static devclass_t acpi_cpu_devclass;
-DRIVER_MODULE(acpi_cpu, acpi, acpi_cpu_driver, acpi_cpu_devclass, 0, 0);
+DRIVER_MODULE(cpu, acpi, acpi_cpu_driver, acpi_cpu_devclass, 0, 0);
+MODULE_DEPEND(cpu, acpi, 1, 1, 1);
 
 static int
 acpi_cpu_probe(device_t dev)
 {
-    if (!acpi_disabled("cpu") && acpi_get_type(dev) == ACPI_TYPE_PROCESSOR) {
-       device_set_desc(dev, "CPU");
-       if (cpu_softc == NULL)
-               cpu_softc = malloc(sizeof(struct acpi_cpu_softc *) *
-                   SMP_MAXCPU, M_TEMP /* XXX */, M_INTWAIT | M_ZERO);
-       return (0);
-    }
-
-    return (ENXIO);
-}
-
-static int
-acpi_cpu_attach(device_t dev)
-{
-    struct acpi_cpu_softc *sc;
-    struct acpi_softc    *acpi_sc;
-    ACPI_OBJECT                   pobj;
+    int                           acpi_id, cpu_id, cx_count;
     ACPI_BUFFER                   buf;
+    ACPI_HANDLE                   handle;
+    char                  msg[32];
+    ACPI_OBJECT                   *obj;
     ACPI_STATUS                   status;
-    int                           thr_ret, cx_ret, cpu_id;
 
-    ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
-
-    ACPI_ASSERTLOCK;
+    if (acpi_disabled("cpu") || acpi_get_type(dev) != ACPI_TYPE_PROCESSOR)
+       return (ENXIO);
 
-    sc = device_get_softc(dev);
-    sc->cpu_dev = dev;
-    sc->cpu_handle = acpi_get_handle(dev);
+    handle = acpi_get_handle(dev);
+    if (cpu_softc == NULL)
+       cpu_softc = malloc(sizeof(struct acpi_cpu_softc *) *
+           SMP_MAXCPU, M_TEMP /* XXX */, M_INTWAIT | M_ZERO);
 
     /* Get our Processor object. */
-    buf.Pointer = &pobj;
-    buf.Length = sizeof(pobj);
-    status = AcpiEvaluateObject(sc->cpu_handle, NULL, NULL, &buf);
+    buf.Pointer = NULL;
+    buf.Length = ACPI_ALLOCATE_BUFFER;
+    status = AcpiEvaluateObject(handle, NULL, NULL, &buf);
     if (ACPI_FAILURE(status)) {
-       device_printf(dev, "Couldn't get Processor object - %s\n",
+       device_printf(dev, "probe failed to get Processor obj - %s\n",
                      AcpiFormatException(status));
-       return_VALUE (ENXIO);
+       return (ENXIO);
     }
-    if (pobj.Type != ACPI_TYPE_PROCESSOR) {
-       device_printf(dev, "Processor object has bad type %d\n", pobj.Type);
-       return_VALUE (ENXIO);
+    obj = (ACPI_OBJECT *)buf.Pointer;
+    if (obj->Type != ACPI_TYPE_PROCESSOR) {
+       device_printf(dev, "Processor object has bad type %d\n", obj->Type);
+       AcpiOsFree(obj);
+       return (ENXIO);
     }
 
     /*
@@ -234,9 +222,10 @@ acpi_cpu_attach(device_t dev)
      * ProcId as a key, however, some boxes do not have the same values
      * in their Processor object as the ProcId values in the MADT.
      */
-    sc->acpi_id = pobj.Processor.ProcId;
-    if (acpi_pcpu_get_id(device_get_unit(dev), &sc->acpi_id, &cpu_id) != 0)
-       return_VALUE (ENXIO);
+    acpi_id = obj->Processor.ProcId;
+    AcpiOsFree(obj);
+    if (acpi_pcpu_get_id(device_get_unit(dev), &acpi_id, &cpu_id) != 0)
+       return (ENXIO);
 
     /*
      * Check if we already probed this processor.  We scan the bus twice
@@ -244,11 +233,70 @@ acpi_cpu_attach(device_t dev)
      */
     if (cpu_softc[cpu_id] != NULL)
        return (ENXIO);
-    cpu_softc[cpu_id] = sc;
 
-    /* Get various global values from the Processor object. */
-    sc->cpu_p_blk = pobj.Processor.PblkAddress;
-    sc->cpu_p_blk_len = pobj.Processor.PblkLength;
+    /* Get a count of Cx states for our device string. */
+    cx_count = 0;
+    buf.Pointer = NULL;
+    buf.Length = ACPI_ALLOCATE_BUFFER;
+    status = AcpiEvaluateObject(handle, "_CST", NULL, &buf);
+    if (ACPI_SUCCESS(status)) {
+       obj = (ACPI_OBJECT *)buf.Pointer;
+       if (ACPI_PKG_VALID(obj, 2))
+           acpi_PkgInt32(obj, 0, &cx_count);
+       AcpiOsFree(obj);
+    } else {
+       if (AcpiGbl_FADT->Plvl2Lat <= 100)
+           cx_count++;
+       if (AcpiGbl_FADT->Plvl3Lat <= 1000)
+           cx_count++;
+       if (cx_count > 0)
+           cx_count++;
+    }
+    if (cx_count > 0)
+       snprintf(msg, sizeof(msg), "ACPI CPU (%d Cx states)", cx_count);
+    else
+       strlcpy(msg, "ACPI CPU", sizeof(msg));
+    device_set_desc_copy(dev, msg);
+
+    /* Mark this processor as in-use and save our derived id for attach. */
+    cpu_softc[cpu_id] = (void *)1;
+    acpi_set_magic(dev, cpu_id);
+
+    return (0);
+}
+
+static int
+acpi_cpu_attach(device_t dev)
+{
+    ACPI_BUFFER                   buf;
+    ACPI_OBJECT                   *obj;
+    struct acpi_cpu_softc *sc;
+    struct acpi_softc    *acpi_sc;
+    ACPI_STATUS                   status;
+    int                           thr_ret, cx_ret;
+
+    ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+
+    ACPI_ASSERTLOCK;
+
+    sc = device_get_softc(dev);
+    sc->cpu_dev = dev;
+    sc->cpu_handle = acpi_get_handle(dev);
+    cpu_softc[acpi_get_magic(dev)] = sc;
+
+    buf.Pointer = NULL;
+    buf.Length = ACPI_ALLOCATE_BUFFER;
+    status = AcpiEvaluateObject(sc->cpu_handle, NULL, NULL, &buf);
+    if (ACPI_FAILURE(status)) {
+       device_printf(dev, "attach failed to get Processor obj - %s\n",
+                     AcpiFormatException(status));
+       return (ENXIO);
+    }
+    obj = (ACPI_OBJECT *)buf.Pointer;
+    sc->cpu_p_blk = obj->Processor.PblkAddress;
+    sc->cpu_p_blk_len = obj->Processor.PblkLength;
+    sc->acpi_id = obj->Processor.ProcId;
+    AcpiOsFree(obj);
     ACPI_DEBUG_PRINT((ACPI_DB_INFO, "acpi_cpu%d: P_BLK at %#x/%d\n",
                     device_get_unit(dev), sc->cpu_p_blk, sc->cpu_p_blk_len));
 
@@ -292,7 +340,7 @@ acpi_pcpu_get_id(uint32_t idx, uint32_t *acpi_id, uint32_t *cpu_id)
 
     KASSERT(acpi_id != NULL, ("Null acpi_id"));
     KASSERT(cpu_id != NULL, ("Null cpu_id"));
-    for (i = 0; i < ncpus; i++) {
+    for (i = 0; i <= ncpus; i++) {
        if ((smp_active_mask & (1 << i)) == 0)
            continue;
        md = (struct mdglobaldata *)globaldata_find(i);
@@ -395,8 +443,12 @@ acpi_cpu_throttle_probe(struct acpi_cpu_softc *sc)
 
     /* If _PTC not present or other failure, try the P_BLK. */
     if (sc->cpu_p_cnt == NULL) {
-       /* The spec says P_BLK must be at least 6 bytes long. */
-       if (sc->cpu_p_blk == 0 || sc->cpu_p_blk_len != 6)
+       /* 
+        * The spec says P_BLK must be 6 bytes long.  However, some
+        * systems use it to indicate a fractional set of features
+        * present so we take anything >= 4.
+        */
+       if (sc->cpu_p_blk_len < 4)
            return (ENXIO);
        gas.Address = sc->cpu_p_blk;
        gas.AddressSpaceId = ACPI_ADR_SPACE_SYSTEM_IO;
@@ -448,13 +500,20 @@ acpi_cpu_cx_probe(struct acpi_cpu_softc *sc)
        cx_ptr++;
        sc->cpu_cx_count++;
 
-       if (sc->cpu_p_blk_len != 6)
+       /* 
+        * The spec says P_BLK must be 6 bytes long.  However, some systems
+        * use it to indicate a fractional set of features present so we
+        * take 5 as C2.  Some may also have a value of 7 to indicate
+        * another C3 but most use _CST for this (as required) and having
+        * "only" C1-C3 is not a hardship.
+        */
+       if (sc->cpu_p_blk_len < 5)
            goto done;
 
        /* Validate and allocate resources for C2 (P_LVL2). */
        gas.AddressSpaceId = ACPI_ADR_SPACE_SYSTEM_IO;
        gas.RegisterBitWidth = 8;
-       if (AcpiGbl_FADT->Plvl2Lat < 100) {
+       if (AcpiGbl_FADT->Plvl2Lat <= 100) {
            gas.Address = sc->cpu_p_blk + 4;
            cx_ptr->p_lvlx = acpi_bus_alloc_gas(sc->cpu_dev, &cpu_rid, &gas);
            if (cx_ptr->p_lvlx != NULL) {
@@ -466,9 +525,11 @@ acpi_cpu_cx_probe(struct acpi_cpu_softc *sc)
                sc->cpu_cx_count++;
            }
        }
+       if (sc->cpu_p_blk_len < 6)
+           goto done;
 
        /* Validate and allocate resources for C3 (P_LVL3). */
-       if (AcpiGbl_FADT->Plvl3Lat < 1000 &&
+       if (AcpiGbl_FADT->Plvl3Lat <= 1000 &&
            (cpu_quirks & CPU_QUIRK_NO_C3) == 0) {
 
            gas.Address = sc->cpu_p_blk + 5;
@@ -669,6 +730,9 @@ acpi_cpu_startup_throttling()
           CPU_SPEED_PRINTABLE(cpu_throttle_state));
 }
 
+/* XXX: not here */
+extern void (*cpu_idle_hook)(void);
+
 static void
 acpi_cpu_startup_cx()
 {
@@ -679,10 +743,8 @@ acpi_cpu_startup_cx()
 
     sc = device_get_softc(cpu_devices[0]);
     sbuf_new(&sb, cpu_cx_supported, sizeof(cpu_cx_supported), SBUF_FIXEDLEN);
-    for (i = 0; i < cpu_cx_count; i++) {
-       sbuf_printf(&sb, "C%d/%d ", sc->cpu_cx_states[i].type,
-                   sc->cpu_cx_states[i].trans_lat);
-    }
+    for (i = 0; i < cpu_cx_count; i++)
+       sbuf_printf(&sb, "C%d/%d ", i + 1, sc->cpu_cx_states[i].trans_lat);
     sbuf_trim(&sb);
     sbuf_finish(&sb);
     SYSCTL_ADD_STRING(&acpi_cpu_sysctl_ctx,
@@ -691,13 +753,14 @@ acpi_cpu_startup_cx()
                      0, "Cx/microsecond values for supported Cx states");
     SYSCTL_ADD_PROC(&acpi_cpu_sysctl_ctx,
                    SYSCTL_CHILDREN(acpi_cpu_sysctl_tree),
-                   OID_AUTO, "cx_lowest", CTLTYPE_INT | CTLFLAG_RW,
-                   NULL, 0, acpi_cpu_cx_lowest_sysctl, "I",
+                   OID_AUTO, "cx_lowest", CTLTYPE_STRING | CTLFLAG_RW,
+                   NULL, 0, acpi_cpu_cx_lowest_sysctl, "A",
                    "lowest Cx sleep state to use");
     SYSCTL_ADD_PROC(&acpi_cpu_sysctl_ctx,
                    SYSCTL_CHILDREN(acpi_cpu_sysctl_tree),
                    OID_AUTO, "cx_history", CTLTYPE_STRING | CTLFLAG_RD,
-                   NULL, 0, acpi_cpu_history_sysctl, "A", "");
+                   NULL, 0, acpi_cpu_history_sysctl, "A",
+                   "count of full sleeps for Cx state / short sleeps");
 
 #ifdef notyet
     /* Signal platform that we can handle _CST notification. */
@@ -708,10 +771,10 @@ acpi_cpu_startup_cx()
     }
 #endif
 
-    /* Take over idling from cpu_idle_default(). */
+    /* Take over idling from cpu_idle_default_hook(). */
     cpu_cx_next = cpu_cx_lowest;
     KKASSERT(0);
-    /* cpu_idle_hook = acpi_cpu_idle; */
+    cpu_idle_hook = acpi_cpu_idle;
 }
 
 /*
@@ -862,7 +925,7 @@ acpi_cpu_idle()
     }
 
     /* Find the actual time asleep in microseconds, minus overhead. */
-    acpi_pm_ticksub(&end_time, &start_time);
+    end_time = acpi_TimerDelta(end_time, start_time);
     asleep = PM_USEC(end_time) - cx_next->trans_lat;
 
     /* Record statistics */
@@ -902,18 +965,6 @@ acpi_cpu_c1()
 #endif
 }
 
-/* Find the difference between two PM tick counts. */
-static void
-acpi_pm_ticksub(uint32_t *end, const uint32_t *start)
-{
-    if (*end >= *start)
-       *end = *end - *start;
-    else if (AcpiGbl_FADT->TmrValExt == 0)
-       *end = (((0x00FFFFFF - *start) + *end + 1) & 0x00FFFFFF);
-    else
-       *end = ((0xFFFFFFFF - *start) + *end + 1);
-}
-
 /*
  * Re-evaluate the _PSS and _CST objects when we are notified that they
  * have changed.
@@ -1037,7 +1088,8 @@ acpi_cpu_history_sysctl(SYSCTL_HANDLER_ARGS)
     }
     sbuf_trim(&sb);
     sbuf_finish(&sb);
-    sysctl_handle_string(oidp, sbuf_data(&sb), 0, req);
+    sysctl_handle_string(oidp, sbuf_data(&sb), sbuf_len(&sb), req);
+    sbuf_delete(&sb);
 
     return (0);
 }
@@ -1046,13 +1098,17 @@ static int
 acpi_cpu_cx_lowest_sysctl(SYSCTL_HANDLER_ARGS)
 {
     struct      acpi_cpu_softc *sc;
+    char        state[8];
     int                 val, error, i;
 
     sc = device_get_softc(cpu_devices[0]);
-    val = cpu_cx_lowest;
-    error = sysctl_handle_int(oidp, &val, 0, req);
+    snprintf(state, sizeof(state), "C%d", cpu_cx_lowest + 1);
+    error = sysctl_handle_string(oidp, state, sizeof(state), req);
     if (error != 0 || req->newptr == NULL)
        return (error);
+    if (strlen(state) < 2 || toupper(state[0]) != 'C')
+       return (EINVAL);
+    val = (int) strtol(state + 1, NULL, 10) - 1;
     if (val < 0 || val > cpu_cx_count - 1)
        return (EINVAL);
 
index 85e1599..de11299 100644 (file)
@@ -25,8 +25,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_ec.c,v 1.42 2004/01/03 02:01:39 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_ec.c,v 1.2 2004/03/01 06:33:13 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_ec.c,v 1.49 2004/05/14 04:17:56 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_ec.c,v 1.3 2004/06/27 08:52:39 dillon Exp $
  */
 /******************************************************************************
  *
  *
  *****************************************************************************/
  /*
-  * $FreeBSD: src/sys/dev/acpica/acpi_ec.c,v 1.42 2004/01/03 02:01:39 njl Exp $
-  * $DragonFly: src/sys/dev/acpica5/acpi_ec.c,v 1.2 2004/03/01 06:33:13 dillon Exp $
+  * $FreeBSD: src/sys/dev/acpica/acpi_ec.c,v 1.49 2004/05/14 04:17:56 njl Exp $
+  * $DragonFly: src/sys/dev/acpica5/acpi_ec.c,v 1.3 2004/06/27 08:52:39 dillon Exp $
   *
   */
 
 #include <sys/kernel.h>
 #include <sys/bus.h>
 #include <sys/thread.h>
+#include <sys/malloc.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
 #include <sys/rman.h>
 
 #include "acpi.h"
-
 #include <dev/acpica5/acpivar.h>
 
+/* XXX acpica-20031203 doesn't have this */
+#ifndef ACPI_GPE_EDGE_TRIGGERED
+#define ACPI_GPE_EDGE_TRIGGERED        ACPI_EVENT_EDGE_TRIGGERED
+#endif /* ACPI_GPE_EDGE_TRIGGERED */
+
 /*
  * Hooks for the ACPI CA debugging infrastructure
  */
@@ -238,15 +243,16 @@ typedef struct {
     char                       ec_id[0];
 } ACPI_TABLE_ECDT;
 
-/* Indicate that this device has already been probed via ECDT. */
-#define DEV_ECDT(x)            (acpi_get_private(x) == &acpi_ec_devclass)
-
-/* Indicate that this device should use the global lock. */
-#define DEV_GLK_FLAG           0x40000000
+/* Additional params to pass from the probe routine */
+struct acpi_ec_params {
+    int                glk;
+    int                gpe_bit;
+    ACPI_HANDLE        gpe_handle;
+    int                uid;
+};
 
-/* Get/set GPE bit value in the magic ivar. */
-#define DEV_GET_GPEBIT(x)      ((x) & 0xff)
-#define DEV_SET_GPEBIT(x, y)   ((x) = ((x) & ~0xff) | ((y) & 0xff))
+/* Indicate that this device has already been probed via ECDT. */
+#define DEV_ECDT(x)            (acpi_get_magic(x) == (int)&acpi_ec_devclass)
 
 /*
  * Driver softc.
@@ -254,6 +260,8 @@ typedef struct {
 struct acpi_ec_softc {
     device_t           ec_dev;
     ACPI_HANDLE                ec_handle;
+    int                        ec_uid;
+    ACPI_HANDLE                ec_gpehandle;
     UINT8              ec_gpebit;
     UINT8              ec_csrvalue;
     
@@ -356,6 +364,7 @@ static driver_t acpi_ec_driver = {
 
 static devclass_t acpi_ec_devclass;
 DRIVER_MODULE(acpi_ec, acpi, acpi_ec_driver, acpi_ec_devclass, 0, 0);
+MODULE_DEPEND(acpi_ec, acpi, 1, 1, 1);
 
 /*
  * Look for an ECDT and if we find one, set up default GPE and 
@@ -370,7 +379,7 @@ acpi_ec_ecdt_probe(device_t parent)
     ACPI_STATUS             status;
     device_t        child;
     ACPI_HANDLE             h;
-    int                     magic;
+    struct acpi_ec_params *params;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
@@ -386,7 +395,7 @@ acpi_ec_ecdt_probe(device_t parent)
     /* Create the child device with the given unit number. */
     child = BUS_ADD_CHILD(parent, 0, "acpi_ec", ecdt->uid);
     if (child == NULL) {
-       printf("acpi_ec_ecdt_probe: can't add child\n");
+       printf("%s: can't add child\n", __func__);
        return;
     }
 
@@ -394,7 +403,7 @@ acpi_ec_ecdt_probe(device_t parent)
     status = AcpiGetHandle(NULL, ecdt->ec_id, &h);
     if (ACPI_FAILURE(status)) {
        device_delete_child(parent, child);
-       printf("acpi_ec_ecdt_probe: can't get handle\n");
+       printf("%s: can't get handle\n", __func__);
        return;
     }
     acpi_set_handle(child, h);
@@ -407,14 +416,18 @@ acpi_ec_ecdt_probe(device_t parent)
 
     /*
      * Store values for the probe/attach routines to use.  Store the
-     * ECDT GPE bit and set the global lock flag (just to be safe).
-     * We'll determine whether we really want to use the global lock
-     * in a later call to attach.
+     * ECDT GPE bit and set the global lock flag according to _GLK.
+     * Note that it is not perfectly correct to be evaluating a method
+     * before initializing devices, but in practice this function
+     * should be safe to call at this point.
      */
-    acpi_set_private(child, &acpi_ec_devclass);
-    magic = DEV_GLK_FLAG;
-    DEV_SET_GPEBIT(magic, ecdt->gpe_bit);
-    acpi_set_magic(child, magic);
+    params = malloc(sizeof(struct acpi_ec_params), M_TEMP, M_WAITOK | M_ZERO);
+    params->gpe_handle = NULL;
+    params->gpe_bit = ecdt->gpe_bit;
+    params->uid = ecdt->uid;
+    acpi_GetInteger(h, "_GLK", &params->glk);
+    acpi_set_private(child, params);
+    acpi_set_magic(child, (int)&acpi_ec_devclass);
 
     /* Finish the attach process. */
     if (device_probe_and_attach(child) != 0)
@@ -424,11 +437,14 @@ acpi_ec_ecdt_probe(device_t parent)
 static int
 acpi_ec_probe(device_t dev)
 {
+    ACPI_BUFFER buf;
     ACPI_HANDLE h;
+    ACPI_OBJECT *obj;
     ACPI_STATUS status;
     device_t   peer;
     char       desc[64];
-    int                magic, uid, glk, gpebit, ret = ENXIO;
+    int                ret;
+    struct acpi_ec_params *params;
 
     /* Check that this is a device and that EC is not disabled. */
     if (acpi_get_type(dev) != ACPI_TYPE_DEVICE || acpi_disabled("ec"))
@@ -439,13 +455,16 @@ acpi_ec_probe(device_t dev)
      * we can access the namespace and make sure this is not a
      * duplicate probe.
      */
-    magic = acpi_get_magic(dev);
+    ret = ENXIO;
+    params = NULL;
+    buf.Pointer = NULL;
+    buf.Length = ACPI_ALLOCATE_BUFFER;
     if (DEV_ECDT(dev)) {
-       snprintf(desc, sizeof(desc), "Embedded Controller: ECDT, GPE %#x, GLK",
-                DEV_GET_GPEBIT(magic));
-       device_set_desc_copy(dev, desc);
+       params = acpi_get_private(dev);
        ret = 0;
     } else if (acpi_MatchHid(dev, "PNP0C09")) {
+       params = malloc(sizeof(struct acpi_ec_params), M_TEMP,
+                       M_WAITOK | M_ZERO);
        h = acpi_get_handle(dev);
 
        /*
@@ -453,61 +472,74 @@ acpi_ec_probe(device_t dev)
         * global lock value to see if we should acquire it when
         * accessing the EC.
         */
-       status = acpi_EvaluateInteger(h, "_UID", &uid);
+       status = acpi_GetInteger(h, "_UID", &params->uid);
        if (ACPI_FAILURE(status))
-           uid = 0;
-       status = acpi_EvaluateInteger(h, "_GLK", &glk);
+           params->uid = 0;
+       status = acpi_GetInteger(h, "_GLK", &params->glk);
        if (ACPI_FAILURE(status))
-           glk = 0;
+           params->glk = 0;
 
        /*
         * Evaluate the _GPE method to find the GPE bit used by the EC to
-        * signal status (SCI).  Note that we don't handle the case where
-        * it can return a package instead of an int.
+        * signal status (SCI).  If it's a package, it contains a reference
+        * and GPE bit, similar to _PRW.
         */
-       status = acpi_EvaluateInteger(h, "_GPE", &gpebit);
+       status = AcpiEvaluateObject(h, "_GPE", NULL, &buf);
        if (ACPI_FAILURE(status)) {
            device_printf(dev, "can't evaluate _GPE - %s\n",
                          AcpiFormatException(status));
            return (ENXIO);
        }
+       obj = (ACPI_OBJECT *)buf.Pointer;
+       if (obj == NULL)
+           return (ENXIO);
+
+       switch (obj->Type) {
+       case ACPI_TYPE_INTEGER:
+           params->gpe_handle = NULL;
+           params->gpe_bit = obj->Integer.Value;
+           break;
+       case ACPI_TYPE_PACKAGE:
+           if (!ACPI_PKG_VALID(obj, 2))
+               goto out;
+           params->gpe_handle =
+               acpi_GetReference(NULL, &obj->Package.Elements[0]);
+           if (params->gpe_handle == NULL ||
+               acpi_PkgInt32(obj, 1, &params->gpe_bit) != 0)
+               goto out;
+           break;
+       default:
+           device_printf(dev, "_GPE has invalid type %d\n", obj->Type);
+           goto out;
+       }
 
        /* Store the values we got from the namespace for attach. */
-       magic = glk != 0 ? DEV_GLK_FLAG : 0;
-       DEV_SET_GPEBIT(magic, gpebit);
-       acpi_set_magic(dev, magic);
+       acpi_set_private(dev, params);
 
        /*
         * Check for a duplicate probe.  This can happen when a probe
-        * via ECDT succeeded already.  If there is a duplicate, override
-        * its value for GLK in the peer's softc since the ECDT case
-        * always enables the global lock to be safe.  Otherwise, just
-        * continue on to attach.
+        * via ECDT succeeded already.  If this is a duplicate, disable
+        * this device.
         */
-       peer = devclass_get_device(acpi_ec_devclass, uid);
-       if (peer == NULL || !device_is_alive(peer)) {
-           snprintf(desc, sizeof(desc), "Embedded Controller: GPE %#x%s",
-                    gpebit, glk != 0 ? ", GLK" : "");
-           device_set_desc_copy(dev, desc);
+       peer = devclass_get_device(acpi_ec_devclass, params->uid);
+       if (peer == NULL || !device_is_alive(peer))
            ret = 0;
-       } else {
-           struct acpi_ec_softc *sc;
-
-           /*
-            * Set the peer's sc->ec_glk with locks held so we won't
-            * override it between another thread's lock/unlock calls.
-            */
-           sc = device_get_softc(peer);
-           if (sc->ec_glk != glk) {
-               ACPI_VPRINT(peer, acpi_device_get_parent_softc(peer),
-                   "Changing GLK from %d to %d\n", sc->ec_glk, glk);
-               lwkt_exlock(&sc->ec_rwlock, "acpi2");
-               sc->ec_glk = glk != 0 ? 1 : 0;
-               lwkt_exunlock(&sc->ec_rwlock);
-           }
-       }
+       else
+           device_disable(dev);
     }
 
+out:
+    if (ret == 0) {
+       snprintf(desc, sizeof(desc), "Embedded Controller: GPE %#x%s%s",
+                params->gpe_bit, (params->glk) ? ", GLK" : "",
+                DEV_ECDT(dev) ? ", ECDT" : "");
+       device_set_desc_copy(dev, desc);
+    }
+
+    if (ret > 0 && params)
+       free(params, M_TEMP);
+    if (buf.Pointer)
+       AcpiOsFree(buf.Pointer);
     return (ret);
 }
 
@@ -515,27 +547,31 @@ static int
 acpi_ec_attach(device_t dev)
 {
     struct acpi_ec_softc       *sc;
+    struct acpi_ec_params      *params;
     ACPI_STATUS                        Status;
-    int                                magic, errval = 0;
+    int                                errval = 0;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     /* Fetch/initialize softc (assumes softc is pre-zeroed). */
     sc = device_get_softc(dev);
+    params = acpi_get_private(dev);
     sc->ec_dev = dev;
     sc->ec_handle = acpi_get_handle(dev);
     sc->ec_polldelay = EC_POLL_DELAY;
     lwkt_rwlock_init(&sc->ec_rwlock);
 
     /* Retrieve previously probed values via device ivars. */
-    magic = acpi_get_magic(dev);
-    sc->ec_glk = (magic & DEV_GLK_FLAG) != 0 ? 1 : 0;
-    sc->ec_gpebit = DEV_GET_GPEBIT(magic);
+    sc->ec_glk = params->glk;
+    sc->ec_gpebit = params->gpe_bit;
+    sc->ec_gpehandle = params->gpe_handle;
+    sc->ec_uid = params->uid;
+    free(params, M_TEMP);
 
     /* Attach bus resources for data and command/status ports. */
     sc->ec_data_rid = 0;
-    sc->ec_data_res = bus_alloc_resource(sc->ec_dev, SYS_RES_IOPORT,
-                       &sc->ec_data_rid, 0, ~0, 1, RF_ACTIVE);
+    sc->ec_data_res = bus_alloc_resource_any(sc->ec_dev, SYS_RES_IOPORT,
+                       &sc->ec_data_rid, RF_ACTIVE);
     if (sc->ec_data_res == NULL) {
        device_printf(dev, "can't allocate data port\n");
        errval = ENXIO;
@@ -545,8 +581,8 @@ acpi_ec_attach(device_t dev)
     sc->ec_data_handle = rman_get_bushandle(sc->ec_data_res);
 
     sc->ec_csr_rid = 1;
-    sc->ec_csr_res = bus_alloc_resource(sc->ec_dev, SYS_RES_IOPORT,
-                       &sc->ec_csr_rid, 0, ~0, 1, RF_ACTIVE);
+    sc->ec_csr_res = bus_alloc_resource_any(sc->ec_dev, SYS_RES_IOPORT,
+                       &sc->ec_csr_rid, RF_ACTIVE);
     if (sc->ec_csr_res == NULL) {
        device_printf(dev, "can't allocate command/status port\n");
        errval = ENXIO;
@@ -560,8 +596,8 @@ acpi_ec_attach(device_t dev)
      * behavior.
      */
     ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "attaching GPE handler\n"));
-    Status = AcpiInstallGpeHandler(NULL, sc->ec_gpebit,
-               ACPI_EVENT_EDGE_TRIGGERED, &EcGpeHandler, sc);
+    Status = AcpiInstallGpeHandler(sc->ec_gpehandle, sc->ec_gpebit,
+               ACPI_GPE_EDGE_TRIGGERED, &EcGpeHandler, sc);
     if (ACPI_FAILURE(Status)) {
        device_printf(dev, "can't install GPE handler for %s - %s\n",
                      acpi_name(sc->ec_handle), AcpiFormatException(Status));
@@ -578,7 +614,8 @@ acpi_ec_attach(device_t dev)
     if (ACPI_FAILURE(Status)) {
        device_printf(dev, "can't install address space handler for %s - %s\n",
                      acpi_name(sc->ec_handle), AcpiFormatException(Status));
-       Status = AcpiRemoveGpeHandler(NULL, sc->ec_gpebit, &EcGpeHandler);
+       Status = AcpiRemoveGpeHandler(sc->ec_gpehandle, sc->ec_gpebit,
+                                     &EcGpeHandler);
        if (ACPI_FAILURE(Status))
            panic("Added GPE handler but can't remove it");
        errval = ENXIO;
@@ -717,28 +754,33 @@ EcSpaceHandler(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 width,
               ACPI_INTEGER *Value, void *Context, void *RegionContext)
 {
     struct acpi_ec_softc       *sc = (struct acpi_ec_softc *)Context;
-    ACPI_STATUS                        Status = AE_OK;
+    ACPI_STATUS                        Status;
     UINT8                      EcAddr, EcData;
     int                                i;
 
     ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, (UINT32)Address);
 
-    if (Address > 0xFF || width % 8 != 0 || Value == NULL || Context == NULL)
+    if (width % 8 != 0 || Value == NULL || Context == NULL)
        return_ACPI_STATUS (AE_BAD_PARAMETER);
+    if (Address + (width / 8) - 1 > 0xFF)
+       return_ACPI_STATUS (AE_BAD_ADDRESS);
 
-    /*
-     * Perform the transaction.
-     */
+    if (Function == ACPI_READ)
+       *Value = 0;
     EcAddr = Address;
-    for (i = 0; i < width; i += 8) {
+    Status = AE_ERROR;
+
+    /* Perform the transaction(s), based on width. */
+    for (i = 0; i < width; i += 8, EcAddr++) {
        Status = EcLock(sc);
        if (ACPI_FAILURE(Status))
-           return (Status);
+           break;
 
        switch (Function) {
        case ACPI_READ:
-           EcData = 0;
            Status = EcRead(sc, EcAddr, &EcData);
+           if (ACPI_SUCCESS(Status))
+               *Value |= ((ACPI_INTEGER)EcData) << i;
            break;
        case ACPI_WRITE:
            EcData = (UINT8)((*Value) >> i);
@@ -750,15 +792,11 @@ EcSpaceHandler(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 width,
            Status = AE_BAD_PARAMETER;
            break;
        }
-
        EcUnlock(sc);
        if (ACPI_FAILURE(Status))
-           return (Status);
-
-       *Value |= (ACPI_INTEGER)EcData << i;
-       if (++EcAddr == 0)
-           return_ACPI_STATUS (AE_BAD_PARAMETER);
+           break;
     }
+
     return_ACPI_STATUS (Status);
 }
 
@@ -807,7 +845,7 @@ EcWaitEvent(struct acpi_ec_softc *sc, EC_EVENT Event)
 
     /*
      * If we still don't have a response, wait up to ec_poll_timeout ms
-     * for completion, sleeping for chunks of ~10 ms.
+     * for completion, sleeping for chunks of 10 ms.
      */
     if (Status != AE_OK) {
        retval = -1;
index 255c9ef..16c397c 100644 (file)
@@ -23,8 +23,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_isab.c,v 1.4 2003/08/24 17:48:01 obrien Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_isab.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_isab.c,v 1.5 2004/04/09 18:14:32 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_isab.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 /*
@@ -88,6 +88,7 @@ static driver_t acpi_isab_driver = {
 };
 
 DRIVER_MODULE(acpi_isab, acpi, acpi_isab_driver, isab_devclass, 0, 0);
+MODULE_DEPEND(acpi_isab, acpi, 1, 1, 1);
 
 static int
 acpi_isab_probe(device_t dev)
index ee62981..f2a526a 100644 (file)
@@ -26,8 +26,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_lid.c,v 1.15 2003/10/25 05:03:24 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_lid.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_lid.c,v 1.17 2004/04/09 18:14:32 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_lid.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -75,6 +75,7 @@ static driver_t acpi_lid_driver = {
 
 static devclass_t acpi_lid_devclass;
 DRIVER_MODULE(acpi_lid, acpi, acpi_lid_driver, acpi_lid_devclass, 0, 0);
+MODULE_DEPEND(acpi_lid, acpi, 1, 1, 1);
 
 static int
 acpi_lid_probe(device_t dev)
@@ -139,7 +140,7 @@ acpi_lid_notify_status_changed(void *arg)
      * Zero:           The lid is closed
      * Non-zero:       The lid is open
      */
-    status = acpi_EvaluateInteger(sc->lid_handle, "_LID", &sc->lid_status);
+    status = acpi_GetInteger(sc->lid_handle, "_LID", &sc->lid_status);
     if (ACPI_FAILURE(status))
        return_VOID;
 
index 4767d7e..0ddd828 100644 (file)
@@ -23,8 +23,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_package.c,v 1.2 2003/12/23 18:26:53 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_package.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_package.c,v 1.3 2004/04/09 06:40:03 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_package.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -124,3 +124,34 @@ acpi_PkgGas(device_t dev, ACPI_OBJECT *res, int idx, int *rid,
 
     return (0);
 }
+
+ACPI_HANDLE
+acpi_GetReference(ACPI_HANDLE scope, ACPI_OBJECT *obj)
+{
+    ACPI_HANDLE h;
+
+    if (obj == NULL)
+       return (NULL);
+
+    switch (obj->Type) {
+    case ACPI_TYPE_LOCAL_REFERENCE:
+    case ACPI_TYPE_ANY:
+       h = obj->Reference.Handle;
+       break;
+    case ACPI_TYPE_STRING:
+       /*
+        * The String object usually contains a fully-qualified path, so
+        * scope can be NULL.
+        *
+        * XXX This may not always be the case.
+        */
+       if (ACPI_FAILURE(AcpiGetHandle(scope, obj->String.Pointer, &h)))
+           h = NULL;
+       break;
+    default:
+       h = NULL;
+       break;
+    }
+
+    return (h);
+}
index d84485d..b23a194 100644 (file)
@@ -25,8 +25,8 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_pci.c,v 1.6 2003/09/17 08:32:44 iwasaki Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_pci.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_pci.c,v 1.15 2004/05/06 02:18:58 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_pci.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_bus.h"
@@ -65,11 +65,12 @@ static int  acpi_pci_probe(device_t dev);
 static int     acpi_pci_attach(device_t dev);
 static int     acpi_pci_read_ivar(device_t dev, device_t child, int which,
     uintptr_t *result);
-#if 0
+static int     acpi_pci_child_location_str_method(device_t cbdev,
+    device_t child, char *buf, size_t buflen);
+
+
 static int     acpi_pci_set_powerstate_method(device_t dev, device_t child,
     int state);
-static int     acpi_pci_get_powerstate_method(device_t dev, device_t child);
-#endif
 static ACPI_STATUS acpi_pci_save_handle(ACPI_HANDLE handle, UINT32 level,
     void *context, void **status);
 
@@ -79,7 +80,7 @@ static device_method_t acpi_pci_methods[] = {
        DEVMETHOD(device_attach,        acpi_pci_attach),
        DEVMETHOD(device_shutdown,      bus_generic_shutdown),
        DEVMETHOD(device_suspend,       bus_generic_suspend),
-       DEVMETHOD(device_resume,        pci_resume),
+       DEVMETHOD(device_resume,        bus_generic_resume),
 
        /* Bus interface */
        DEVMETHOD(bus_print_child,      pci_print_child),
@@ -99,7 +100,7 @@ static device_method_t acpi_pci_methods[] = {
        DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
        DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
        DEVMETHOD(bus_child_pnpinfo_str, pci_child_pnpinfo_str_method),
-       DEVMETHOD(bus_child_location_str, pci_child_location_str_method),
+       DEVMETHOD(bus_child_location_str, acpi_pci_child_location_str_method),
 
        /* PCI interface */
        DEVMETHOD(pci_read_config,      pci_read_config_method),
@@ -108,9 +109,8 @@ static device_method_t acpi_pci_methods[] = {
        DEVMETHOD(pci_disable_busmaster, pci_disable_busmaster_method),
        DEVMETHOD(pci_enable_io,        pci_enable_io_method),
        DEVMETHOD(pci_disable_io,       pci_disable_io_method),
-       /* XXX: We should override these two. */
        DEVMETHOD(pci_get_powerstate,   pci_get_powerstate_method),
-       DEVMETHOD(pci_set_powerstate,   pci_set_powerstate_method),
+       DEVMETHOD(pci_set_powerstate,   acpi_pci_set_powerstate_method),
        DEVMETHOD(pci_assign_interrupt, pci_assign_interrupt_method),
 
        { 0, 0 }
@@ -123,8 +123,8 @@ static driver_t acpi_pci_driver = {
 };
 
 DRIVER_MODULE(acpi_pci, pcib, acpi_pci_driver, pci_devclass, 0, 0);
+MODULE_DEPEND(acpi_pci, acpi, 1, 1, 1);
 MODULE_VERSION(acpi_pci, 1);
-MODULE_DEPEND(acpi_pci, pci, 1, 1, 1);
 
 static int
 acpi_pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
@@ -132,32 +132,85 @@ acpi_pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
     struct acpi_pci_devinfo *dinfo;
 
     switch (which) {
-    case  ACPI_IVAR_HANDLE:
+    case ACPI_IVAR_HANDLE:
        dinfo = device_get_ivars(child);
        *result = (uintptr_t)dinfo->ap_handle;
-       return(0);
+       return (0);
+    }
+    return (pci_read_ivar(dev, child, which, result));
+}
+
+static int
+acpi_pci_child_location_str_method(device_t cbdev, device_t child, char *buf,
+    size_t buflen)
+{
+    struct acpi_pci_devinfo *dinfo = device_get_ivars(child);
+
+    pci_child_location_str_method(cbdev, child, buf, buflen);
+
+    if (dinfo->ap_handle) {
+       strlcat(buf, " path=", buflen);
+       strlcat(buf, acpi_name(dinfo->ap_handle), buflen);
     }
-    return(pci_read_ivar(dev, child, which, result));
+    return (0);
 }
 
-#if 0
 /*
  * PCI power manangement
  */
 static int
 acpi_pci_set_powerstate_method(device_t dev, device_t child, int state)
 {
-       /* XXX: TODO */
-       return (ENXIO);
-}
+       ACPI_HANDLE h;
+       ACPI_STATUS status;
+       int acpi_state, old_state, error;
 
-static int
-acpi_pci_get_powerstate_method(device_t dev, device_t child)
-{
-       /* XXX: TODO */
-       return (ENXIO);
+       switch (state) {
+       case PCI_POWERSTATE_D0:
+               acpi_state = ACPI_STATE_D0;
+               break;
+       case PCI_POWERSTATE_D1:
+               acpi_state = ACPI_STATE_D1;
+               break;
+       case PCI_POWERSTATE_D2:
+               acpi_state = ACPI_STATE_D2;
+               break;
+       case PCI_POWERSTATE_D3:
+               acpi_state = ACPI_STATE_D3;
+               break;
+       default:
+               return (EINVAL);
+       }
+
+       /*
+        * We set the state using PCI Power Management outside of setting
+        * the ACPI state.  This means that when powering down a device, we
+        * first shut it down using PCI, and then using ACPI, which lets ACPI
+        * try to power down any Power Resources that are now no longer used.
+        * When powering up a device, we let ACPI set the state first so that
+        * it can enable any needed Power Resources before changing the PCI
+        * power state.
+        */
+       old_state = pci_get_powerstate(child);
+       if (old_state < state) {
+               error = pci_set_powerstate_method(dev, child, state);
+               if (error)
+                       return (error);
+       }
+       h = acpi_get_handle(child);
+       if (h != NULL) {
+               status = acpi_pwr_switch_consumer(h, acpi_state);
+               if (ACPI_FAILURE(status))
+                       device_printf(dev,
+                           "Failed to set ACPI power state D%d on %s: %s\n",
+                           acpi_state, device_get_nameunit(child),
+                           AcpiFormatException(status));
+       }
+       if (old_state > state)
+               return (pci_set_powerstate_method(dev, child, state));
+       else
+               return (0);
 }
-#endif
 
 static ACPI_STATUS
 acpi_pci_save_handle(ACPI_HANDLE handle, UINT32 level, void *context,
@@ -170,7 +223,7 @@ acpi_pci_save_handle(ACPI_HANDLE handle, UINT32 level, void *context,
 
        ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
-       if (ACPI_FAILURE(acpi_EvaluateInteger(handle, "_ADR", &address)))
+       if (ACPI_FAILURE(acpi_GetInteger(handle, "_ADR", &address)))
                return_ACPI_STATUS(AE_OK);
        slot = address >> 16;
        func = address & 0xffff;
index f727bc0..208baca 100644 (file)
@@ -23,8 +23,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_pci_link.c,v 1.13 2004/01/20 21:38:48 jhb Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_pci_link.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_pci_link.c,v 1.14 2004/04/14 03:34:11 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_pci_link.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
 #include <sys/bus.h>
 
 #include "acpi.h"
-
 #include <dev/acpica5/acpivar.h>
 #include <dev/acpica5/acpi_pcibvar.h>
 
-/*
- * Hooks for the ACPI CA debugging infrastructure
- */
+/* Hooks for the ACPI CA debugging infrastructure. */
 #define _COMPONENT     ACPI_BUS
 ACPI_MODULE_NAME("PCI_LINK")
 
@@ -55,7 +52,6 @@ struct acpi_pci_link_entry {
        ACPI_RESOURCE   possible_resources;
        UINT8           number_of_interrupts;
        UINT8           interrupts[MAX_POSSIBLE_INTERRUPTS];
-
        UINT8           sorted_irq[MAX_POSSIBLE_INTERRUPTS];
        int             references;
        int             priority;
@@ -94,11 +90,9 @@ acpi_pci_link_dump_polarity(UINT32 ActiveHighLow)
        case ACPI_ACTIVE_HIGH:
                printf("high,");
                break;
-
        case ACPI_ACTIVE_LOW:
                printf("low,");
                break;
-
        default:
                printf("unknown,");
                break;
@@ -113,11 +107,9 @@ acpi_pci_link_dump_trigger(UINT32 EdgeLevel)
        case ACPI_EDGE_SENSITIVE:
                printf("edge,");
                break;
-
        case ACPI_LEVEL_SENSITIVE:
                printf("level,");
                break;
-
        default:
                printf("unknown,");
                break;
@@ -132,11 +124,9 @@ acpi_pci_link_dump_sharemode(UINT32 SharedExclusive)
        case ACPI_EXCLUSIVE:
                printf("exclusive");
                break;
-
        case ACPI_SHARED:
                printf("sharable");
                break;
-
        default:
                printf("unknown");
                break;
@@ -150,42 +140,35 @@ acpi_pci_link_entry_dump(struct acpi_prt_entry *entry)
        ACPI_RESOURCE_IRQ       *Irq;
        ACPI_RESOURCE_EXT_IRQ   *ExtIrq;
 
-       if (entry == NULL || entry->pci_link == NULL) {
+       if (entry == NULL || entry->pci_link == NULL)
                return;
-       }
 
        printf("%s irq %3d: ", acpi_name(entry->pci_link->handle),
            entry->pci_link->current_irq);
 
        printf("[");
-       for (i = 0; i < entry->pci_link->number_of_interrupts; i++) {
+       for (i = 0; i < entry->pci_link->number_of_interrupts; i++)
                printf("%3d", entry->pci_link->interrupts[i]);
-       }
        printf("] ");
 
        switch (entry->pci_link->possible_resources.Id) {
        case ACPI_RSTYPE_IRQ:
                Irq = &entry->pci_link->possible_resources.Data.Irq;
-
                acpi_pci_link_dump_polarity(Irq->ActiveHighLow);
                acpi_pci_link_dump_trigger(Irq->EdgeLevel);
                acpi_pci_link_dump_sharemode(Irq->SharedExclusive);
                break;
-
        case ACPI_RSTYPE_EXT_IRQ:
                ExtIrq = &entry->pci_link->possible_resources.Data.ExtendedIrq;
-
                acpi_pci_link_dump_polarity(ExtIrq->ActiveHighLow);
                acpi_pci_link_dump_trigger(ExtIrq->EdgeLevel);
                acpi_pci_link_dump_sharemode(ExtIrq->SharedExclusive);
                break;
        }
 
-       printf(" %d.%d.%d", entry->busno,
+       printf(" %d.%d.%d\n", entry->busno,
            (int)((entry->prt.Address & 0xffff0000) >> 16),
            (int)entry->prt.Pin);
-
-       printf("\n");
 }
 
 static ACPI_STATUS
@@ -198,8 +181,7 @@ acpi_pci_link_get_object_status(ACPI_HANDLE handle, UINT32 *sta)
        ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
        if (handle == NULL || sta == NULL) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                   "invalid argument\n"));
+               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "invalid argument\n"));
                return_ACPI_STATUS (AE_BAD_PARAMETER);
        }
 
@@ -212,8 +194,8 @@ acpi_pci_link_get_object_status(ACPI_HANDLE handle, UINT32 *sta)
                    acpi_name(handle), AcpiFormatException(error)));
                return_ACPI_STATUS (error);
        }
-       devinfo = (ACPI_DEVICE_INFO *)buf.Pointer;
 
+       devinfo = (ACPI_DEVICE_INFO *)buf.Pointer;
        if ((devinfo->Valid & ACPI_VALID_HID) == 0 ||
            strcmp(devinfo->HardwareId.Value, "PNP0C0F") != 0) {
                ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "invalid hardware ID - %s\n",
@@ -269,9 +251,9 @@ acpi_pci_link_get_irq_resources(ACPI_RESOURCE *resources,
                NumberOfInterrupts = resources->Data.Irq.NumberOfInterrupts;
                Interrupts = resources->Data.Irq.Interrupts;
                break;
-
        case ACPI_RSTYPE_EXT_IRQ:
-                NumberOfInterrupts = resources->Data.ExtendedIrq.NumberOfInterrupts;
+                NumberOfInterrupts =
+                   resources->Data.ExtendedIrq.NumberOfInterrupts;
                 Interrupts = resources->Data.ExtendedIrq.Interrupts;
                break;
        }
@@ -284,12 +266,12 @@ acpi_pci_link_get_irq_resources(ACPI_RESOURCE *resources,
        count = 0;
        for (i = 0; i < NumberOfInterrupts; i++) {
                if (i >= MAX_POSSIBLE_INTERRUPTS) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_WARN, "too many IRQs %d\n", i));
+                       ACPI_DEBUG_PRINT((ACPI_DB_WARN, "too many IRQs (%d)\n",
+                           i));
                        break;
                }
-
                if (Interrupts[i] == 0) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid IRQ %d\n",
+                       ACPI_DEBUG_PRINT((ACPI_DB_WARN, "invalid IRQ %d\n",
                            Interrupts[i]));
                        continue;
                }
@@ -335,7 +317,6 @@ acpi_pci_link_get_current_irq(struct acpi_pci_link_entry *link, UINT8 *irq)
        }
 
        resources = (ACPI_RESOURCE *) buf.Pointer;
-
        number_of_interrupts = 0;
        bzero(interrupts, sizeof(interrupts));
        error = acpi_pci_link_get_irq_resources(resources,
@@ -344,7 +325,7 @@ acpi_pci_link_get_current_irq(struct acpi_pci_link_entry *link, UINT8 *irq)
 
        if (ACPI_FAILURE(error)) {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                   "couldn't get current IRQ from PCI interrupt link %s - %s\n",
+                   "couldn't get current IRQ from interrupt link %s - %s\n",
                    acpi_name(link->handle), AcpiFormatException(error)));
                return_ACPI_STATUS (error);
        }
@@ -397,7 +378,7 @@ acpi_pci_link_add_link(ACPI_HANDLE handle, struct acpi_prt_entry *entry)
        error = acpi_pci_link_get_current_irq(link, &link->current_irq);
        if (ACPI_FAILURE(error)) {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                   "couldn't get current IRQ from PCI interrupt link %s - %s\n",
+                   "couldn't get current IRQ from interrupt link %s - %s\n",
                    acpi_name(handle), AcpiFormatException(error)));
        }
 
@@ -406,11 +387,10 @@ acpi_pci_link_add_link(ACPI_HANDLE handle, struct acpi_prt_entry *entry)
        error = AcpiGetPossibleResources(handle, &buf);
        if (ACPI_FAILURE(error)) {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                   "couldn't get PCI interrupt link device _PRS data %s - %s\n",
+                   "couldn't get interrupt link device _PRS data %s - %s\n",
                    acpi_name(handle), AcpiFormatException(error)));
                goto out;
        }
-
        if (buf.Pointer == NULL) {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
                    "_PRS nuffer is empty - %s\n", acpi_name(handle)));
@@ -426,14 +406,14 @@ acpi_pci_link_add_link(ACPI_HANDLE handle, struct acpi_prt_entry *entry)
            &link->number_of_interrupts, link->interrupts);
        if (ACPI_FAILURE(error)) {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                   "couldn't get possible IRQs from PCI interrupt link %s - %s\n",
+                   "couldn't get possible IRQs from interrupt link %s - %s\n",
                    acpi_name(handle), AcpiFormatException(error)));
                goto out;
        }
 
        if (link->number_of_interrupts == 0) {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                   "PCI interrupt link device _PRS data is corrupted - %s\n",
+                   "interrupt link device _PRS data is corrupted - %s\n",
                    acpi_name(handle)));
                error = AE_NULL_ENTRY;
                goto out;
@@ -446,13 +426,10 @@ acpi_pci_link_add_link(ACPI_HANDLE handle, struct acpi_prt_entry *entry)
 
        error = AE_OK;
 out:
-       if (buf.Pointer != NULL) {
+       if (buf.Pointer != NULL)
                AcpiOsFree(buf.Pointer);
-       }
-
-       if (error != AE_OK && link != NULL) {
+       if (error != AE_OK && link != NULL)
                AcpiOsFree(link);
-       }
 
        return_ACPI_STATUS (error);
 }
@@ -467,7 +444,7 @@ acpi_pci_link_add_prt(device_t pcidev, ACPI_PCI_ROUTING_TABLE *prt, int busno)
 
        ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
-       if ((prt == NULL) || (prt->Source == NULL) || (prt->Source[0] == '\0')) {
+       if (prt == NULL || prt->Source == NULL || prt->Source[0] == '\0') {
                ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
                    "couldn't handle this routing table - hardwired\n"));
                return_ACPI_STATUS (AE_BAD_PARAMETER);
@@ -475,8 +452,7 @@ acpi_pci_link_add_prt(device_t pcidev, ACPI_PCI_ROUTING_TABLE *prt, int busno)
 
        error = AcpiGetHandle(acpi_get_handle(pcidev), prt->Source, &handle);
        if (ACPI_FAILURE(error)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                   "couldn't get acpi handle - %s\n",
+               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "couldn't get handle - %s\n",
                    AcpiFormatException(error)));
                return_ACPI_STATUS (error);
        }
@@ -489,9 +465,9 @@ acpi_pci_link_add_prt(device_t pcidev, ACPI_PCI_ROUTING_TABLE *prt, int busno)
                return_ACPI_STATUS (error);
        }
 
-       if (!(sta & (ACPI_STA_PRESENT | ACPI_STA_FUNCTIONAL))) {
+       if ((sta & (ACPI_STA_PRESENT | ACPI_STA_FUNCTIONAL)) == 0) {
                ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                   "PCI interrupt link is not functional - %s\n",
+                   "interrupt link is not functional - %s\n",
                    acpi_name(handle)));
                return_ACPI_STATUS (AE_ERROR);
        }
@@ -501,7 +477,7 @@ acpi_pci_link_add_prt(device_t pcidev, ACPI_PCI_ROUTING_TABLE *prt, int busno)
                    entry->prt.Address == prt->Address &&
                    entry->prt.Pin == prt->Pin) {
                        ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                           "PCI interrupt link entry already exists - %s\n",
+                           "interrupt link entry already exists - %s\n",
                            acpi_name(handle)));
                        return_ACPI_STATUS (AE_ALREADY_EXISTS);
                }
@@ -513,7 +489,6 @@ acpi_pci_link_add_prt(device_t pcidev, ACPI_PCI_ROUTING_TABLE *prt, int busno)
                    "couldn't allocate memory - %s\n", acpi_name(handle)));
                return_ACPI_STATUS (AE_NO_MEMORY);
        }
-
        bzero(entry, sizeof(struct acpi_prt_entry));
 
        entry->pcidev = pcidev;
@@ -523,7 +498,7 @@ acpi_pci_link_add_prt(device_t pcidev, ACPI_PCI_ROUTING_TABLE *prt, int busno)
        error = acpi_pci_link_add_link(handle, entry);
        if (ACPI_FAILURE(error)) {
                ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                   "couldn't add prt entry to pci link %s - %s\n",
+                   "couldn't add _PRT entry to link %s - %s\n",
                    acpi_name(handle), AcpiFormatException(error)));
                goto out;
        }
@@ -532,9 +507,8 @@ acpi_pci_link_add_prt(device_t pcidev, ACPI_PCI_ROUTING_TABLE *prt, int busno)
        error = AE_OK;
 
 out:
-       if (error != AE_OK && entry != NULL) {
+       if (error != AE_OK && entry != NULL)
                AcpiOsFree(entry);
-       }
 
        return_ACPI_STATUS (error);
 }
@@ -544,20 +518,17 @@ acpi_pci_link_is_valid_irq(struct acpi_pci_link_entry *link, UINT8 irq)
 {
        UINT8                   i;
 
-       if (irq == 0) {
+       if (irq == 0)
                return (0);
-       }
 
        for (i = 0; i < link->number_of_interrupts; i++) {
-               if (link->interrupts[i] == irq) {
+               if (link->interrupts[i] == irq)
                        return (1);
-               }
        }
 
        /* allow initial IRQ as valid one. */
-       if (link->initial_irq == irq) {
+       if (link->initial_irq == irq)
                return (1);
-       }
 
        return (0);
 }
@@ -582,24 +553,17 @@ acpi_pci_link_set_irq(struct acpi_pci_link_entry *link, UINT8 irq)
        error = acpi_pci_link_get_current_irq(link, &link->current_irq);
        if (ACPI_FAILURE(error)) {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                   "couldn't get current IRQ from PCI interrupt link %s - %s\n",
+                   "couldn't get current IRQ from interrupt link %s - %s\n",
                    acpi_name(link->handle), AcpiFormatException(error)));
        }
 
-       if (link->current_irq == irq) {
+       if (link->current_irq == irq)
                return_ACPI_STATUS (AE_OK);
-       }
 
        bzero(&resbuf, sizeof(resbuf));
        crsbuf.Pointer = NULL;
 
        switch (link->possible_resources.Id) {
-       default:
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                   "Resource is not an IRQ entry %s - %d\n",
-                   acpi_name(link->handle), link->possible_resources.Id));
-               return_ACPI_STATUS (AE_TYPE);
-
        case ACPI_RSTYPE_IRQ:
                resbuf.Id = ACPI_RSTYPE_IRQ;
                resbuf.Length = ACPI_SIZEOF_RESOURCE(ACPI_RESOURCE_IRQ);
@@ -609,16 +573,21 @@ acpi_pci_link_set_irq(struct acpi_pci_link_entry *link, UINT8 irq)
                resbuf.Data.Irq.NumberOfInterrupts = 1;
                resbuf.Data.Irq.Interrupts[0] = irq;
                break;
-
        case ACPI_RSTYPE_EXT_IRQ:
                resbuf.Id = ACPI_RSTYPE_EXT_IRQ;
                resbuf.Length = ACPI_SIZEOF_RESOURCE(ACPI_RESOURCE_EXT_IRQ);
 
                /* structure copy other fields */
-               resbuf.Data.ExtendedIrq = link->possible_resources.Data.ExtendedIrq;
+               resbuf.Data.ExtendedIrq =
+                   link->possible_resources.Data.ExtendedIrq;
                resbuf.Data.ExtendedIrq.NumberOfInterrupts = 1;
                resbuf.Data.ExtendedIrq.Interrupts[0] = irq;
                break;
+       default:
+               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
+                   "Resource is not an IRQ entry %s - %d\n",
+                   acpi_name(link->handle), link->possible_resources.Id));
+               return_ACPI_STATUS (AE_TYPE);
        }
 
        error = acpi_AppendBufferResource(&crsbuf, &resbuf);
@@ -628,10 +597,9 @@ acpi_pci_link_set_irq(struct acpi_pci_link_entry *link, UINT8 irq)
                    acpi_name(link->handle)));
                return_ACPI_STATUS (error);
        }
-
        if (crsbuf.Pointer == NULL) {
                ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                   "buffer setup by acpi_AppendBufferResource is corrupted - %s\n",
+                   "appended buffer for %s is corrupted\n",
                    acpi_name(link->handle)));
                return_ACPI_STATUS (AE_NO_MEMORY);
        }
@@ -639,7 +607,7 @@ acpi_pci_link_set_irq(struct acpi_pci_link_entry *link, UINT8 irq)
        error = AcpiSetCurrentResources(link->handle, &crsbuf);
        if (ACPI_FAILURE(error)) {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                   "couldn't set PCI interrupt link device _SRS %s - %s\n",
+                   "couldn't set link device _SRS %s - %s\n",
                    acpi_name(link->handle), AcpiFormatException(error)));
                return_ACPI_STATUS (error);
        }
@@ -655,9 +623,9 @@ acpi_pci_link_set_irq(struct acpi_pci_link_entry *link, UINT8 irq)
                return_ACPI_STATUS (error);
        }
 
-       if (!(sta & ACPI_STA_ENABLE)) {
+       if ((sta & ACPI_STA_ENABLE) == 0) {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                   "PCI interrupt link is disabled - %s\n",
+                   "interrupt link %s is disabled\n",
                    acpi_name(link->handle)));
                return_ACPI_STATUS (AE_ERROR);
        }
@@ -665,7 +633,7 @@ acpi_pci_link_set_irq(struct acpi_pci_link_entry *link, UINT8 irq)
        error = acpi_pci_link_get_current_irq(link, &link->current_irq);
        if (ACPI_FAILURE(error)) {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                   "couldn't get current IRQ from PCI interrupt link %s - %s\n",
+                   "couldn't get current IRQ from interrupt link %s - %s\n",
                    acpi_name(link->handle), AcpiFormatException(error)));
                return_ACPI_STATUS (error);
        }
@@ -674,9 +642,8 @@ acpi_pci_link_set_irq(struct acpi_pci_link_entry *link, UINT8 irq)
                error = AE_OK;
        } else {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                   "couldn't set IRQ %d to PCI interrupt link %d - %s\n",
+                   "couldn't set IRQ %d to interrupt link %d - %s\n",
                    irq, link->current_irq, acpi_name(link->handle)));
-
                link->current_irq = 0;
                error = AE_ERROR;
        }
@@ -690,7 +657,6 @@ acpi_pci_link_set_irq(struct acpi_pci_link_entry *link, UINT8 irq)
 
 static void
 acpi_pci_link_bootdisabled_dump(void)
-
 {
        int                     i;
        int                     irq;
@@ -698,9 +664,8 @@ acpi_pci_link_bootdisabled_dump(void)
 
        TAILQ_FOREACH(link, &acpi_pci_link_entries, links) {
                /* boot-disabled link only. */
-               if (link->current_irq != 0) {
+               if (link->current_irq != 0)
                        continue;
-               }
 
                printf("%s:\n", acpi_name(link->handle));
                printf("        interrupts:     ");
@@ -748,26 +713,18 @@ acpi_pci_link_init_irq_penalty(void)
 }
 
 static int
-acpi_pci_link_is_irq_exclusive(ACPI_RESOURCE *res)
+link_exclusive(ACPI_RESOURCE *res)
 {
-       if (res == NULL) {
+       if (res == NULL ||
+           (res->Id != ACPI_RSTYPE_IRQ &&
+           res->Id != ACPI_RSTYPE_EXT_IRQ))
                return (0);
-       }
 
-       if (res->Id != ACPI_RSTYPE_IRQ &&
-           res->Id != ACPI_RSTYPE_EXT_IRQ) {
-               return (0);
-       }
-
-       if (res->Id == ACPI_RSTYPE_IRQ &&
-           res->Data.Irq.SharedExclusive == ACPI_EXCLUSIVE) {
-               return (1);
-       }
-
-       if (res->Id == ACPI_RSTYPE_EXT_IRQ &&
-           res->Data.ExtendedIrq.SharedExclusive == ACPI_EXCLUSIVE) {
+       if ((res->Id == ACPI_RSTYPE_IRQ &&
+           res->Data.Irq.SharedExclusive == ACPI_EXCLUSIVE) ||
+           (res->Id == ACPI_RSTYPE_EXT_IRQ &&
+           res->Data.ExtendedIrq.SharedExclusive == ACPI_EXCLUSIVE))
                return (1);
-       }
 
        return (0);
 }
@@ -783,14 +740,13 @@ acpi_pci_link_update_irq_penalty(device_t dev, int busno)
        struct acpi_pci_link_entry *link;
 
        TAILQ_FOREACH(entry, &acpi_prt_entries, links) {
-               if (entry->busno != busno) {
+               if (entry->busno != busno)
                        continue;
-               }
 
+               /* Impossible? */
                link = entry->pci_link;
-               if (link == NULL) {
-                       continue;       /* impossible... */
-               }
+               if (link == NULL)
+                       continue;
 
                if (link->current_irq != 0) {
                        /* not boot-disabled link, we will use this IRQ. */
@@ -805,9 +761,8 @@ acpi_pci_link_update_irq_penalty(device_t dev, int busno)
                        irq_penalty[irq] += 10;
 
                        /* higher penalty if exclusive. */
-                       if (acpi_pci_link_is_irq_exclusive(&link->possible_resources)) {
+                       if (link_exclusive(&link->possible_resources))
                                irq_penalty[irq] += 100;
-                       }
 
                        /* XXX try to get this IRQ in non-sharable mode. */
                        rid = 0;
@@ -838,14 +793,13 @@ acpi_pci_link_set_bootdisabled_priority(void)
        TAILQ_HEAD(, acpi_pci_link_entry) sorted_list;
 
        if (bootverbose) {
-               printf("---- before setting priority for links ------------\n");
+               printf("ACPI PCI link before setting link priority:\n");
                acpi_pci_link_bootdisabled_dump();
        }
 
        /* reset priority for all links. */
-       TAILQ_FOREACH(link, &acpi_pci_link_entries, links) {
+       TAILQ_FOREACH(link, &acpi_pci_link_entries, links)
                link->priority = 0;
-       }
 
        TAILQ_FOREACH(link, &acpi_pci_link_entries, links) {
                /* not boot-disabled link, give no chance to be arbitrated. */
@@ -866,7 +820,8 @@ acpi_pci_link_set_bootdisabled_priority(void)
                        sum_penalty += irq_penalty[irq];
                }
 
-               link->priority = (sum_penalty * link->references) / link->number_of_interrupts;
+               link->priority = (sum_penalty * link->references) /
+                   link->number_of_interrupts;
        }
 
        /*
@@ -877,11 +832,10 @@ acpi_pci_link_set_bootdisabled_priority(void)
        while (!TAILQ_EMPTY(&acpi_pci_link_entries)) {
                link = TAILQ_FIRST(&acpi_pci_link_entries);
                /* find an entry which has the highest priority. */
-               TAILQ_FOREACH(link_pri, &acpi_pci_link_entries, links) {
-                       if (link->priority < link_pri->priority) {
+               TAILQ_FOREACH(link_pri, &acpi_pci_link_entries, links)
+                       if (link->priority < link_pri->priority)
                                link = link_pri;
-                       }
-               }
+
                /* move to work list. */
                TAILQ_REMOVE(&acpi_pci_link_entries, link, links);
                TAILQ_INSERT_TAIL(&sorted_list, link, links);
@@ -904,15 +858,14 @@ acpi_pci_link_fixup_bootdisabled_link(void)
        ACPI_STATUS             error;
 
        if (bootverbose) {
-               printf("---- before fixup boot-disabled links -------------\n");
+               printf("ACPI PCI link before fixup for boot-disabled links:\n");
                acpi_pci_link_bootdisabled_dump();
        }
 
        TAILQ_FOREACH(link, &acpi_pci_link_entries, links) {
                /* ignore non boot-disabled links. */
-               if (link->current_irq != 0) {
+               if (link->current_irq != 0)
                        continue;
-               }
 
                /* sort IRQs based on their penalty descending. */
                for (i = 0; i < link->number_of_interrupts; i++) {
@@ -937,12 +890,11 @@ acpi_pci_link_fixup_bootdisabled_link(void)
                                irq_penalty[irq1] += 100 * link->references;
                                break;
                        }
-                       /* NG, try next IRQ... */
                }
        }
 
        if (bootverbose) {
-               printf("---- after fixup boot-disabled links --------------\n");
+               printf("ACPI PCI link after fixup for boot-disabled links:\n");
                acpi_pci_link_bootdisabled_dump();
        }
 }
@@ -962,9 +914,8 @@ acpi_pci_link_config(device_t dev, ACPI_BUFFER *prtbuf, int busno)
 
        ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
-       if (acpi_disabled("pci_link")) {
+       if (acpi_disabled("pci_link"))
                return (0);
-       }
 
        if (first_time) {
                TAILQ_INIT(&acpi_prt_entries);
@@ -973,14 +924,12 @@ acpi_pci_link_config(device_t dev, ACPI_BUFFER *prtbuf, int busno)
                first_time = 0;
        }
 
-       if (prtbuf == NULL) {
+       if (prtbuf == NULL)
                return (-1);
-       }
 
        prtp = prtbuf->Pointer;
-       if (prtp == NULL) {             /* didn't get routing table */
+       if (prtp == NULL)               /* didn't get routing table */
                return (-1);
-       }
 
        /* scan the PCI Routing Table */
        for (;;) {
@@ -1001,12 +950,10 @@ acpi_pci_link_config(device_t dev, ACPI_BUFFER *prtbuf, int busno)
        }
 
        if (bootverbose) {
-               printf("---- initial configuration ------------------------\n");
+               printf("ACPI PCI link initial configuration:\n");
                TAILQ_FOREACH(entry, &acpi_prt_entries, links) {
-                       if (entry->busno != busno) {
+                       if (entry->busno != busno)
                                continue;
-                       }
-
                        acpi_pci_link_entry_dump(entry);
                }
        }
@@ -1016,9 +963,8 @@ acpi_pci_link_config(device_t dev, ACPI_BUFFER *prtbuf, int busno)
                int                     irq;
                char                    prthint[32];
 
-               if (entry->busno != busno) {
+               if (entry->busno != busno)
                        continue;
-               }
 
                snprintf(prthint, sizeof(prthint),
                    "hw.acpi.pci.link.%d.%d.%d.irq", entry->busno,
@@ -1032,7 +978,7 @@ acpi_pci_link_config(device_t dev, ACPI_BUFFER *prtbuf, int busno)
                        error = acpi_pci_link_set_irq(entry->pci_link, irq);
                        if (ACPI_FAILURE(error)) {
                                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                   "couldn't set IRQ to PCI interrupt link entry %s - %s\n",
+                                   "couldn't set IRQ to link entry %s - %s\n",
                                    acpi_name(entry->pci_link->handle),
                                    AcpiFormatException(error)));
                        }
@@ -1043,9 +989,8 @@ acpi_pci_link_config(device_t dev, ACPI_BUFFER *prtbuf, int busno)
                 * Do auto arbitration for this device's PCI link
                 * if hint value 0 is specified.
                 */
-               if (irq == 0) {
+               if (irq == 0)
                        entry->pci_link->current_irq = 0;
-               }
        }
 
        /* auto arbitration */
@@ -1054,12 +999,10 @@ acpi_pci_link_config(device_t dev, ACPI_BUFFER *prtbuf, int busno)
        acpi_pci_link_fixup_bootdisabled_link();
 
        if (bootverbose) {
-               printf("---- arbitrated configuration ---------------------\n");
+               printf("ACPI PCI link arbitrated configuration:\n");
                TAILQ_FOREACH(entry, &acpi_prt_entries, links) {
-                       if (entry->busno != busno) {
+                       if (entry->busno != busno)
                                continue;
-                       }
-
                        acpi_pci_link_entry_dump(entry);
                }
        }
@@ -1075,20 +1018,18 @@ acpi_pci_link_resume(device_t dev, ACPI_BUFFER *prtbuf, int busno)
 
        ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
-       if (acpi_disabled("pci_link")) {
+       if (acpi_disabled("pci_link"))
                return (0);
-       }
 
        TAILQ_FOREACH(entry, &acpi_prt_entries, links) {
-               if (entry->pcidev != dev) {
+               if (entry->pcidev != dev)
                        continue;
-               }
 
                error = acpi_pci_link_set_irq(entry->pci_link,
                            entry->pci_link->current_irq);
                if (ACPI_FAILURE(error)) {
                        ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                           "couldn't set IRQ to PCI interrupt link entry %s - %s\n",
+                           "couldn't set IRQ to link entry %s - %s\n",
                            acpi_name(entry->pci_link->handle),
                            AcpiFormatException(error)));
                }
@@ -1096,4 +1037,3 @@ acpi_pci_link_resume(device_t dev, ACPI_BUFFER *prtbuf, int busno)
 
        return (0);
 }
-
index 586b052..5847a93 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_pcib.c,v 1.36 2003/12/18 17:04:11 kan Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_pcib.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_pcib.c,v 1.43 2004/05/06 02:18:58 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_pcib.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
 #include <sys/kernel.h>
 
 #include "acpi.h"
-
 #include "acpivar.h"
 #include "acpi_pcibvar.h"
 
-#include <machine/pci_cfgreg.h>
 #include <bus/pci/pcivar.h>
-#include <bus/pci/pcib_private.h>
 #include "pcib_if.h"
 
-/*
- * Hooks for the ACPI CA debugging infrastructure
- */
+/* Hooks for the ACPI CA debugging infrastructure. */
 #define _COMPONENT     ACPI_BUS
 ACPI_MODULE_NAME("PCI")
 
@@ -68,12 +63,12 @@ acpi_pcib_attach(device_t dev, ACPI_BUFFER *prt, int busno)
        return_VALUE(ENXIO);
 
     /*
-     * Get the PCI interrupt routing table for this bus.
+     * Get the PCI interrupt routing table for this bus.  If we can't
+     * get it, this is not an error but may reduce functionality.
      */
     prt->Length = ACPI_ALLOCATE_BUFFER;
     status = AcpiGetIrqRoutingTable(acpi_get_handle(dev), prt);
     if (ACPI_FAILURE(status))
-       /* This is not an error, but it may reduce functionality. */
        device_printf(dev,
            "could not get PCI interrupt routing table for %s - %s\n",
            acpi_name(acpi_get_handle(dev)), AcpiFormatException(status));
@@ -90,7 +85,8 @@ acpi_pcib_attach(device_t dev, ACPI_BUFFER *prt, int busno)
      * Now go scan the bus.
      */
     acpi_pci_link_config(dev, prt, busno);
-    return_VALUE(bus_generic_attach(dev));
+
+    return_VALUE (bus_generic_attach(dev));
 }
 
 int
@@ -130,18 +126,20 @@ acpi_pcib_route_interrupt(device_t pcib, device_t dev, int pin,
     prsbuf.Pointer = NULL;
     interrupt = 255;
 
-    /* ACPI numbers pins 0-3, not 1-4 like the BIOS */
+    /* ACPI numbers pins 0-3, not 1-4 like the BIOS. */
     pin--;
 
+    /* We failed to retrieve the routing table. */
     prtp = prtbuf->Pointer;
-    if (prtp == NULL)                  /* didn't get routing table */
+    if (prtp == NULL)
        goto out;
 
-    /* scan the table looking for this device */
+    /* Scan the table to look for this device. */
     for (;;) {
        prt = (ACPI_PCI_ROUTING_TABLE *)prtp;
 
-       if (prt->Length == 0)           /* end of table */
+       /* We hit the end of the table. */
+       if (prt->Length == 0)
            goto out;
 
        /*
@@ -152,58 +150,57 @@ acpi_pcib_route_interrupt(device_t pcib, device_t dev, int pin,
         * is required by the specification to be 0xffff.  We don't risk
         * checking it here.
         */
-       if ((((prt->Address & 0xffff0000) >> 16) == pci_get_slot(dev)) &&
-           (prt->Pin == pin)) {
+       if (((prt->Address & 0xffff0000) >> 16) == pci_get_slot(dev) &&
+           prt->Pin == pin) {
            if (bootverbose)
-               device_printf(pcib, "matched entry for %d.%d.INT%c (source %s)\n",
-                             pci_get_bus(dev), pci_get_slot(dev), 'A' + pin, prt->Source);
+               device_printf(pcib, "matched entry for %d.%d.INT%c (src %s)\n",
+                             pci_get_bus(dev), pci_get_slot(dev), 'A' + pin,
+                             prt->Source);
            break;
        }
        
-       /* skip to next entry */
+       /* Skip to the next entry. */
        prtp += prt->Length;
     }
 
     /*
      * If source is empty/NULL, the source index is the global IRQ number.
      */
-    if ((prt->Source == NULL) || (prt->Source[0] == '\0')) {
+    if (prt->Source == NULL || prt->Source[0] == '\0') {
        if (bootverbose)
            device_printf(pcib, "device is hardwired to IRQ %d\n",
-               prt->SourceIndex);
+                         prt->SourceIndex);
        interrupt = prt->SourceIndex;
        goto out;
     }
     
     /*
-     * We have to find the source device (PCI interrupt link device)
+     * We have to find the source device (PCI interrupt link device).
      */
     if (ACPI_FAILURE(AcpiGetHandle(ACPI_ROOT_OBJECT, prt->Source, &lnkdev))) {
        device_printf(pcib, "couldn't find PCI interrupt link device %s\n",
-           prt->Source);
+                     prt->Source);
        goto out;
     }
 
     /*
-     * Verify that this is a PCI link device, and that it's present.
+     * Verify that this is a PCI link device and that it's present.
      */
     buf.Length = ACPI_ALLOCATE_BUFFER;
     if (ACPI_FAILURE(AcpiGetObjectInfo(lnkdev, &buf))) {
        device_printf(pcib, "couldn't validate PCI interrupt link device %s\n",
-           prt->Source);
+                     prt->Source);
        goto out;
     }
     devinfo = (ACPI_DEVICE_INFO *)buf.Pointer;
     if ((devinfo->Valid & ACPI_VALID_HID) == 0 ||
        strcmp("PNP0C0F", devinfo->HardwareId.Value) != 0) {
-
-       device_printf(pcib, "PCI interrupt link device %s has wrong _HID (%s)\n",
+       device_printf(pcib, "PCI interrupt link %s has invalid _HID (%s)\n",
                      prt->Source, devinfo->HardwareId.Value);
        goto out;
     }
     if ((devinfo->Valid & ACPI_VALID_STA) != 0 &&
        (devinfo->CurrentStatus & 0x9) != 0x9) {
-
        device_printf(pcib, "PCI interrupt link device %s not present\n",
                      prt->Source);
        goto out;
@@ -211,44 +208,47 @@ acpi_pcib_route_interrupt(device_t pcib, device_t dev, int pin,
 
     /*
      * Get the current and possible resources for the interrupt link device.
+     * If we fail to get the current resources, this is a fatal error.
      */
     crsbuf.Length = ACPI_ALLOCATE_BUFFER;
     if (ACPI_FAILURE(status = AcpiGetCurrentResources(lnkdev, &crsbuf))) {
-       device_printf(pcib, "couldn't get PCI interrupt link device _CRS data - %s\n",
+       device_printf(pcib, "PCI interrupt link device _CRS failed - %s\n",
                      AcpiFormatException(status));
-       goto out;       /* this is fatal */
+       goto out;
     }
     prsbuf.Length = ACPI_ALLOCATE_BUFFER;
     if (ACPI_FAILURE(status = AcpiGetPossibleResources(lnkdev, &prsbuf))) {
-       device_printf(pcib, "couldn't get PCI interrupt link device _PRS data - %s\n",
+       device_printf(pcib, "PCI interrupt link device _PRS failed - %s\n",
                      AcpiFormatException(status));
-       /* this is not fatal, since it may be hardwired */
     }
     ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "got %ld bytes for %s._CRS\n",
-       (long)crsbuf.Length, acpi_name(lnkdev)));
+                    (long)crsbuf.Length, acpi_name(lnkdev)));
     ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "got %ld bytes for %s._PRS\n",
-       (long)prsbuf.Length, acpi_name(lnkdev)));
+                    (long)prsbuf.Length, acpi_name(lnkdev)));
 
     /*
-     * The interrupt may already be routed, so check _CRS first.  We don't check the
-     * 'decoding' bit in the _STA result, since there's nothing in the spec that 
-     * mandates it be set, however some BIOS' will set it if the decode is active.
+     * The interrupt may already be routed, so check _CRS first.  We don't
+     * check the 'decoding' bit in the _STA result, since there's nothing in
+     * the spec that mandates it be set, however some BIOS' will set it if
+     * the decode is active.
      *
-     * The Source Index points to the particular resource entry we're interested in.
+     * The Source Index points to the particular resource entry we're
+     * interested in.
      */
-    if (ACPI_FAILURE(acpi_FindIndexedResource(&crsbuf, prt->SourceIndex, &crsres))) {
+    if (ACPI_FAILURE(acpi_FindIndexedResource(&crsbuf, prt->SourceIndex,
+       &crsres))) {
        device_printf(pcib, "_CRS buffer corrupt, cannot route interrupt\n");
        goto out;
     }
 
-    /* type-check the resource we've got */
+    /* Type-check the resource we've found. */
     if (crsres->Id != ACPI_RSTYPE_IRQ && crsres->Id != ACPI_RSTYPE_EXT_IRQ) {
        device_printf(pcib, "_CRS resource entry has unsupported type %d\n",
-           crsres->Id);
+                     crsres->Id);
        goto out;
     }
 
-    /* set variables based on resource type */
+    /* Set variables based on resource type. */
     if (crsres->Id == ACPI_RSTYPE_IRQ) {
        NumberOfInterrupts = crsres->Data.Irq.NumberOfInterrupts;
        Interrupts = crsres->Data.Irq.Interrupts;
@@ -257,112 +257,135 @@ acpi_pcib_route_interrupt(device_t pcib, device_t dev, int pin,
        Interrupts = crsres->Data.ExtendedIrq.Interrupts;
     }
 
-    /* if there's more than one interrupt, we are confused */
+    /* If there's more than one interrupt, this is an error. */
     if (NumberOfInterrupts > 1) {
        device_printf(pcib, "device has too many interrupts (%d)\n",
-           NumberOfInterrupts);
+                     NumberOfInterrupts);
        goto out;
     }
 
     /* 
-     * If there's only one interrupt, and it's not zero, then we're already routed.
+     * If there's only one interrupt, and it's not zero, then it's already
+     * routed.
      *
-     * Note that we could also check the 'decoding' bit in _STA, but can't depend on
-     * it since it's not part of the spec.
+     * Note that we could also check the 'decoding' bit in _STA, but can't
+     * depend on it since it's not part of the spec.
      *
      * XXX check ASL examples to see if this is an acceptable set of tests
      */
-    if ((NumberOfInterrupts == 1) && (Interrupts[0] != 0)) {
+    if (NumberOfInterrupts == 1 && Interrupts[0] != 0) {
        device_printf(pcib, "slot %d INT%c is routed to irq %d\n",
-           pci_get_slot(dev), 'A' + pin, Interrupts[0]);
+                     pci_get_slot(dev), 'A' + pin, Interrupts[0]);
        interrupt = Interrupts[0];
        goto out;
     }
     
     /* 
      * There isn't an interrupt, so we have to look at _PRS to get one.
-     * Get the set of allowed interrupts from the _PRS resource indexed by SourceIndex.
+     * Get the set of allowed interrupts from the _PRS resource indexed
+     * by SourceIndex.
      */
     if (prsbuf.Pointer == NULL) {
-       device_printf(pcib, "device has no routed interrupt and no _PRS on PCI interrupt link device\n");
-       goto out;
-    }
-    if (ACPI_FAILURE(acpi_FindIndexedResource(&prsbuf, prt->SourceIndex, &prsres))) {
-       device_printf(pcib, "_PRS buffer corrupt, cannot route interrupt\n");
-       goto out;
-    }
-
-    /* type-check the resource we've got */
-    if (prsres->Id != ACPI_RSTYPE_IRQ && prsres->Id != ACPI_RSTYPE_EXT_IRQ) {
-       device_printf(pcib, "_PRS resource entry has unsupported type %d\n",
-           prsres->Id);
+       device_printf(pcib, "no routed irq and no _PRS on irq link device\n");
        goto out;
     }
 
-    /* set variables based on resource type */
-    if (prsres->Id == ACPI_RSTYPE_IRQ) {
-       NumberOfInterrupts = prsres->Data.Irq.NumberOfInterrupts;
-       Interrupts = prsres->Data.Irq.Interrupts;
-    } else {
-       NumberOfInterrupts = prsres->Data.ExtendedIrq.NumberOfInterrupts;
-       Interrupts = prsres->Data.ExtendedIrq.Interrupts;
+    /*
+     * Search through the _PRS resources, looking for an IRQ or extended
+     * IRQ resource.  Skip dependent function resources for now.  In the
+     * future, we might use these for priority but this is good enough for
+     * now until BIOS vendors actually mean something by using them.
+     */
+    prsres = NULL;
+    for (i = prt->SourceIndex; prsres == NULL; i++) {
+       if (ACPI_FAILURE(acpi_FindIndexedResource(&prsbuf, i, &prsres))) {
+           device_printf(pcib, "_PRS lacks IRQ resource, routing failed\n");
+           goto out;
+       }
+       switch (prsres->Id) {
+       case ACPI_RSTYPE_IRQ:
+           NumberOfInterrupts = prsres->Data.Irq.NumberOfInterrupts;
+           Interrupts = prsres->Data.Irq.Interrupts;
+           break;
+       case ACPI_RSTYPE_EXT_IRQ:
+           NumberOfInterrupts = prsres->Data.ExtendedIrq.NumberOfInterrupts;
+           Interrupts = prsres->Data.ExtendedIrq.Interrupts;
+           break;
+       case ACPI_RSTYPE_START_DPF:
+           prsres = NULL;
+           continue;
+       default:
+           device_printf(pcib, "_PRS has invalid type %d\n", prsres->Id);
+           goto out;
+       }
     }
 
-    /* there has to be at least one interrupt available */
+    /* There has to be at least one interrupt available. */
     if (NumberOfInterrupts < 1) {
        device_printf(pcib, "device has no interrupts\n");
        goto out;
     }
 
     /*
-     * Pick an interrupt to use.  Note that a more scientific approach than just
-     * taking the first one available would be desirable.
+     * Pick an interrupt to use.  Note that a more scientific approach than
+     * just taking the first one available would be desirable.
      *
-     * The PCI BIOS $PIR table offers "preferred PCI interrupts", but ACPI doesn't
-     * seem to offer a similar mechanism, so picking a "good" interrupt here is a
-     * difficult task.
+     * The PCI BIOS $PIR table offers "preferred PCI interrupts", but ACPI
+     * doesn't seem to offer a similar mechanism, so picking a "good"
+     * interrupt here is a difficult task.
      *
-     * Build a resource buffer and pass it to AcpiSetCurrentResources to route the
-     * new interrupt.
+     * Build a resource buffer and pass it to AcpiSetCurrentResources to
+     * route the new interrupt.
      */
     device_printf(pcib, "possible interrupts:");
     for (i = 0; i < NumberOfInterrupts; i++)
        printf("  %d", Interrupts[i]);
     printf("\n");
 
-    if (crsbuf.Pointer != NULL)                        /* should never happen */
+    /* This should never happen. */
+    if (crsbuf.Pointer != NULL)
        AcpiOsFree(crsbuf.Pointer);
+
+    /* XXX Data.Irq and Data.ExtendedIrq are implicitly structure-copied. */
     crsbuf.Pointer = NULL;
     if (prsres->Id == ACPI_RSTYPE_IRQ) {
        resbuf.Id = ACPI_RSTYPE_IRQ;
        resbuf.Length = ACPI_SIZEOF_RESOURCE(ACPI_RESOURCE_IRQ);
-       resbuf.Data.Irq = prsres->Data.Irq;             /* structure copy other fields */
+       resbuf.Data.Irq = prsres->Data.Irq;
        resbuf.Data.Irq.NumberOfInterrupts = 1;
-       resbuf.Data.Irq.Interrupts[0] = Interrupts[0];  /* just take first... */
+       resbuf.Data.Irq.Interrupts[0] = Interrupts[0];
     } else {
        resbuf.Id = ACPI_RSTYPE_EXT_IRQ;
-       resbuf.Length = ACPI_SIZEOF_RESOURCE(ACPI_RESOURCE_IRQ);
-       resbuf.Data.ExtendedIrq = prsres->Data.ExtendedIrq;     /* structure copy other fields */
+       resbuf.Length = ACPI_SIZEOF_RESOURCE(ACPI_RESOURCE_EXT_IRQ);
+       resbuf.Data.ExtendedIrq = prsres->Data.ExtendedIrq;
        resbuf.Data.ExtendedIrq.NumberOfInterrupts = 1;
-       resbuf.Data.ExtendedIrq.Interrupts[0] = Interrupts[0];  /* just take first... */
+       resbuf.Data.ExtendedIrq.Interrupts[0] = Interrupts[0];
     }
     if (ACPI_FAILURE(status = acpi_AppendBufferResource(&crsbuf, &resbuf))) {
-       device_printf(pcib, "couldn't route interrupt %d via %s, interrupt resource build failed - %s\n",
-                     Interrupts[0], acpi_name(lnkdev), AcpiFormatException(status));
+       device_printf(pcib, "buf append failed for interrupt %d via %s - %s\n",
+                     Interrupts[0], acpi_name(lnkdev),
+                     AcpiFormatException(status));
+       goto out;
+    }
+    /* XXX Figure out how this is happening when the append succeeds. */
+    if (crsbuf.Pointer == NULL) {
+       device_printf(pcib, "_CRS buf NULL after append?\n");
        goto out;
     }
     if (ACPI_FAILURE(status = AcpiSetCurrentResources(lnkdev, &crsbuf))) {
-       device_printf(pcib, "couldn't route interrupt %d via %s - %s\n",
-                     Interrupts[0], acpi_name(lnkdev), AcpiFormatException(status));
+       device_printf(pcib, "_SRS failed for interrupt %d via %s - %s\n",
+                     Interrupts[0], acpi_name(lnkdev),
+                     AcpiFormatException(status));
        goto out;
     }
     
-    /* successful, return the interrupt we just routed */
+    /* Return the interrupt we just routed. */
     device_printf(pcib, "slot %d INT%c routed to irq %d via %s\n", 
-       pci_get_slot(dev), 'A' + pin, Interrupts[0], acpi_name(lnkdev));
+                 pci_get_slot(dev), 'A' + pin, Interrupts[0],
+                 acpi_name(lnkdev));
     interrupt = Interrupts[0];
 
- out:
+out:
     if (crsbuf.Pointer != NULL)
        AcpiOsFree(crsbuf.Pointer);
     if (prsbuf.Pointer != NULL)
@@ -371,6 +394,5 @@ acpi_pcib_route_interrupt(device_t pcib, device_t dev, int pin,
        AcpiOsFree(buf.Pointer);
 
     /* XXX APIC_IO interrupt mapping? */
-    return_VALUE(interrupt);
+    return_VALUE (interrupt);
 }
-
index 14afe3b..d82d024 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_pcib_acpi.c,v 1.29 2003/08/22 06:06:16 imp Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_pcib_acpi.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_pcib_acpi.c,v 1.32 2004/04/09 18:14:32 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_pcib_acpi.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -71,6 +71,10 @@ static void          acpi_pcib_write_config(device_t dev, int bus, int slot, int func, i
                                               u_int32_t data, int bytes);
 static int             acpi_pcib_acpi_route_interrupt(device_t pcib,
     device_t dev, int pin);
+static struct resource *acpi_pcib_acpi_alloc_resource(device_t dev,
+                           device_t child, int type, int *rid,
+                           u_long start, u_long end, u_long count,
+                           u_int flags);
 
 static device_method_t acpi_pcib_acpi_methods[] = {
     /* Device interface */
@@ -84,7 +88,7 @@ static device_method_t acpi_pcib_acpi_methods[] = {
     DEVMETHOD(bus_print_child,         bus_generic_print_child),
     DEVMETHOD(bus_read_ivar,           acpi_pcib_read_ivar),
     DEVMETHOD(bus_write_ivar,          acpi_pcib_write_ivar),
-    DEVMETHOD(bus_alloc_resource,      bus_generic_alloc_resource),
+    DEVMETHOD(bus_alloc_resource,      acpi_pcib_acpi_alloc_resource),
     DEVMETHOD(bus_release_resource,    bus_generic_release_resource),
     DEVMETHOD(bus_activate_resource,   bus_generic_activate_resource),
     DEVMETHOD(bus_deactivate_resource,         bus_generic_deactivate_resource),
@@ -107,6 +111,7 @@ static driver_t acpi_pcib_acpi_driver = {
 };
 
 DRIVER_MODULE(acpi_pcib, acpi, acpi_pcib_acpi_driver, pcib_devclass, 0, 0);
+MODULE_DEPEND(acpi_pcib, acpi, 1, 1, 1);
 
 static int
 acpi_pcib_acpi_probe(device_t dev)
@@ -159,7 +164,7 @@ acpi_pcib_acpi_attach(device_t dev)
      *     if _BBN is zero and pcib0 already exists, we try to read our
      *     bus number from the configuration registers at address _ADR.
      */
-    status = acpi_EvaluateInteger(sc->ap_handle, "_BBN", &sc->ap_bus);
+    status = acpi_GetInteger(sc->ap_handle, "_BBN", &sc->ap_bus);
     if (ACPI_FAILURE(status)) {
        if (status != AE_NOT_FOUND) {
            device_printf(dev, "could not evaluate _BBN - %s\n",
@@ -178,7 +183,7 @@ acpi_pcib_acpi_attach(device_t dev)
     busok = 1;
     if (sc->ap_bus == 0 && devclass_get_device(pcib_devclass, 0) != dev) {
        busok = 0;
-       status = acpi_EvaluateInteger(sc->ap_handle, "_ADR", &addr);
+       status = acpi_GetInteger(sc->ap_handle, "_ADR", &addr);
        if (ACPI_FAILURE(status)) {
            if (status != AE_NOT_FOUND) {
                device_printf(dev, "could not evaluate _ADR - %s\n",
@@ -217,7 +222,7 @@ acpi_pcib_acpi_attach(device_t dev)
      * Get our segment number by evaluating _SEG
      * It's OK for this to not exist.
      */
-    if (ACPI_FAILURE(status = acpi_EvaluateInteger(sc->ap_handle, "_SEG", &sc->ap_segment))) {
+    if (ACPI_FAILURE(status = acpi_GetInteger(sc->ap_handle, "_SEG", &sc->ap_segment))) {
        if (status != AE_NOT_FOUND) {
            device_printf(dev, "could not evaluate _SEG - %s\n", AcpiFormatException(status));
            return_VALUE(ENXIO);
@@ -290,3 +295,20 @@ acpi_pcib_acpi_route_interrupt(device_t pcib, device_t dev, int pin)
     sc = device_get_softc(pcib);
     return (acpi_pcib_route_interrupt(pcib, dev, pin, &sc->ap_prt));
 }
+
+struct resource *
+acpi_pcib_acpi_alloc_resource(device_t dev, device_t child, int type, int *rid,
+  u_long start, u_long end, u_long count, u_int flags)
+{
+       /*
+        * If no memory preference is given, use upper 256MB slot most
+        * bioses use for their memory window.  Typically other bridges
+        * before us get in the way to assert their preferences on memory.
+        * Hardcoding like this sucks, so a more MD/MI way needs to be
+        * found to do it.
+        */
+       if (type == SYS_RES_MEMORY && start == 0UL && end == ~0UL)
+               start = 0xf0000000;
+       return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
+           count, flags));
+}
index 280aebf..3e243d0 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_pcib_pci.c,v 1.5 2003/08/24 17:48:01 obrien Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_pcib_pci.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_pcib_pci.c,v 1.7 2004/05/10 18:26:22 jhb Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_pcib_pci.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -106,6 +106,7 @@ static driver_t acpi_pcib_pci_driver = {
 };
 
 DRIVER_MODULE(acpi_pcib, pci, acpi_pcib_pci_driver, pcib_devclass, 0, 0);
+MODULE_DEPEND(acpi_pcib, acpi, 1, 1, 1);
 
 static int
 acpi_pcib_pci_probe(device_t dev)
@@ -164,5 +165,13 @@ acpi_pcib_pci_route_interrupt(device_t pcib, device_t dev, int pin)
     struct acpi_pcib_softc *sc;
 
     sc = device_get_softc(pcib);
-    return (acpi_pcib_route_interrupt(pcib, dev, pin, &sc->ap_prt));
+
+    /*
+     * If we don't have a _PRT, fall back to the swizzle method
+     * for routing interrupts.
+     */
+    if (sc->ap_prt.Pointer == NULL)
+       return (pcib_route_interrupt(pcib, dev, pin));
+    else
+       return (acpi_pcib_route_interrupt(pcib, dev, pin, &sc->ap_prt));
 }
index a338112..3f20444 100644 (file)
@@ -23,8 +23,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_powerres.c,v 1.17 2004/02/12 20:45:01 jhb Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_powerres.c,v 1.2 2004/05/05 22:19:24 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_powerres.c,v 1.22 2004/04/14 17:58:19 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_powerres.c,v 1.3 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -58,7 +58,7 @@
 MALLOC_DEFINE(M_ACPIPWR, "acpipwr", "ACPI power resources");
 
 /* Hooks for the ACPI CA debugging infrastructure */
-#define _COMPONENT     ACPI_POWER
+#define _COMPONENT     ACPI_POWERRES
 ACPI_MODULE_NAME("POWERRES")
 
 /* Return values from _STA on a power resource */
@@ -97,9 +97,13 @@ static TAILQ_HEAD(acpi_powerconsumer_list, acpi_powerconsumer)
        acpi_powerconsumers;
 
 static ACPI_STATUS     acpi_pwr_register_consumer(ACPI_HANDLE consumer);
+#ifdef notyet
 static ACPI_STATUS     acpi_pwr_deregister_consumer(ACPI_HANDLE consumer);
+#endif /* notyet */
 static ACPI_STATUS     acpi_pwr_register_resource(ACPI_HANDLE res);
+#ifdef notyet
 static ACPI_STATUS     acpi_pwr_deregister_resource(ACPI_HANDLE res);
+#endif /* notyet */
 static void            acpi_pwr_reference_resource(ACPI_OBJECT *obj,
                                                    void *arg);
 static ACPI_STATUS     acpi_pwr_switch_power(void);
@@ -188,6 +192,7 @@ acpi_pwr_register_resource(ACPI_HANDLE res)
     return_ACPI_STATUS (status);
 }
 
+#ifdef notyet
 /*
  * Deregister a power resource.
  */
@@ -217,6 +222,7 @@ acpi_pwr_deregister_resource(ACPI_HANDLE res)
 
     return_ACPI_STATUS (AE_OK);
 }
+#endif /* notyet */
 
 /*
  * Register a power consumer.  
@@ -249,6 +255,7 @@ acpi_pwr_register_consumer(ACPI_HANDLE consumer)
     return_ACPI_STATUS (AE_OK);
 }
 
+#ifdef notyet
 /*
  * Deregister a power consumer.
  *
@@ -278,6 +285,7 @@ acpi_pwr_deregister_consumer(ACPI_HANDLE consumer)
 
     return_ACPI_STATUS (AE_OK);
 }
+#endif /* notyet */
 
 /*
  * Set a power consumer to a particular power state.
@@ -296,6 +304,10 @@ acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state)
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
+    /* It's never ok to switch a non-existent consumer. */
+    if (consumer == NULL)
+       return_ACPI_STATUS (AE_NOT_FOUND);
+
     /* Find the consumer */
     if ((pc = acpi_pwr_find_consumer(consumer)) == NULL) {
        if (ACPI_FAILURE(status = acpi_pwr_register_consumer(consumer)))
@@ -484,30 +496,10 @@ acpi_pwr_reference_resource(ACPI_OBJECT *obj, void *arg)
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
-    /* check the object type */
-    switch (obj->Type) {
-    case ACPI_TYPE_ANY:
-       ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "building reference from %s to %s\n",
-                        acpi_name(pc->ac_consumer),
-                        acpi_name(obj->Reference.Handle)));
-       res = obj->Reference.Handle;
-       break;
-    case ACPI_TYPE_STRING:
-       ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "building reference from %s to %s\n",
-                         acpi_name(pc->ac_consumer), obj->String.Pointer));
-
-       /* Get the handle of the resource */
-       status = AcpiGetHandle(NULL, obj->String.Pointer, &res);
-       if (ACPI_FAILURE(status)) {
-           ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS,
-                            "couldn't find power resource %s\n", 
-                            obj->String.Pointer));
-           return_VOID;
-       }
-       break;
-    default:
+    res = acpi_GetReference(NULL, obj);
+    if (res == NULL) {
        ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS,
-                        "can't create a power reference for object type %d\n", 
+                        "can't create a power reference for object type %d\n",
                         obj->Type));
        return_VOID;
     }
@@ -564,7 +556,7 @@ acpi_pwr_switch_power(void)
        }
 
        /* We could cache this if we trusted it not to change under us */
-       status = acpi_EvaluateInteger(rp->ap_resource, "_STA", &cur);
+       status = acpi_GetInteger(rp->ap_resource, "_STA", &cur);
        if (ACPI_FAILURE(status)) {
            ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "can't get status of %s - %d\n",
                              acpi_name(rp->ap_resource), status));
@@ -607,7 +599,7 @@ acpi_pwr_switch_power(void)
        }
 
        /* We could cache this if we trusted it not to change under us */
-       status = acpi_EvaluateInteger(rp->ap_resource, "_STA", &cur);
+       status = acpi_GetInteger(rp->ap_resource, "_STA", &cur);
        if (ACPI_FAILURE(status)) {
            ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "can't get status of %s - %d\n",
                              acpi_name(rp->ap_resource), status));
index da7c63c..cad4a48 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_resource.c,v 1.20 2003/09/26 05:24:55 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_resource.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_resource.c,v 1.23 2004/04/09 18:14:32 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_resource.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -56,7 +56,7 @@ ACPI_MODULE_NAME("RESOURCE")
  */
 ACPI_STATUS
 acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
-                    struct acpi_parse_resource_set *set)
+                    struct acpi_parse_resource_set *set, void *arg)
 {
     ACPI_BUFFER                buf;
     ACPI_RESOURCE      *res;
@@ -86,7 +86,7 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
     }
     ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, "%s - got %ld bytes of resources\n",
                     acpi_name(handle), (long)buf.Length));
-    set->set_init(dev, &context);
+    set->set_init(dev, arg, &context);
 
     /* Iterate through the resources */
     curr = buf.Pointer;
@@ -373,7 +373,7 @@ acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
  * Resource-set vectors used to attach _CRS-derived resources 
  * to an ACPI device.
  */
-static void    acpi_res_set_init(device_t dev, void **context);
+static void    acpi_res_set_init(device_t dev, void *arg, void **context);
 static void    acpi_res_set_done(device_t dev, void *context);
 static void    acpi_res_set_ioport(device_t dev, void *context,
                                    u_int32_t base, u_int32_t length);
@@ -411,15 +411,17 @@ struct acpi_res_context {
     int                ar_nmem;
     int                ar_nirq;
     int                ar_ndrq;
+    void       *ar_parent;
 };
 
 static void
-acpi_res_set_init(device_t dev, void **context)
+acpi_res_set_init(device_t dev, void *arg, void **context)
 {
     struct acpi_res_context    *cp;
 
     if ((cp = AcpiOsAllocate(sizeof(*cp))) != NULL) {
        bzero(cp, sizeof(*cp));
+       cp->ar_parent = arg;
        *context = cp;
     }
 }
@@ -568,6 +570,7 @@ static driver_t acpi_sysresource_driver = {
 static devclass_t acpi_sysresource_devclass;
 DRIVER_MODULE(acpi_sysresource, acpi, acpi_sysresource_driver,
              acpi_sysresource_devclass, 0, 0);
+MODULE_DEPEND(acpi_sysresource, acpi, 1, 1, 1);
 
 static int
 acpi_sysresource_probe(device_t dev)
@@ -595,12 +598,11 @@ acpi_sysresource_attach(device_t dev)
      */
     for (i = 0; i < 100; i++) {
        rid = i;
-       res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0, 1, 0);
+       res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, 0);
        rid = i;
-       res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 0, ~0, 1, 0);
+       res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 0);
        rid = i;
-       res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
-                                RF_SHAREABLE);
+       res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_SHAREABLE);
     }
 
     return (0);
index 580df5f..31c4875 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.37 2004/02/03 04:18:56 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_thermal.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.45 2004/05/06 02:57:24 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_thermal.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -137,6 +137,7 @@ static driver_t acpi_tz_driver = {
 
 static devclass_t acpi_tz_devclass;
 DRIVER_MODULE(acpi_tz, acpi, acpi_tz_driver, acpi_tz_devclass, 0, 0);
+MODULE_DEPEND(acpi_tz, acpi, 1, 1, 1);
 
 static struct sysctl_ctx_list  acpi_tz_sysctl_ctx;
 static struct sysctl_oid       *acpi_tz_sysctl_tree;
@@ -199,7 +200,13 @@ acpi_tz_attach(device_t dev)
      */
     if ((error = acpi_tz_establish(sc)) != 0)
        goto out;
-    
+
+    /*
+     * XXX Call _INI if it exists.  ACPICA should do this but only handles
+     * Device objects for now.
+     */
+    AcpiEvaluateObject(sc->tz_handle, "_INI", NULL, NULL);
+
     /*
      * Register for any Notify events sent to this zone.
      */
@@ -398,7 +405,7 @@ acpi_tz_monitor(void *Context)
     sc->tz_tmp_updating = 1;
 
     /* Get the current temperature. */
-    status = acpi_EvaluateInteger(sc->tz_handle, "_TMP", &temp);
+    status = acpi_GetInteger(sc->tz_handle, "_TMP", &temp);
     if (ACPI_FAILURE(status)) {
        ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev),
            "error fetching current temperature -- %s\n",
@@ -443,7 +450,7 @@ acpi_tz_monitor(void *Context)
     }
 
     /* Handle user override of active mode */
-    if (sc->tz_requested > newactive)
+    if (sc->tz_requested != TZ_ACTIVE_NONE && sc->tz_requested < newactive)
        newactive = sc->tz_requested;
 
     /* update temperature-related flags */
@@ -544,40 +551,22 @@ acpi_tz_all_off(struct acpi_tz_softc *sc)
 static void
 acpi_tz_switch_cooler_off(ACPI_OBJECT *obj, void *arg)
 {
-    ACPI_HANDLE                cooler;
+    ACPI_HANDLE                        cooler;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     ACPI_ASSERTLOCK;
 
-    switch(obj->Type) {
-    case ACPI_TYPE_ANY:
-       ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s off\n",
-                        acpi_name(obj->Reference.Handle)));
-
-       acpi_pwr_switch_consumer(obj->Reference.Handle, ACPI_STATE_D3);
-       break;
-    case ACPI_TYPE_STRING:
-       ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s off\n",
-                        obj->String.Pointer));
-
-       /*
-        * Find the handle for the device and turn it off.
-        * The String object here seems to contain a fully-qualified path, so we
-        * don't have to search for it in our parents.
-        *
-        * XXX This may not always be the case.
-        */
-       if (ACPI_SUCCESS(AcpiGetHandle(NULL, obj->String.Pointer, &cooler)))
-           acpi_pwr_switch_consumer(cooler, ACPI_STATE_D3);
-       break;
-    default:
-       ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS,
-                        "called to handle unsupported object type %d\n",
-                        obj->Type));
-       break;
+    cooler = acpi_GetReference(NULL, obj);
+    if (cooler == NULL) {
+       ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "can't get handle\n"));
+       return_VOID;
     }
 
+    ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s off\n",
+                    acpi_name(cooler)));
+    acpi_pwr_switch_consumer(cooler, ACPI_STATE_D3);
+
     return_VOID;
 }
 
@@ -585,7 +574,7 @@ acpi_tz_switch_cooler_off(ACPI_OBJECT *obj, void *arg)
  * Given an object, verify that it's a reference to a device of some sort, 
  * and try to switch it on.
  *
- * XXX replication of off/on function code is bad, mmmkay?
+ * XXX replication of off/on function code is bad.
  */
 static void
 acpi_tz_switch_cooler_on(ACPI_OBJECT *obj, void *arg)
@@ -598,47 +587,19 @@ acpi_tz_switch_cooler_on(ACPI_OBJECT *obj, void *arg)
 
     ACPI_ASSERTLOCK;
 
-    switch(obj->Type) {
-    case ACPI_TYPE_ANY:
-       ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s on\n",
-                        acpi_name(obj->Reference.Handle)));
+    cooler = acpi_GetReference(NULL, obj);
+    if (cooler == NULL) {
+       ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "can't get handle\n"));
+       return_VOID;
+    }
 
-       status = acpi_pwr_switch_consumer(obj->Reference.Handle, ACPI_STATE_D0);
-       if (ACPI_FAILURE(status)) {
-           ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev),
-                       "failed to activate %s - %s\n",
-                       acpi_name(obj->Reference.Handle),
-                       AcpiFormatException(status));
-       }
-       break;
-    case ACPI_TYPE_STRING:
-       ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s on\n",
-                        obj->String.Pointer));
-
-       /*
-        * Find the handle for the device and turn it off.
-        * The String object here seems to contain a fully-qualified path, so we
-        * don't have to search for it in our parents.
-        *
-        * XXX This may not always be the case.
-        */
-       if (ACPI_SUCCESS(AcpiGetHandle(NULL, obj->String.Pointer, &cooler))) {
-           status = acpi_pwr_switch_consumer(cooler, ACPI_STATE_D0);
-           if (ACPI_FAILURE(status)) {
-               ACPI_VPRINT(sc->tz_dev,
-                           acpi_device_get_parent_softc(sc->tz_dev),
-                           "failed to activate %s - %s\n",
-                           obj->String.Pointer, AcpiFormatException(status));
-           }
-       } else {
-           ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev),
-                       "couldn't find %s\n", obj->String.Pointer);
-       }
-       break;
-    default:
-       ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "unsupported object type %d\n",
-                         obj->Type));
-       break;
+    ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "called to turn %s on\n",
+                    acpi_name(cooler)));
+    status = acpi_pwr_switch_consumer(cooler, ACPI_STATE_D0);
+    if (ACPI_FAILURE(status)) {
+       ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev),
+                   "failed to activate %s - %s\n", acpi_name(cooler),
+                   AcpiFormatException(status));
     }
 
     return_VOID;
@@ -655,7 +616,7 @@ acpi_tz_getparam(struct acpi_tz_softc *sc, char *node, int *data)
 
     ACPI_ASSERTLOCK;
 
-    if (ACPI_FAILURE(acpi_EvaluateInteger(sc->tz_handle, node, data))) {
+    if (ACPI_FAILURE(acpi_GetInteger(sc->tz_handle, node, data))) {
        *data = -1;
     } else {
        ACPI_DEBUG_PRINT((ACPI_DB_VALUES, "%s.%s = %d\n",
@@ -777,8 +738,6 @@ acpi_tz_timeout(struct acpi_tz_softc *sc)
 static void
 acpi_tz_power_profile(void *arg)
 {
-    ACPI_OBJECT_LIST           args;
-    ACPI_OBJECT                        obj;
     ACPI_STATUS                        status;
     struct acpi_tz_softc       *sc = (struct acpi_tz_softc *)arg;
     int                                state;
@@ -794,11 +753,8 @@ acpi_tz_power_profile(void *arg)
     if ((sc->tz_flags & TZ_FLAG_NO_SCP) == 0) {
 
        /* Call _SCP to set the new profile */
-       obj.Type = ACPI_TYPE_INTEGER;
-       obj.Integer.Value = (state == POWER_PROFILE_PERFORMANCE) ? 0 : 1;
-       args.Count = 1;
-       args.Pointer = &obj;
-       status = AcpiEvaluateObject(sc->tz_handle, "_SCP", &args, NULL);
+       status = acpi_SetInteger(sc->tz_handle, "_SCP",
+           (state == POWER_PROFILE_PERFORMANCE) ? 0 : 1);
        if (ACPI_FAILURE(status)) {
            if (status != AE_NOT_FOUND)
                ACPI_VPRINT(sc->tz_dev,
index a0befe4..4e4f9eb 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_timer.c,v 1.25 2003/08/28 16:06:30 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/acpi_timer.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_timer.c,v 1.32 2004/04/24 16:25:00 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpi_timer.c,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 #include "opt_acpi.h"
 #include <sys/param.h>
  */
 
 /* Hooks for the ACPI CA debugging infrastructure */
-#define _COMPONENT     ACPI_SYSTEM
+#define _COMPONENT     ACPI_TIMER
 ACPI_MODULE_NAME("TIMER")
 
-static device_t        acpi_timer_dev;
-struct resource        *acpi_timer_reg;
+static device_t                        acpi_timer_dev;
+static struct resource         *acpi_timer_reg;
+static bus_space_handle_t      acpi_timer_bsh;
+static bus_space_tag_t         acpi_timer_bst;
 
 static u_int   acpi_timer_frequency = 14318182 / 4;
 
 static void    acpi_timer_identify(driver_t *driver, device_t parent);
 static int     acpi_timer_probe(device_t dev);
 static int     acpi_timer_attach(device_t dev);
-static unsigned        acpi_timer_get_timecount(struct timecounter *tc);
-static unsigned        acpi_timer_get_timecount_safe(struct timecounter *tc);
+static u_int   acpi_timer_get_timecount(struct timecounter *tc);
+static u_int   acpi_timer_get_timecount_safe(struct timecounter *tc);
 static int     acpi_timer_sysctl_freq(SYSCTL_HANDLER_ARGS);
-static void    acpi_timer_test(void);
+static void    acpi_timer_boot_test(void);
 
-static uint32_t read_counter(void);
-static int     test_counter(void);
+static u_int   acpi_timer_read(void);
+static int     acpi_timer_test(void);
 
 static device_method_t acpi_timer_methods[] = {
     DEVMETHOD(device_identify, acpi_timer_identify),
@@ -90,66 +92,23 @@ static driver_t acpi_timer_driver = {
 
 static devclass_t acpi_timer_devclass;
 DRIVER_MODULE(acpi_timer, acpi, acpi_timer_driver, acpi_timer_devclass, 0, 0);
+MODULE_DEPEND(acpi_timer, acpi, 1, 1, 1);
 
 static struct timecounter acpi_timer_timecounter = {
-       acpi_timer_get_timecount_safe,
-       0,
-       0xffffff,
-       0,
-       "ACPI",
-       1000
+       acpi_timer_get_timecount_safe,  /* get_timecount function */
+       0,                              /* no poll_pps */
+       0,                              /* no default counter_mask */
+       0,                              /* no default frequency */
+       "ACPI",                         /* name */
+       1000                            /* quality */
 };
 
-static uint32_t
-read_counter()
+static u_int
+acpi_timer_read()
 {
-    bus_space_handle_t bsh;
-    bus_space_tag_t bst;
-    u_int32_t tv;
-
-    bsh = rman_get_bushandle(acpi_timer_reg);
-    bst = rman_get_bustag(acpi_timer_reg);
-    tv = bus_space_read_4(bst, bsh, 0);
-    bus_space_barrier(bst, bsh, 0, 4, BUS_SPACE_BARRIER_READ);
-
-    return (tv);
+    return (bus_space_read_4(acpi_timer_bst, acpi_timer_bsh, 0));
 }
 
-#define N 2000
-static int
-test_counter()
-{
-    u_int      last, this;
-    int                min, max, n, delta;
-
-    min = 10000000;
-    max = 0;
-    last = read_counter();
-    for (n = 0; n < N; n++) {
-       this = read_counter();
-       delta = (this - last) & 0xffffff;
-       if (delta > max)
-           max = delta;
-       else if (delta < min)
-           min = delta;
-       last = this;
-    }
-    if (max - min > 2)
-       n = 0;
-    else if (min < 0 || max == 0)
-       n = 0;
-    else
-       n = 1;
-    if (bootverbose) {
-       printf("ACPI timer looks %s min = %d, max = %d, width = %d\n",
-               n ? "GOOD" : "BAD ",
-               min, max, max - min);
-    }
-
-    return (n);
-}
-#undef N
-
 /*
  * Locate the ACPI timer using the FADT, set up and allocate the I/O resources
  * we will be using.
@@ -166,7 +125,7 @@ acpi_timer_identify(driver_t *driver, device_t parent)
 
     if (acpi_disabled("timer") || AcpiGbl_FADT == NULL)
        return_VOID;
-    
+
     if ((dev = BUS_ADD_CHILD(parent, 0, "acpi_timer", 0)) == NULL) {
        device_printf(parent, "could not add acpi_timer0\n");
        return_VOID;
@@ -179,19 +138,30 @@ acpi_timer_identify(driver_t *driver, device_t parent)
       ? SYS_RES_IOPORT : SYS_RES_MEMORY;
     rstart = AcpiGbl_FADT->XPmTmrBlk.Address;
     bus_set_resource(dev, rtype, rid, rstart, rlen);
-    acpi_timer_reg = bus_alloc_resource(dev, rtype, &rid, 0, ~0, 1, RF_ACTIVE);
+    acpi_timer_reg = bus_alloc_resource_any(dev, rtype, &rid, RF_ACTIVE);
     if (acpi_timer_reg == NULL) {
        device_printf(dev, "couldn't allocate I/O resource (%s 0x%lx)\n",
                      rtype == SYS_RES_IOPORT ? "port" : "mem", rstart);
        return_VOID;
     }
+    acpi_timer_bsh = rman_get_bushandle(acpi_timer_reg);
+    acpi_timer_bst = rman_get_bustag(acpi_timer_reg);
+    if (AcpiGbl_FADT->TmrValExt != 0)
+       acpi_timer_timecounter.tc_counter_mask = 0xffffffff;
+    else
+       acpi_timer_timecounter.tc_counter_mask = 0x00ffffff;
+    acpi_timer_timecounter.tc_frequency = acpi_timer_frequency;
     if (testenv("debug.acpi.timer_test"))
-       acpi_timer_test();
+       acpi_timer_boot_test();
 
-    acpi_timer_timecounter.tc_frequency = acpi_timer_frequency;
+    /*
+     * If all tests of the counter succeed, use the ACPI-fast method.  If
+     * at least one failed, default to using the safe routine, which reads
+     * the timer multiple times to get a consistent value before returning.
+     */
     j = 0;
-    for(i = 0; i < 10; i++)
-       j += test_counter();
+    for (i = 0; i < 10; i++)
+       j += acpi_timer_test();
     if (j == 10) {
        acpi_timer_timecounter.tc_name = "ACPI-fast";
        acpi_timer_timecounter.tc_get_timecount = acpi_timer_get_timecount;
@@ -226,28 +196,31 @@ acpi_timer_attach(device_t dev)
 /*
  * Fetch current time value from reliable hardware.
  */
-static unsigned
+static u_int
 acpi_timer_get_timecount(struct timecounter *tc)
 {
-    return (read_counter());
+    return (acpi_timer_read());
 }
 
 /*
  * Fetch current time value from hardware that may not correctly
- * latch the counter.
+ * latch the counter.  We need to read until we have three monotonic
+ * samples and then use the middle one, otherwise we are not protected
+ * against the fact that the bits can be wrong in two directions.  If
+ * we only cared about monosity, two reads would be enough.
  */
-static unsigned
+static u_int
 acpi_timer_get_timecount_safe(struct timecounter *tc)
 {
-    unsigned u1, u2, u3;
+    u_int u1, u2, u3;
 
-    u2 = read_counter();
-    u3 = read_counter();
+    u2 = acpi_timer_read();
+    u3 = acpi_timer_read();
     do {
        u1 = u2;
        u2 = u3;
-       u3 = read_counter();
-    } while (u1 > u2 || u2 > u3 || u3 - u1 > 15);
+       u3 = acpi_timer_read();
+    } while (u1 > u2 || u2 > u3);
 
     return (u2);
 }
@@ -277,48 +250,13 @@ SYSCTL_PROC(_machdep, OID_AUTO, acpi_timer_freq, CTLTYPE_INT | CTLFLAG_RW,
            0, sizeof(u_int), acpi_timer_sysctl_freq, "I", "");
 
 /*
- * Test harness for verifying ACPI timer behaviour.
- * Boot with debug.acpi.timer_test set to invoke this.
- */
-static void
-acpi_timer_test(void)
-{
-    u_int32_t  u1, u2, u3;
-    
-    u1 = read_counter();
-    u2 = read_counter();
-    u3 = read_counter();
-    
-    device_printf(acpi_timer_dev, "timer test in progress, reboot to quit.\n");
-    for (;;) {
-       /*
-        * The failure case is where u3 > u1, but u2 does not fall between
-        * the two, ie. it contains garbage.
-        */
-       if (u3 > u1) {
-           if (u2 < u1 || u2 > u3)
-               device_printf(acpi_timer_dev,
-                             "timer is not monotonic: 0x%08x,0x%08x,0x%08x\n",
-                             u1, u2, u3);
-       }
-       u1 = u2;
-       u2 = u3;
-       u3 = read_counter();
-    }
-}
-
-/*
- * Chipset workaround driver hung off PCI.
- *
  * Some ACPI timers are known or believed to suffer from implementation
- * problems which can lead to erroneous values being read from the timer.
- *
- * Since we can't trust unknown chipsets, we default to a timer-read
- * routine which compensates for the most common problem (as detailed
- * in the excerpt from the Intel PIIX4 datasheet below).
+ * problems which can lead to erroneous values being read.  This function
+ * tests for consistent results from the timer and returns 1 if it believes
+ * the timer is consistent, otherwise it returns 0.
  *
- * When we detect a known-functional chipset, we disable the workaround
- * to improve speed.
+ * It appears the cause is that the counter is not latched to the PCI bus
+ * clock when read:
  *
  * ] 20. ACPI Timer Errata
  * ]
@@ -334,61 +272,77 @@ acpi_timer_test(void)
  * ] Workaround: Read the register twice and compare.
  * ] Status: This will not be fixed in the PIIX4 or PIIX4E, it is fixed
  * ] in the PIIX4M.
- *
- * The counter is in other words not latched to the PCI bus clock when
- * read.  Notice the workaround isn't:  We need to read until we have
- * three monotonic samples and then use the middle one, otherwise we are
- * not protected against the fact that the bits can be wrong in two
- * directions.  If we only cared about monosity two reads would be enough.
  */
+#define N 2000
+static int
+acpi_timer_test()
+{
+    uint32_t   last, this;
+    int                min, max, n, delta;
+    register_t s;
 
-#if 0
-static int     acpi_timer_pci_probe(device_t dev);
+    min = 10000000;
+    max = 0;
 
-static device_method_t acpi_timer_pci_methods[] = {
-    DEVMETHOD(device_probe,    acpi_timer_pci_probe),
-    {0, 0}
-};
+    /* Test the timer with interrupts disabled to get accurate results. */
+    s = intr_disable();
+    last = acpi_timer_read();
+    for (n = 0; n < N; n++) {
+       this = acpi_timer_read();
+       delta = acpi_TimerDelta(this, last);
+       if (delta > max)
+           max = delta;
+       else if (delta < min)
+           min = delta;
+       last = this;
+    }
+    intr_restore(s);
 
-static driver_t acpi_timer_pci_driver = {
-    "acpi_timer_pci",
-    acpi_timer_pci_methods,
-    0,
-};
+    if (max - min > 2)
+       n = 0;
+    else if (min < 0 || max == 0)
+       n = 0;
+    else
+       n = 1;
+    if (bootverbose) {
+       printf("ACPI timer looks %s min = %d, max = %d, width = %d\n",
+               n ? "GOOD" : "BAD ",
+               min, max, max - min);
+    }
 
-devclass_t acpi_timer_pci_devclass;
-DRIVER_MODULE(acpi_timer_pci, pci, acpi_timer_pci_driver,
-             acpi_timer_pci_devclass, 0, 0);
+    return (n);
+}
+#undef N
 
 /*
- * Look at PCI devices going past; if we detect one we know contains
- * a functional ACPI timer device, enable the faster timecounter read
- * routine.
+ * Test harness for verifying ACPI timer behaviour.
+ * Boot with debug.acpi.timer_test set to invoke this.
  */
-static int
-acpi_timer_pci_probe(device_t dev)
+static void
+acpi_timer_boot_test(void)
 {
-    int vendor, device, revid;
-    
-    vendor = pci_get_vendor(dev);
-    device = pci_get_device(dev);
-    revid  = pci_get_revid(dev);
-    
-    /* Detect the PIIX4M and i440MX, respectively */
-    if ((vendor == 0x8086 && device == 0x7113 && revid >= 0x03)        ||
-       (vendor == 0x8086 && device == 0x719b)) {
+    uint32_t u1, u2, u3;
 
-       acpi_timer_timecounter.tc_get_timecount = acpi_timer_get_timecount;
-       acpi_timer_timecounter.tc_name = "ACPI-fast";
-       if (bootverbose) {
-           device_printf(acpi_timer_dev,"functional ACPI timer detected, "
-                         "enabling fast timecount interface\n");
+    u1 = acpi_timer_read();
+    u2 = acpi_timer_read();
+    u3 = acpi_timer_read();
+
+    device_printf(acpi_timer_dev, "timer test in progress, reboot to quit.\n");
+    for (;;) {
+       /*
+        * The failure case is where u3 > u1, but u2 does not fall between
+        * the two, ie. it contains garbage.
+        */
+       if (u3 > u1) {
+           if (u2 < u1 || u2 > u3)
+               device_printf(acpi_timer_dev,
+                             "timer is not monotonic: 0x%08x,0x%08x,0x%08x\n",
+                             u1, u2, u3);
        }
+       u1 = u2;
+       u2 = u3;
+       u3 = acpi_timer_read();
     }
-
-    /* We never match anything */
-    return (ENXIO);
 }
-#endif
 
 #endif /* 0 */
diff --git a/sys/dev/acpica5/acpi_toshiba/Makefile b/sys/dev/acpica5/acpi_toshiba/Makefile
new file mode 100644 (file)
index 0000000..39a163b
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: src/sys/modules/acpi/acpi_toshiba/Makefile,v 1.1 2004/01/11 19:18:38 njl Exp $
+# $DragonFly: src/sys/dev/acpica5/acpi_toshiba/Makefile,v 1.1 2004/06/27 08:52:43 dillon Exp $
+
+.include "../Makefile.inc"
+.PATH:         ${.CURDIR}/../../../${MACHINE_ARCH}/acpica5
+
+KMOD=          acpi_toshiba
+CFLAGS+=       -I${.OBJDIR} -I${.OBJDIR}/.. -I${.CURDIR}/.. \
+               -I${.CURDIR}/../../../${SYSACPICA}/include
+SRCS=          acpi_toshiba.c opt_acpi.h device_if.h bus_if.h
+
+.include <bsd.kmod.mk>
diff --git a/sys/dev/acpica5/acpica_support.c b/sys/dev/acpica5/acpica_support.c
deleted file mode 100644 (file)
index 55d7176..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-/*-
- * Copyright (c) 2001 Mitsuru IWASAKI
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD: src/sys/dev/acpica/acpica_support.c,v 1.6.6.1 2003/08/22 20:49:20 jhb Exp $
- * $DragonFly: src/sys/dev/acpica5/Attic/acpica_support.c,v 1.1 2004/02/21 06:48:08 dillon Exp $
- */
-
-#include "acpi.h"
-#include <machine/cpufunc.h>
-#include <dev/acpica5/acpica_support.h>
-
-ACPI_MODULE_NAME("SUPPORT")
-
-/*
- * Implement support code temporary here until officially merged into
- * Intel ACPI CA release.
- */
-
-#undef _COMPONENT
-#define _COMPONENT     ACPI_HARDWARE
-
-/******************************************************************************
- *
- * FUNCTION:    AcpiEnterSleepStateS4Bios
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Enter a system sleep state S4BIOS
- *
- ******************************************************************************/
-        
-ACPI_STATUS
-AcpiEnterSleepStateS4Bios (
-    void)
-{
-    ACPI_OBJECT_LIST    ArgList;
-    ACPI_OBJECT         Arg;
-    UINT32              Value;
-
-
-    ACPI_FUNCTION_TRACE ("AcpiEnterSleepStateS4Bios");
-
-    /* run the _PTS and _GTS methods */
-
-    ACPI_MEMSET(&ArgList, 0, sizeof(ArgList));
-    ArgList.Count = 1;
-    ArgList.Pointer = &Arg;
-
-    ACPI_MEMSET(&Arg, 0, sizeof(Arg));
-    Arg.Type = ACPI_TYPE_INTEGER;
-    Arg.Integer.Value = ACPI_STATE_S4;
-
-    AcpiEvaluateObject (NULL, "\\_PTS", &ArgList, NULL);
-    AcpiEvaluateObject (NULL, "\\_GTS", &ArgList, NULL);
-
-    /* clear wake status */
-
-    AcpiSetRegister (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_LOCK);
-
-    ACPI_DISABLE_IRQS ();
-
-    AcpiHwDisableNonWakeupGpes();
-
-    /* flush caches */
-
-    ACPI_FLUSH_CPU_CACHE ();
-
-    /* write the value to command port and wait until we enter sleep state */
-    do
-    {
-        AcpiOsStall(1000000);
-        AcpiOsWritePort (AcpiGbl_FADT->SmiCmd, AcpiGbl_FADT->S4BiosReq, 8);
-        AcpiGetRegister (ACPI_BITREG_WAKE_STATUS, &Value, ACPI_MTX_LOCK);
-    }
-    while (!Value);
-
-    AcpiHwEnableNonWakeupGpes();
-
-    ACPI_ENABLE_IRQS ();
-
-    return_ACPI_STATUS (AE_OK);
-}
-
diff --git a/sys/dev/acpica5/acpica_support.h b/sys/dev/acpica5/acpica_support.h
deleted file mode 100644 (file)
index e3057dc..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*-
- * Copyright (c) 2001 Mitsuru IWASAKI
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD: src/sys/dev/acpica/acpica_support.h,v 1.1.6.1 2003/08/22 20:49:20 jhb Exp $
- * $DragonFly: src/sys/dev/acpica5/Attic/acpica_support.h,v 1.1 2004/02/21 06:48:08 dillon Exp $
- */
-
-#include "acpi.h"
-
-ACPI_STATUS
-AcpiEnterSleepStateS4Bios (
-    void);
-
-ACPI_STATUS
-AcpiSetDsdtTablePtr(
-    ACPI_TABLE_HEADER   *Ptr);
-
index a375f2e..bfa7ea7 100644 (file)
@@ -25,8 +25,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpivar.h,v 1.54 2004/02/19 18:20:03 njl Exp $
- * $DragonFly: src/sys/dev/acpica5/acpivar.h,v 1.1 2004/02/21 06:48:08 dillon Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpivar.h,v 1.64 2004/05/06 08:04:34 njl Exp $
+ * $DragonFly: src/sys/dev/acpica5/acpivar.h,v 1.2 2004/06/27 08:52:39 dillon Exp $
  */
 
 #include "bus_if.h"
@@ -54,9 +54,6 @@ struct acpi_softc {
 
     struct sysctl_ctx_list acpi_sysctl_ctx;
     struct sysctl_oid  *acpi_sysctl_tree;
-#define ACPI_POWER_BUTTON_DEFAULT_SX   ACPI_STATE_S5;
-#define ACPI_SLEEP_BUTTON_DEFAULT_SX   ACPI_STATE_S1;
-#define ACPI_LID_SWITCH_DEFAULT_SX     ACPI_STATE_S1;
     int                        acpi_power_button_sx;
     int                        acpi_sleep_button_sx;
     int                        acpi_lid_switch_sx;
@@ -67,7 +64,6 @@ struct acpi_softc {
     int                        acpi_sleep_delay;
     int                        acpi_s4bios;
     int                        acpi_disable_on_poweroff;
-
     int                        acpi_verbose;
 
     bus_dma_tag_t      acpi_waketag;
@@ -85,7 +81,7 @@ struct acpi_device {
     int                                ad_magic;
     void                       *ad_private;
 
-    /* resources */
+    /* Resources */
     struct resource_list       ad_rl;
 
 };
@@ -122,17 +118,17 @@ struct acpi_device {
  * ACPI CA does not define layers for non-ACPI CA drivers.
  * We define some here within the range provided.
  */
-#define        ACPI_BUS                0x00010000
-#define        ACPI_SYSTEM             0x00020000
-#define        ACPI_POWER              0x00040000
-#define        ACPI_EC                 0x00080000
-#define        ACPI_AC_ADAPTER         0x00100000
-#define        ACPI_BATTERY            0x00200000
-#define        ACPI_BUTTON             0x00400000
+#define        ACPI_AC_ADAPTER         0x00010000
+#define        ACPI_BATTERY            0x00020000
+#define        ACPI_BUS                0x00040000
+#define        ACPI_BUTTON             0x00080000
+#define        ACPI_EC                 0x00100000
+#define        ACPI_FAN                0x00200000
+#define        ACPI_POWERRES           0x00400000
 #define        ACPI_PROCESSOR          0x00800000
 #define        ACPI_THERMAL            0x01000000
-#define        ACPI_FAN                0x02000000
-#define        ACPI_TOSHIBA            0x04000000
+#define        ACPI_TIMER              0x02000000
+#define        ACPI_ASUS               0x04000000
 
 /*
  * Constants for different interrupt models used with acpi_SetIntrModel().
@@ -150,15 +146,75 @@ struct acpi_device {
 #define ACPI_IVAR_MAGIC                0x101
 #define ACPI_IVAR_PRIVATE      0x102
 
-extern ACPI_HANDLE     acpi_get_handle(device_t dev);
-extern int             acpi_set_handle(device_t dev, ACPI_HANDLE h);
-extern int             acpi_get_magic(device_t dev);
-extern int             acpi_set_magic(device_t dev, int m);
-extern void *          acpi_get_private(device_t dev);
-extern int             acpi_set_private(device_t dev, void *p);
-extern ACPI_OBJECT_TYPE        acpi_get_type(device_t dev);
-struct resource *      acpi_bus_alloc_gas(device_t dev, int *rid,
-                                          ACPI_GENERIC_ADDRESS *gas);
+static __inline ACPI_HANDLE
+acpi_get_handle(device_t dev)
+{
+    uintptr_t up;
+
+    if (BUS_READ_IVAR(device_get_parent(dev), dev, ACPI_IVAR_HANDLE, &up))
+       return (NULL);
+    return ((ACPI_HANDLE)up);
+}
+
+static __inline int
+acpi_set_handle(device_t dev, ACPI_HANDLE h)
+{
+    uintptr_t up;
+
+    up = (uintptr_t)h;
+    return (BUS_WRITE_IVAR(device_get_parent(dev), dev, ACPI_IVAR_HANDLE, up));
+}
+
+static __inline int
+acpi_get_magic(device_t dev)
+{
+    uintptr_t up;
+
+    if (BUS_READ_IVAR(device_get_parent(dev), dev, ACPI_IVAR_MAGIC, &up))
+       return(0);
+    return ((int)up);
+}
+
+static __inline int
+acpi_set_magic(device_t dev, int m)
+{
+    uintptr_t up;
+
+    up = (uintptr_t)m;
+    return (BUS_WRITE_IVAR(device_get_parent(dev), dev, ACPI_IVAR_MAGIC, up));
+}
+
+static __inline void *
+acpi_get_private(device_t dev)
+{
+    uintptr_t up;
+
+    if (BUS_READ_IVAR(device_get_parent(dev), dev, ACPI_IVAR_PRIVATE, &up))
+       return (NULL);
+    return ((void *)up);
+}
+
+static __inline int
+acpi_set_private(device_t dev, void *p)
+{
+    uintptr_t up;
+
+    up = (uintptr_t)p;
+    return (BUS_WRITE_IVAR(device_get_parent(dev), dev, ACPI_IVAR_PRIVATE, up));
+}
+
+static __inline ACPI_OBJECT_TYPE
+acpi_get_type(device_t dev)
+{
+    ACPI_HANDLE                h;
+    ACPI_OBJECT_TYPE   t;
+
+    if ((h = acpi_get_handle(dev)) == NULL)
+       return (ACPI_TYPE_NOT_FOUND);
+    if (AcpiGetType(h, &t) != AE_OK)
+       return (ACPI_TYPE_NOT_FOUND);
+    return (t);
+}
 
 #ifdef ACPI_DEBUGGER
 extern void            acpi_EnterDebugger(void);
@@ -182,11 +238,14 @@ extern BOOLEAN            acpi_BatteryIsPresent(device_t dev);
 extern BOOLEAN         acpi_MatchHid(device_t dev, char *hid);
 extern ACPI_STATUS     acpi_GetHandleInScope(ACPI_HANDLE parent, char *path,
                                              ACPI_HANDLE *result);
+extern uint32_t                acpi_TimerDelta(uint32_t end, uint32_t start);
 extern ACPI_BUFFER     *acpi_AllocBuffer(int size);
-extern ACPI_STATUS     acpi_EvaluateInteger(ACPI_HANDLE handle, char *path,
-                                            int *number);
 extern ACPI_STATUS     acpi_ConvertBufferToInteger(ACPI_BUFFER *bufp,
-                                                   int *number);
+                                                   UINT32 *number);
+extern ACPI_STATUS     acpi_GetInteger(ACPI_HANDLE handle, char *path,
+                                       UINT32 *number);
+extern ACPI_STATUS     acpi_SetInteger(ACPI_HANDLE handle, char *path,
+                                       UINT32 number);
 extern ACPI_STATUS     acpi_ForeachPackageObject(ACPI_OBJECT *obj, 
                                void (*func)(ACPI_OBJECT *comp, void *arg),
                                void *arg);
@@ -202,9 +261,11 @@ extern ACPI_STATUS acpi_Enable(struct acpi_softc *sc);
 extern ACPI_STATUS     acpi_Disable(struct acpi_softc *sc);
 extern void            acpi_UserNotify(const char *subsystem, ACPI_HANDLE h,
                                        uint8_t notify);
+struct resource *      acpi_bus_alloc_gas(device_t dev, int *rid,
+                                          ACPI_GENERIC_ADDRESS *gas);
 
 struct acpi_parse_resource_set {
-    void       (*set_init)(device_t dev, void **context);
+    void       (*set_init)(device_t dev, void *arg, void **context);
     void       (*set_done)(device_t dev, void *context);
     void       (*set_ioport)(device_t dev, void *context, u_int32_t base,
                              u_int32_t length);
@@ -227,7 +288,7 @@ struct acpi_parse_resource_set {
 
 extern struct acpi_parse_resource_set  acpi_res_parse_set;
 extern ACPI_STATUS     acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
-                           struct acpi_parse_resource_set *set);
+                           struct acpi_parse_resource_set *set, void *arg);
 
 /* ACPI event handling */
 extern UINT32  acpi_event_power_button_sleep(void *context);
@@ -304,6 +365,7 @@ int         acpi_PkgInt32(ACPI_OBJECT *res, int idx, uint32_t *dst);
 int            acpi_PkgStr(ACPI_OBJECT *res, int idx, void *dst, size_t size);
 int            acpi_PkgGas(device_t dev, ACPI_OBJECT *res, int idx, int *rid,
                            struct resource **dst);
+ACPI_HANDLE    acpi_GetReference(ACPI_HANDLE scope, ACPI_OBJECT *obj);
 
 #if __FreeBSD_version >= 500000
 #ifndef ACPI_MAX_THREADS
index 64274ba..89d568b 100644 (file)
@@ -1,5 +1,5 @@
-# $FreeBSD: src/sys/i386/acpica/Makefile,v 1.3.6.1 2003/08/22 20:49:21 jhb Exp $
-# $DragonFly: src/sys/i386/acpica5/Attic/Makefile,v 1.1 2004/02/21 06:48:05 dillon Exp $
+# $FreeBSD: src/sys/i386/acpica/Makefile,v 1.6 2004/04/13 13:43:11 des Exp $
+# $DragonFly: src/sys/i386/acpica5/Attic/Makefile,v 1.2 2004/06/27 08:52:45 dillon Exp $
 #
 
 # Correct path for kernel builds
@@ -11,7 +11,7 @@ DEPENDFILE=
 MAKESRCPATH= ${.CURDIR}
 CLEANFILES= acpi_wakecode.h acpi_wakecode.bin acpi_wakecode.o
 .endif
-CFLAGS+=       -I.
+CFLAGS+=       -I. -I@
 
 all: acpi_wakecode.h
 
index d2e8f6d..3b230d3 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/acpica/OsdEnvironment.c,v 1.9 2003/08/28 16:26:24 njl Exp $
- * $DragonFly: src/sys/i386/acpica5/Attic/OsdEnvironment.c,v 1.1 2004/02/21 06:48:05 dillon Exp $
+ * $FreeBSD: src/sys/i386/acpica/OsdEnvironment.c,v 1.10 2004/05/06 02:18:58 njl Exp $
+ * $DragonFly: src/sys/i386/acpica5/Attic/OsdEnvironment.c,v 1.2 2004/06/27 08:52:45 dillon Exp $
  */
 
 /*
@@ -37,9 +37,7 @@
 
 #include "acpi.h"
 
-#include <machine/pc/bios.h>
-
-u_long i386_acpi_root;
+static u_long i386_acpi_root;
 
 SYSCTL_ULONG(_machdep, OID_AUTO, acpi_root, CTLFLAG_RD, &i386_acpi_root, 0,
             "The physical address of the RSDP");
index 6b872f5..29e262c 100644 (file)
@@ -23,8 +23,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.15 2003/11/01 00:18:29 njl Exp $
- * $DragonFly: src/sys/i386/acpica5/Attic/acpi_machdep.c,v 1.3 2004/05/19 22:52:56 dillon Exp $
+ * $$FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.20 2004/05/05 19:51:15 njl Exp $
+ * $DragonFly: src/sys/i386/acpica5/Attic/acpi_machdep.c,v 1.4 2004/06/27 08:52:45 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -36,7 +36,6 @@
 #include <sys/uio.h>
 
 #include "acpi.h"
-
 #include <dev/acpica/acpivar.h>
 #include <dev/acpica/acpiio.h>
 
@@ -53,9 +52,10 @@ static device_t      acpi_dev;
 
 #include <i386/apm/apm.h>
 
-u_int32_t acpi_reset_video = 1;
+uint32_t acpi_reset_video = 1;
 TUNABLE_INT("hw.acpi.reset_video", &acpi_reset_video);
 
+static int intr_model = ACPI_INTR_PIC;
 static struct apm_softc        apm_softc;
 
 static d_open_t apmopen;
@@ -78,8 +78,6 @@ static struct cdevsw apm_cdevsw = {
        .old_poll = apmpoll
 };
 
-static int intr_model = ACPI_INTR_PIC;
-
 static int
 acpi_capm_convert_battstate(struct  acpi_battinfo *battp)
 {
@@ -100,11 +98,10 @@ acpi_capm_convert_battstate(struct  acpi_battinfo *battp)
 
        /* If still unknown, determine it based on the battery capacity. */
        if (state == 0xff) {
-               if (battp->cap >= 50) {
+               if (battp->cap >= 50)
                        state = 0;      /* high */
-               } else {
+               else
                        state = 1;      /* low */
-               }
        }
 
        return (state);
@@ -117,9 +114,9 @@ acpi_capm_convert_battflags(struct  acpi_battinfo *battp)
 
        flags = 0;
 
-       if (battp->cap >= 50) {
+       if (battp->cap >= 50)
                flags |= APM_BATT_HIGH;
-       else {
+       else {
                if (battp->state & ACPI_BATT_STAT_CRITICAL)
                        flags |= APM_BATT_CRITICAL;
                else
@@ -173,9 +170,8 @@ acpi_capm_get_pwstatus(apm_pwstatus_t app)
        struct  acpi_battinfo batt;
 
        if (app->ap_device != PMDV_ALLDEV &&
-           (app->ap_device < PMDV_BATT0 || app->ap_device > PMDV_BATT_ALL)) {
+           (app->ap_device < PMDV_BATT0 || app->ap_device > PMDV_BATT_ALL))
                return (1);
-       }
 
        if (app->ap_device == PMDV_ALLDEV)
                batt_unit = -1;                 /* all units */
@@ -218,8 +214,7 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td)
        struct apm_info info;
        apm_info_old_t aiop;
 
-       if ((acpi_sc = device_get_softc(acpi_dev)) == NULL)
-               return (ENXIO);
+       acpi_sc = device_get_softc(acpi_dev);
 
        switch (cmd) {
        case APMIO_SUSPEND:
@@ -313,8 +308,7 @@ acpi_machdep_init(device_t dev)
        struct  acpi_softc *sc;
 
        acpi_dev = dev;
-       if ((sc = device_get_softc(acpi_dev)) == NULL)
-               return (ENXIO);
+       sc = device_get_softc(acpi_dev);
 
        /*
         * XXX: Prevent the PnP BIOS code from interfering with
@@ -326,7 +320,10 @@ acpi_machdep_init(device_t dev)
 
        acpi_install_wakeup_handler(sc);
 
-       if (intr_model != ACPI_INTR_PIC)
+       if (intr_model == ACPI_INTR_PIC)
+               BUS_CONFIG_INTR(dev, AcpiGbl_FADT->SciInt, INTR_TRIGGER_LEVEL,
+                   INTR_POLARITY_LOW);
+       else
                acpi_SetIntrModel(intr_model);
 
        SYSCTL_ADD_UINT(&sc->acpi_sysctl_ctx,
index f55b25e..f793901 100644 (file)
@@ -23,8 +23,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/acpica/acpi_toshiba.c,v 1.3 2004/01/12 19:35:31 njl Exp $
- * $DragonFly: src/sys/i386/acpica5/Attic/acpi_toshiba.c,v 1.1 2004/02/21 06:48:05 dillon Exp $
+ * $FreeBSD: src/sys/i386/acpica/acpi_toshiba.c,v 1.7 2004/04/14 03:32:01 njl Exp $
+ * $DragonFly: src/sys/i386/acpica5/Attic/acpi_toshiba.c,v 1.2 2004/06/27 08:52:45 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -35,9 +35,6 @@
 #include "acpi.h"
 #include "acpivar.h"
 
-#define _COMPONENT      ACPI_TOSHIBA
-ACPI_MODULE_NAME("TOSHIBA")
-
 /*
  * Toshiba HCI interface definitions
  *
@@ -51,6 +48,7 @@ ACPI_MODULE_NAME("TOSHIBA")
 
 #define METHOD_HCI             "GHCI"
 #define METHOD_HCI_ENABLE      "ENAB"
+#define METHOD_VIDEO           "DSSX"
 
 /* Operations */
 #define HCI_SET                                0xFF00
@@ -122,6 +120,7 @@ ACPI_MODULE_NAME("TOSHIBA")
 struct acpi_toshiba_softc {
        device_t        dev;
        ACPI_HANDLE     handle;
+       ACPI_HANDLE     video_handle;
        struct          sysctl_ctx_list sysctl_ctx;
        struct          sysctl_oid *sysctl_tree;
 };
@@ -139,9 +138,12 @@ static hci_fn_t    hci_lcd_brightness;
 static hci_fn_t        hci_lcd_backlight;
 static hci_fn_t        hci_cpu_speed;
 static int     hci_call(ACPI_HANDLE h, int op, int function, UINT32 *arg);
-static void    hci_key_action(ACPI_HANDLE h, UINT32 key);
+static void    hci_key_action(struct acpi_toshiba_softc *sc, ACPI_HANDLE h,
+                   UINT32 key);
 static void    acpi_toshiba_notify(ACPI_HANDLE h, UINT32 notify,
-                                   void *context);
+                   void *context);
+static int     acpi_toshiba_video_probe(device_t dev);
+static int     acpi_toshiba_video_attach(device_t dev);
 
 /* Table of sysctl names and HCI functions to call. */
 static struct {
@@ -173,8 +175,26 @@ static driver_t acpi_toshiba_driver = {
 
 static devclass_t acpi_toshiba_devclass;
 DRIVER_MODULE(acpi_toshiba, acpi, acpi_toshiba_driver, acpi_toshiba_devclass,
-             0, 0);
-MODULE_DEPEND(acpi_toshiba, acpi, 100, 100, 100);
+    0, 0);
+MODULE_DEPEND(acpi_toshiba, acpi, 1, 1, 1);
+
+static device_method_t acpi_toshiba_video_methods[] = {
+       DEVMETHOD(device_probe,         acpi_toshiba_video_probe),
+       DEVMETHOD(device_attach,        acpi_toshiba_video_attach),
+
+       {0, 0}
+};
+
+static driver_t acpi_toshiba_video_driver = {
+       "acpi_toshiba_video",
+       acpi_toshiba_video_methods,
+       0,
+};
+
+static devclass_t acpi_toshiba_video_devclass;
+DRIVER_MODULE(acpi_toshiba_video, acpi, acpi_toshiba_video_driver,
+    acpi_toshiba_video_devclass, 0, 0);
+MODULE_DEPEND(acpi_toshiba_video, acpi, 1, 1, 1);
 
 static int     enable_fn_keys = 1;
 TUNABLE_INT("hw.acpi.toshiba.enable_fn_keys", &enable_fn_keys);
@@ -212,8 +232,6 @@ acpi_toshiba_attach(device_t dev)
        ACPI_STATUS     status;
        int             i;
 
-       ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
-
        sc = device_get_softc(dev);
        sc->dev = dev;
        sc->handle = acpi_get_handle(dev);
@@ -252,8 +270,6 @@ acpi_toshiba_detach(device_t dev)
 {
        struct          acpi_toshiba_softc *sc;
 
-       ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
-
        sc = device_get_softc(dev);
        if (enable_fn_keys != 0) {
                AcpiRemoveNotifyHandler(sc->handle, ACPI_DEVICE_NOTIFY,
@@ -312,15 +328,25 @@ static int
 hci_video_output(ACPI_HANDLE h, int op, UINT32 *video_output)
 {
        int             ret;
+       ACPI_STATUS     status;
 
        if (op == HCI_SET) {
                if (*video_output < 1 || *video_output > 7)
                        return (EINVAL);
+               if (h == NULL)
+                       return (ENXIO);
                *video_output |= HCI_VIDEO_OUTPUT_FLAG;
+               status = acpi_SetInteger(h, METHOD_VIDEO, *video_output);
+               if (ACPI_SUCCESS(status))
+                       ret = 0;
+               else
+                       ret = ENXIO;
+       } else {
+               ret = hci_call(h, op, HCI_REG_VIDEO_OUTPUT, video_output);
+               if (ret == 0)
+                       *video_output &= 0xff;
        }
-       ret = hci_call(h, op, HCI_REG_VIDEO_OUTPUT, video_output);
-       if (ret == 0 && op == HCI_GET)
-               *video_output &= 0xff;
+
        return (ret);
 }
 
@@ -425,7 +451,7 @@ end:
  * functionality by reading the keystrokes we send to devd(8).
  */
 static void
-hci_key_action(ACPI_HANDLE h, UINT32 key)
+hci_key_action(struct acpi_toshiba_softc *sc, ACPI_HANDLE h, UINT32 key)
 {
        UINT32          arg;
 
@@ -450,7 +476,7 @@ hci_key_action(ACPI_HANDLE h, UINT32 key)
                /* Cycle through video outputs. */
                hci_video_output(h, HCI_GET, &arg);
                arg = (arg + 1) % 7;
-               hci_video_output(h, HCI_SET, &arg);
+               hci_video_output(sc->video_handle, HCI_SET, &arg);
                break;
        case FN_F8_RELEASE:
                /* Toggle LCD backlight. */
@@ -477,10 +503,45 @@ acpi_toshiba_notify(ACPI_HANDLE h, UINT32 notify, void *context)
 
        if (notify == 0x80) {
                while (hci_call(h, HCI_GET, HCI_REG_SYSTEM_EVENT, &key) == 0) {
-                       hci_key_action(h, key);
+                       hci_key_action(sc, h, key);
                        acpi_UserNotify("TOSHIBA", h, (uint8_t)key);
                }
-       } else {
+       } else
                device_printf(sc->dev, "unknown notify: 0x%x\n", notify);
+}
+
+/*
+ * Toshiba video pseudo-device to provide the DSSX method.
+ *
+ * HID      Model
+ * -------------------------------------
+ * TOS6201  Libretto L Series
+ */
+static int
+acpi_toshiba_video_probe(device_t dev)
+{
+       int ret = ENXIO;
+
+       if (!acpi_disabled("toshiba") &&
+           acpi_get_type(dev) == ACPI_TYPE_DEVICE &&
+           device_get_unit(dev) == 0 &&
+            acpi_MatchHid(dev, "TOS6201")) {
+               device_quiet(dev);
+               device_set_desc(dev, "Toshiba Video");
+               ret = 0;
        }
+
+       return (ret);
+}
+
+static int
+acpi_toshiba_video_attach(device_t dev)
+{
+       struct          acpi_toshiba_softc *sc;
+
+       sc = devclass_get_softc(acpi_toshiba_devclass, 0);
+       if (sc == NULL)
+               return (ENXIO);
+       sc->video_handle = acpi_get_handle(dev);
+       return (0);
 }
index ff6a2c9..7cca465 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/acpica/acpi_wakeup.c,v 1.30 2003/11/03 22:18:57 jhb Exp $
- * $DragonFly: src/sys/i386/acpica5/Attic/acpi_wakeup.c,v 1.1 2004/02/21 06:48:05 dillon Exp $
+ * $DragonFly: src/sys/i386/acpica5/Attic/acpi_wakeup.c,v 1.2 2004/06/27 08:52:45 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -63,13 +63,13 @@ extern uint32_t     acpi_reset_video;
 extern void    initializecpu(void);
 
 static struct region_descriptor        r_idt, r_gdt, *p_gdt;
-static u_int16_t       r_ldt;
+static uint16_t                r_ldt;
 
-static u_int32_t       r_eax, r_ebx, r_ecx, r_edx, r_ebp, r_esi, r_edi,
+static uint32_t                r_eax, r_ebx, r_ecx, r_edx, r_ebp, r_esi, r_edi,
                        r_efl, r_cr0, r_cr2, r_cr3, r_cr4, ret_addr;
 
-static u_int16_t       r_cs, r_ds, r_es, r_fs, r_gs, r_ss, r_tr;
-static u_int32_t       r_esp = 0;
+static uint16_t                r_cs, r_ds, r_es, r_fs, r_gs, r_ss, r_tr;
+static uint32_t                r_esp = 0;
 
 static void            acpi_printcpu(void);
 static void            acpi_realmodeinst(void *arg, bus_dma_segment_t *segs,
@@ -80,7 +80,7 @@ static void           acpi_alloc_wakeup_handler(void);
 extern int             acpi_savecpu(void);
 extern int             acpi_restorecpu(void);
 
-#ifdef __GNUC__
+#if defined(__GNUC__) || defined(__INTEL_COMPILER)
 __asm__("                              \n\
        .text                           \n\
        .p2align 2, 0x90                \n\
@@ -147,7 +147,7 @@ acpi_savecpu:                               \n\
        movl    $1,%eax                 \n\
        ret                             \n\
 ");
-#endif /* __GNUC__ */
+#endif /* __GNUC__ || __INTEL_COMPILER */
 
 static void
 acpi_printcpu(void)
@@ -187,7 +187,7 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
        vm_page_t               page;
        static vm_page_t        opage = NULL;
        int                     ret = 0;
-       u_int32_t               cr3;
+       uint32_t                cr3;
        u_long                  ef;
        struct proc             *p;
 
@@ -227,28 +227,28 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
                p_gdt->rd_limit = r_gdt.rd_limit;
                p_gdt->rd_base = vtophys(r_gdt.rd_base);
 
-               WAKECODE_FIXUP(physical_esp, u_int32_t, vtophys(r_esp));
-               WAKECODE_FIXUP(previous_cr0, u_int32_t, r_cr0);
-               WAKECODE_FIXUP(previous_cr2, u_int32_t, r_cr2);
-               WAKECODE_FIXUP(previous_cr3, u_int32_t, r_cr3);
-               WAKECODE_FIXUP(previous_cr4, u_int32_t, r_cr4);
+               WAKECODE_FIXUP(physical_esp, uint32_t, vtophys(r_esp));
+               WAKECODE_FIXUP(previous_cr0, uint32_t, r_cr0);
+               WAKECODE_FIXUP(previous_cr2, uint32_t, r_cr2);
+               WAKECODE_FIXUP(previous_cr3, uint32_t, r_cr3);
+               WAKECODE_FIXUP(previous_cr4, uint32_t, r_cr4);
 
-               WAKECODE_FIXUP(reset_video, u_int32_t, acpi_reset_video);
+               WAKECODE_FIXUP(reset_video, uint32_t, acpi_reset_video);
 
-               WAKECODE_FIXUP(previous_tr,  u_int16_t, r_tr);
+               WAKECODE_FIXUP(previous_tr,  uint16_t, r_tr);
                WAKECODE_BCOPY(previous_gdt, struct region_descriptor, r_gdt);
-               WAKECODE_FIXUP(previous_ldt, u_int16_t, r_ldt);
+               WAKECODE_FIXUP(previous_ldt, uint16_t, r_ldt);
                WAKECODE_BCOPY(previous_idt, struct region_descriptor, r_idt);
 
                WAKECODE_FIXUP(where_to_recover, void, acpi_restorecpu);
 
-               WAKECODE_FIXUP(previous_ds,  u_int16_t, r_ds);
-               WAKECODE_FIXUP(previous_es,  u_int16_t, r_es);
-               WAKECODE_FIXUP(previous_fs,  u_int16_t, r_fs);
-               WAKECODE_FIXUP(previous_gs,  u_int16_t, r_gs);
-               WAKECODE_FIXUP(previous_ss,  u_int16_t, r_ss);
+               WAKECODE_FIXUP(previous_ds,  uint16_t, r_ds);
+               WAKECODE_FIXUP(previous_es,  uint16_t, r_es);
+               WAKECODE_FIXUP(previous_fs,  uint16_t, r_fs);
+               WAKECODE_FIXUP(previous_gs,  uint16_t, r_gs);
+               WAKECODE_FIXUP(previous_ss,  uint16_t, r_ss);
 
-               if (acpi_get_verbose(sc))
+               if (bootverbose)
                        acpi_printcpu();
 
                /* Call ACPICA to enter the desired sleep state */
@@ -273,7 +273,7 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
 #endif
                cpu_enable_intr();
 
-               if (acpi_get_verbose(sc)) {
+               if (bootverbose) {
                        acpi_savecpu();
                        acpi_printcpu();
                }
@@ -326,9 +326,9 @@ static void
 acpi_realmodeinst(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
 {
        struct acpi_softc       *sc = arg;
-       u_int32_t               *addr;
+       uint32_t                *addr;
 
-       addr = (u_int32_t *)&wakecode[wakeup_sw32 + 2];
+       addr = (uint32_t *)&wakecode[wakeup_sw32 + 2];
        *addr = segs[0].ds_addr + wakeup_32;
        bcopy(wakecode, (void *)sc->acpi_wakeaddr, sizeof(wakecode));
        sc->acpi_wakephys = segs[0].ds_addr;
index 82a73a1..f4954a0 100644 (file)
@@ -26,8 +26,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/acpica/madt.c,v 1.10 2004/01/26 19:34:24 jhb Exp $
- * $DragonFly: src/sys/i386/acpica5/Attic/madt.c,v 1.1 2004/02/21 06:48:05 dillon Exp $
+ * $FreeBSD: src/sys/i386/acpica/madt.c,v 1.15 2004/05/11 20:06:32 jhb Exp $
+ * $DragonFly: src/sys/i386/acpica5/Attic/madt.c,v 1.2 2004/06/27 08:52:45 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -51,6 +51,7 @@
 #include <machine/globaldata.h>
 
 #include "acpi.h"
+#include "actables.h"
 #include "acpivar.h"
 #include <bus/pci/pcivar.h>
 
@@ -76,14 +77,15 @@ struct lapic_info {
        u_int la_apic_id:8;
 } lapics[NLAPICS + 1];
 
+static int madt_found_sci_override;
 static MULTIPLE_APIC_TABLE *madt;
 static vm_paddr_t madt_physaddr;
 static vm_offset_t madt_length;
 
 MALLOC_DEFINE(M_MADT, "MADT Table", "ACPI MADT Table Items");
 
-static u_char  interrupt_polarity(UINT16 Polarity);
-static u_char  interrupt_trigger(UINT16 TriggerMode);
+static enum intr_polarity interrupt_polarity(UINT16 Polarity, UINT8 Source);
+static enum intr_trigger interrupt_trigger(UINT16 TriggerMode, UINT8 Source);
 static int     madt_find_cpu(u_int acpi_id, u_int *apic_id);
 static int     madt_find_interrupt(int intr, void **apic, u_int *pin);
 static void    *madt_map(vm_paddr_t pa, int offset, vm_offset_t length);
@@ -164,6 +166,7 @@ madt_map_table(vm_paddr_t pa, int offset, const char *sig)
 {
        ACPI_TABLE_HEADER *header;
        vm_offset_t length;
+       void *table;
 
        header = madt_map(pa, offset, sizeof(ACPI_TABLE_HEADER));
        if (strncmp(header->Signature, sig, 4) != 0) {
@@ -172,7 +175,14 @@ madt_map_table(vm_paddr_t pa, int offset, const char *sig)
        }
        length = header->Length;
        madt_unmap(header, sizeof(ACPI_TABLE_HEADER));
-       return (madt_map(pa, offset, length));
+       table = madt_map(pa, offset, length);
+       if (ACPI_FAILURE(AcpiTbVerifyTableChecksum(table))) {
+               if (bootverbose)
+                       printf("MADT: Failed checksum for table %s\n", sig);
+               madt_unmap(table, length);
+               return (NULL);
+       }
+       return (table);
 }
 
 static void
@@ -224,6 +234,16 @@ madt_probe(void)
         * Page 0 is used to map in the headers of candidate ACPI tables.
         */
        if (rsdp->Revision >= 2) {
+               /*
+                * AcpiOsGetRootPointer only verifies the checksum for
+                * the version 1.0 portion of the RSDP.  Version 2.0 has
+                * an additional checksum that we verify first.
+                */
+               if (AcpiTbChecksum(rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0) {
+                       if (bootverbose)
+                               printf("MADT: RSDP failed extended checksum\n");
+                       return (ENXIO);
+               }
                xsdt = madt_map_table(rsdp->XsdtPhysicalAddress, 1, XSDT_SIG);
                if (xsdt == NULL) {
                        if (bootverbose)
@@ -260,6 +280,16 @@ madt_probe(void)
                printf("MADT: Found table at 0x%jx\n",
                    (uintmax_t)madt_physaddr);
 
+       /*
+        * Verify that we can map the full table and that its checksum is
+        * correct, etc.
+        */
+       madt = madt_map_table(madt_physaddr, 0, APIC_SIG);
+       if (madt == NULL)
+               return (ENXIO);
+       madt_unmap_table(madt);
+       madt = NULL;
+
        return (0);
 }
 
@@ -282,7 +312,6 @@ madt_probe_table(vm_paddr_t address)
                printf("Table '%.4s' at 0x%jx\n", table->Signature,
                    (uintmax_t)address);
 
-       /* XXX: Verify checksum? */
        if (strncmp(table->Signature, APIC_SIG, 4) != 0) {
                madt_unmap(table, sizeof(ACPI_TABLE_HEADER));
                return (0);
@@ -334,6 +363,8 @@ madt_setup_local(void)
 static int
 madt_setup_io(void)
 {
+       void *ioapic;
+       u_int pin;
        int i;
 
        /* Try to initialize ACPI so that we can access the FADT. */
@@ -346,11 +377,30 @@ madt_setup_io(void)
        }
                    
        /* First, we run through adding I/O APIC's. */
+       if (madt->PCATCompat)
+               ioapic_enable_mixed_mode();
        madt_walk_table(madt_parse_apics, NULL);
 
        /* Second, we run through the table tweaking interrupt sources. */
        madt_walk_table(madt_parse_ints, NULL);
 
+       /*
+        * If there was not an explicit override entry for the SCI,
+        * force it to use level trigger and active-low polarity.
+        */
+       if (!madt_found_sci_override) {
+               if (madt_find_interrupt(AcpiGbl_FADT->SciInt, &ioapic, &pin)
+                   != 0)
+                       printf("MADT: Could not find APIC for SCI IRQ %d\n",
+                           AcpiGbl_FADT->SciInt);
+               else {
+                       printf(
+       "MADT: Forcing active-low polarity and level trigger for SCI\n");
+                       ioapic_set_polarity(ioapic, pin, INTR_POLARITY_LOW);
+                       ioapic_set_triggermode(ioapic, pin, INTR_TRIGGER_LEVEL);
+               }
+       }
+
        /* Third, we register all the I/O APIC's. */
        for (i = 0; i < NIOAPICS; i++)
                if (ioapics[i].io_apic != NULL)
@@ -454,35 +504,44 @@ madt_parse_apics(APIC_HEADER *entry, void *arg __unused)
 }
 
 /*
- * Determine properties of an interrupt source.  Note that for ACPI,
- * these are only used for ISA interrupts, so we assume ISA bus values
- * (Active Hi, Edge Triggered) for conforming values.
+ * Determine properties of an interrupt source.  Note that for ACPI these
+ * functions are only used for ISA interrupts, so we assume ISA bus values
+ * (Active Hi, Edge Triggered) for conforming values except for the ACPI
+ * SCI for which we use Active Lo, Level Triggered.
  */
-static u_char
-interrupt_polarity(UINT16 Polarity)
+static enum intr_polarity
+interrupt_polarity(UINT16 Polarity, UINT8 Source)
 {
 
        switch (Polarity) {
        case POLARITY_CONFORMS:
+               if (Source == AcpiGbl_FADT->SciInt)
+                       return (INTR_POLARITY_LOW);
+               else
+                       return (INTR_POLARITY_HIGH);
        case POLARITY_ACTIVE_HIGH:
-               return (1);
+               return (INTR_POLARITY_HIGH);
        case POLARITY_ACTIVE_LOW:
-               return (0);
+               return (INTR_POLARITY_LOW);
        default:
                panic("Bogus Interrupt Polarity");
        }
 }
 
-static u_char
-interrupt_trigger(UINT16 TriggerMode)
+static enum intr_trigger
+interrupt_trigger(UINT16 TriggerMode, UINT8 Source)
 {
 
        switch (TriggerMode) {
        case TRIGGER_CONFORMS:
+               if (Source == AcpiGbl_FADT->SciInt)
+                       return (INTR_TRIGGER_LEVEL);
+               else
+                       return (INTR_TRIGGER_EDGE);
        case TRIGGER_EDGE:
-               return (1);
+               return (INTR_TRIGGER_EDGE);
        case TRIGGER_LEVEL:
-               return (0);
+               return (INTR_TRIGGER_LEVEL);
        default:
                panic("Bogus Interrupt Trigger Mode");
        }
@@ -540,7 +599,9 @@ madt_parse_interrupt_override(MADT_INTERRUPT_OVERRIDE *intr)
 {
        void *new_ioapic, *old_ioapic;
        u_int new_pin, old_pin;
-       int force_lo;
+       enum intr_trigger trig;
+       enum intr_polarity pol;
+       char buf[64];
 
        if (bootverbose)
                printf("MADT: intr override: source %u, irq %u\n",
@@ -554,18 +615,46 @@ madt_parse_interrupt_override(MADT_INTERRUPT_OVERRIDE *intr)
        }
 
        /*
-        * If the SCI is remapped to a non-ISA global interrupt,
-        * force it to level trigger and active-lo polarity.
+        * Lookup the appropriate trigger and polarity modes for this
+        * entry.
+        */
+       trig = interrupt_trigger(intr->TriggerMode, intr->Source);
+       pol = interrupt_polarity(intr->Polarity, intr->Source);
+
+       /*
         * If the SCI is identity mapped but has edge trigger and
-        * active-hi polarity, also force it to use level/lo. 
+        * active-hi polarity or the force_sci_lo tunable is set,
+        * force it to use level/lo.
         */
-       force_lo = 0;
-       if (intr->Source == AcpiGbl_FADT->SciInt)
-               if (intr->Interrupt > 15 || (intr->Interrupt == intr->Source &&
-                   intr->TriggerMode == TRIGGER_EDGE &&
-                   intr->Polarity == POLARITY_ACTIVE_HIGH))
-                       force_lo = 1;
+       if (intr->Source == AcpiGbl_FADT->SciInt) {
+               madt_found_sci_override = 1;
+               if (getenv_string("hw.acpi.sci.trigger", buf, sizeof(buf))) {
+                       if (tolower(buf[0]) == 'e')
+                               trig = INTR_TRIGGER_EDGE;
+                       else if (tolower(buf[0]) == 'l')
+                               trig = INTR_TRIGGER_LEVEL;
+                       else
+                               panic(
+                               "Invalid trigger %s: must be 'edge' or 'level'",
+                                   buf);
+                       printf("MADT: Forcing SCI to %s trigger\n",
+                           trig == INTR_TRIGGER_EDGE ? "edge" : "level");
+               }
+               if (getenv_string("hw.acpi.sci.polarity", buf, sizeof(buf))) {
+                       if (tolower(buf[0]) == 'h')
+                               pol = INTR_POLARITY_HIGH;
+                       else if (tolower(buf[0]) == 'l')
+                               pol = INTR_POLARITY_LOW;
+                       else
+                               panic(
+                               "Invalid polarity %s: must be 'high' or 'low'",
+                                   buf);
+                       printf("MADT: Forcing SCI to active %s polarity\n",
+                           pol == INTR_POLARITY_HIGH ? "high" : "low");
+               }
+       }
 
+       /* Remap the IRQ if it is mapped to a different interrupt vector. */
        if (intr->Source != intr->Interrupt) {
                /*
                 * If the SCI is remapped to a non-ISA global interrupt,
@@ -585,18 +674,10 @@ madt_parse_interrupt_override(MADT_INTERRUPT_OVERRIDE *intr)
                    intr->Source)
                        ioapic_disable_pin(old_ioapic, old_pin);
        }
-       if (force_lo) {
-               printf(
-       "MADT: Forcing active-lo polarity and level trigger for IRQ %d\n",
-                   intr->Source);
-               ioapic_set_polarity(new_ioapic, new_pin, 0);
-               ioapic_set_triggermode(new_ioapic, new_pin, 0);
-       } else {
-               ioapic_set_polarity(new_ioapic, new_pin,
-                   interrupt_polarity(intr->Polarity));
-               ioapic_set_triggermode(new_ioapic, new_pin,
-                   interrupt_trigger(intr->TriggerMode));
-       }
+
+       /* Program the polarity and trigger mode. */
+       ioapic_set_triggermode(new_ioapic, new_pin, trig);
+       ioapic_set_polarity(new_ioapic, new_pin, pol);
 }
 
 /*
@@ -617,10 +698,10 @@ madt_parse_nmi(MADT_NMI_SOURCE *nmi)
        ioapic_set_nmi(ioapic, pin);
        if (nmi->TriggerMode != TRIGGER_CONFORMS)
                ioapic_set_triggermode(ioapic, pin,
-                   interrupt_trigger(nmi->TriggerMode));
+                   interrupt_trigger(nmi->TriggerMode, 0));
        if (nmi->Polarity != TRIGGER_CONFORMS)
                ioapic_set_polarity(ioapic, pin,
-                   interrupt_polarity(nmi->Polarity));
+                   interrupt_polarity(nmi->Polarity, 0));
 }
 
 /*
@@ -646,10 +727,10 @@ madt_parse_local_nmi(MADT_LOCAL_APIC_NMI *nmi)
        lapic_set_lvt_mode(apic_id, pin, APIC_LVT_DM_NMI);
        if (nmi->TriggerMode != TRIGGER_CONFORMS)
                lapic_set_lvt_triggermode(apic_id, pin,
-                   interrupt_trigger(nmi->TriggerMode));
+                   interrupt_trigger(nmi->TriggerMode, 0));
        if (nmi->Polarity != POLARITY_CONFORMS)
                lapic_set_lvt_polarity(apic_id, pin,
-                   interrupt_polarity(nmi->Polarity));
+                   interrupt_polarity(nmi->Polarity, 0));
 }
 
 /*
index 4263451..c5d4a45 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/include/apicvar.h,v 1.5 2003/11/14 22:21:30 peter Exp $
- * $DragonFly: src/sys/i386/apic/Attic/apicvar.h,v 1.1 2004/02/21 06:37:07 dillon Exp $
+ * $DragonFly: src/sys/i386/apic/Attic/apicvar.h,v 1.2 2004/06/27 08:52:46 dillon Exp $
  */
 
 #ifndef _MACHINE_APICVAR_H_
@@ -127,6 +127,7 @@ u_int       apic_idt_to_irq(u_int vector);
 void   apic_register_enumerator(struct apic_enumerator *enumerator);
 void   *ioapic_create(uintptr_t addr, int32_t id, int intbase);
 int    ioapic_disable_pin(void *cookie, u_int pin);
+void   ioapic_enable_mixed_mode(void);
 int    ioapic_get_vector(void *cookie, u_int pin);
 int    ioapic_next_logical_cluster(void);
 void   ioapic_register(void *cookie);
index ffcdede..baec18a 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)machdep.c     7.4 (Berkeley) 6/3/91
  * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.385.2.30 2003/05/31 08:48:05 alc Exp $
- * $DragonFly: src/sys/i386/i386/Attic/machdep.c,v 1.59 2004/06/26 02:12:08 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/machdep.c,v 1.60 2004/06/27 08:52:36 dillon Exp $
  */
 
 #include "use_apm.h"
@@ -875,6 +875,19 @@ SYSCTL_INT(_machdep, OID_AUTO, cpu_idle_hltcnt, CTLFLAG_RW,
 SYSCTL_INT(_machdep, OID_AUTO, cpu_idle_spincnt, CTLFLAG_RW,
     &cpu_idle_spincnt, 0, "Idle loop entry spins");
 
+static void
+cpu_idle_default_hook(void)
+{
+       /*
+        * We must guarentee that hlt is exactly the instruction
+        * following the sti.
+        */
+       __asm __volatile("sti; hlt");
+}
+
+/* Other subsystems (e.g., ACPI) can hook this later. */
+void (*cpu_idle_hook)(void) = cpu_idle_default_hook;
+
 void
 cpu_idle(void)
 {
@@ -895,13 +908,9 @@ cpu_idle(void)
                 */
                if (cpu_idle_hlt && !lwkt_runnable() &&
                    (td->td_flags & TDF_IDLE_NOHLT) == 0) {
-                       /*
-                        * We must guarentee that hlt is exactly the instruction
-                        * following the sti.
-                        */
                        __asm __volatile("cli");
                        splz();
-                       __asm __volatile("sti; hlt");
+                       cpu_idle_hook();
                        ++cpu_idle_hltcnt;
                } else {
                        td->td_flags &= ~TDF_IDLE_NOHLT;
@@ -2496,6 +2505,107 @@ Debugger(const char *msg)
 }
 #endif /* no DDB */
 
+#ifndef APIC_IO
+#include <machine/apicvar.h>
+
+/*
+ * Provide stub functions so that the MADT APIC enumerator in the acpi
+ * kernel module will link against a kernel without 'option APIC_IO'.
+ *
+ * XXX - This is a gross hack.
+ */
+void
+apic_register_enumerator(struct apic_enumerator *enumerator)
+{
+}
+
+void *
+ioapic_create(uintptr_t addr, int32_t id, int intbase)
+{
+       return (NULL);
+}
+
+int
+ioapic_disable_pin(void *cookie, u_int pin)
+{
+       return (ENXIO);
+}
+
+void
+ioapic_enable_mixed_mode(void)
+{
+}
+
+int
+ioapic_get_vector(void *cookie, u_int pin)
+{
+       return (-1);
+}
+
+void
+ioapic_register(void *cookie)
+{
+}
+
+int
+ioapic_remap_vector(void *cookie, u_int pin, int vector)
+{
+       return (ENXIO);
+}
+
+int
+ioapic_set_extint(void *cookie, u_int pin)
+{
+       return (ENXIO);
+}
+
+int
+ioapic_set_nmi(void *cookie, u_int pin)
+{
+       return (ENXIO);
+}
+
+int
+ioapic_set_polarity(void *cookie, u_int pin, char activehi)
+{
+       return (ENXIO);
+}
+
+int
+ioapic_set_triggermode(void *cookie, u_int pin, char edgetrigger)
+{
+       return (ENXIO);
+}
+
+void
+lapic_create(u_int apic_id, int boot_cpu)
+{
+}
+
+void
+lapic_init(uintptr_t addr)
+{
+}
+
+int
+lapic_set_lvt_mode(u_int apic_id, u_int lvt, u_int32_t mode)
+{
+       return (ENXIO);
+}
+
+int
+lapic_set_lvt_polarity(u_int apic_id, u_int lvt, u_char activehi)
+{
+       return (ENXIO);
+}
+
+int
+lapic_set_lvt_triggermode(u_int apic_id, u_int lvt, u_char edgetrigger)
+{
+       return (ENXIO);
+}
+#endif
+
 #include <sys/disklabel.h>
 
 /*
index 054416e..0e41155 100644 (file)
@@ -23,8 +23,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/include/acpica_machdep.h,v 1.4.2.1 2003/08/22 20:49:21 jhb Exp $
- * $DragonFly: src/sys/i386/include/Attic/acpica_machdep.h,v 1.1 2003/09/24 03:51:59 drhodus Exp $
+ * $FreeBSD: src/sys/i386/include/acpica_machdep.h,v 1.5 2003/09/10 01:14:42 jhb Exp $
+ * $DragonFly: src/sys/i386/include/Attic/acpica_machdep.h,v 1.2 2004/06/27 08:52:46 dillon Exp $
  */
 
 /******************************************************************************
 #define COMPILER_DEPENDENT_UINT64      unsigned long long
 #define ACPI_USE_NATIVE_DIVIDE
 
+void    acpi_SetDefaultIntrModel(int model);
+
 #endif /* __ACPICA_MACHDEP_H__ */
index 231b85b..ca550fd 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/include/apicvar.h,v 1.5 2003/11/14 22:21:30 peter Exp $
- * $DragonFly: src/sys/i386/include/Attic/apicvar.h,v 1.1 2004/02/21 06:37:07 dillon Exp $
+ * $DragonFly: src/sys/i386/include/Attic/apicvar.h,v 1.2 2004/06/27 08:52:46 dillon Exp $
  */
 
 #ifndef _MACHINE_APICVAR_H_
@@ -127,6 +127,7 @@ u_int       apic_idt_to_irq(u_int vector);
 void   apic_register_enumerator(struct apic_enumerator *enumerator);
 void   *ioapic_create(uintptr_t addr, int32_t id, int intbase);
 int    ioapic_disable_pin(void *cookie, u_int pin);
+void   ioapic_enable_mixed_mode(void);
 int    ioapic_get_vector(void *cookie, u_int pin);
 int    ioapic_next_logical_cluster(void);
 void   ioapic_register(void *cookie);
index cdef5e1..5a4f5c6 100644 (file)
@@ -1,5 +1,5 @@
-# $FreeBSD: src/sys/i386/acpica/Makefile,v 1.3.6.1 2003/08/22 20:49:21 jhb Exp $
-# $DragonFly: src/sys/platform/pc32/acpica5/Makefile,v 1.1 2004/02/21 06:48:05 dillon Exp $
+# $FreeBSD: src/sys/i386/acpica/Makefile,v 1.6 2004/04/13 13:43:11 des Exp $
+# $DragonFly: src/sys/platform/pc32/acpica5/Makefile,v 1.2 2004/06/27 08:52:45 dillon Exp $
 #
 
 # Correct path for kernel builds
@@ -11,7 +11,7 @@ DEPENDFILE=
 MAKESRCPATH= ${.CURDIR}
 CLEANFILES= acpi_wakecode.h acpi_wakecode.bin acpi_wakecode.o
 .endif
-CFLAGS+=       -I.
+CFLAGS+=       -I. -I@
 
 all: acpi_wakecode.h
 
index ef912e3..73e26bb 100644 (file)
@@ -24,8 +24,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/acpica/OsdEnvironment.c,v 1.9 2003/08/28 16:26:24 njl Exp $
- * $DragonFly: src/sys/platform/pc32/acpica5/OsdEnvironment.c,v 1.1 2004/02/21 06:48:05 dillon Exp $
+ * $FreeBSD: src/sys/i386/acpica/OsdEnvironment.c,v 1.10 2004/05/06 02:18:58 njl Exp $
+ * $DragonFly: src/sys/platform/pc32/acpica5/OsdEnvironment.c,v 1.2 2004/06/27 08:52:45 dillon Exp $
  */
 
 /*
@@ -37,9 +37,7 @@
 
 #include "acpi.h"
 
-#include <machine/pc/bios.h>
-
-u_long i386_acpi_root;
+static u_long i386_acpi_root;
 
 SYSCTL_ULONG(_machdep, OID_AUTO, acpi_root, CTLFLAG_RD, &i386_acpi_root, 0,
             "The physical address of the RSDP");
index 42c7ed6..844492d 100644 (file)
@@ -23,8 +23,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.15 2003/11/01 00:18:29 njl Exp $
- * $DragonFly: src/sys/platform/pc32/acpica5/acpi_machdep.c,v 1.3 2004/05/19 22:52:56 dillon Exp $
+ * $$FreeBSD: src/sys/i386/acpica/acpi_machdep.c,v 1.20 2004/05/05 19:51:15 njl Exp $
+ * $DragonFly: src/sys/platform/pc32/acpica5/acpi_machdep.c,v 1.4 2004/06/27 08:52:45 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -36,7 +36,6 @@
 #include <sys/uio.h>
 
 #include "acpi.h"
-
 #include <dev/acpica/acpivar.h>
 #include <dev/acpica/acpiio.h>
 
@@ -53,9 +52,10 @@ static device_t      acpi_dev;
 
 #include <i386/apm/apm.h>
 
-u_int32_t acpi_reset_video = 1;
+uint32_t acpi_reset_video = 1;
 TUNABLE_INT("hw.acpi.reset_video", &acpi_reset_video);
 
+static int intr_model = ACPI_INTR_PIC;
 static struct apm_softc        apm_softc;
 
 static d_open_t apmopen;
@@ -78,8 +78,6 @@ static struct cdevsw apm_cdevsw = {
        .old_poll = apmpoll
 };
 
-static int intr_model = ACPI_INTR_PIC;
-
 static int
 acpi_capm_convert_battstate(struct  acpi_battinfo *battp)
 {
@@ -100,11 +98,10 @@ acpi_capm_convert_battstate(struct  acpi_battinfo *battp)
 
        /* If still unknown, determine it based on the battery capacity. */
        if (state == 0xff) {
-               if (battp->cap >= 50) {
+               if (battp->cap >= 50)
                        state = 0;      /* high */
-               } else {
+               else
                        state = 1;      /* low */
-               }
        }
 
        return (state);
@@ -117,9 +114,9 @@ acpi_capm_convert_battflags(struct  acpi_battinfo *battp)
 
        flags = 0;
 
-       if (battp->cap >= 50) {
+       if (battp->cap >= 50)
                flags |= APM_BATT_HIGH;
-       else {
+       else {
                if (battp->state & ACPI_BATT_STAT_CRITICAL)
                        flags |= APM_BATT_CRITICAL;
                else
@@ -173,9 +170,8 @@ acpi_capm_get_pwstatus(apm_pwstatus_t app)
        struct  acpi_battinfo batt;
 
        if (app->ap_device != PMDV_ALLDEV &&
-           (app->ap_device < PMDV_BATT0 || app->ap_device > PMDV_BATT_ALL)) {
+           (app->ap_device < PMDV_BATT0 || app->ap_device > PMDV_BATT_ALL))
                return (1);
-       }
 
        if (app->ap_device == PMDV_ALLDEV)
                batt_unit = -1;                 /* all units */
@@ -218,8 +214,7 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, d_thread_t *td)
        struct apm_info info;
        apm_info_old_t aiop;
 
-       if ((acpi_sc = device_get_softc(acpi_dev)) == NULL)
-               return (ENXIO);
+       acpi_sc = device_get_softc(acpi_dev);
 
        switch (cmd) {
        case APMIO_SUSPEND:
@@ -313,8 +308,7 @@ acpi_machdep_init(device_t dev)
        struct  acpi_softc *sc;
 
        acpi_dev = dev;
-       if ((sc = device_get_softc(acpi_dev)) == NULL)
-               return (ENXIO);
+       sc = device_get_softc(acpi_dev);
 
        /*
         * XXX: Prevent the PnP BIOS code from interfering with
@@ -326,7 +320,10 @@ acpi_machdep_init(device_t dev)
 
        acpi_install_wakeup_handler(sc);
 
-       if (intr_model != ACPI_INTR_PIC)
+       if (intr_model == ACPI_INTR_PIC)
+               BUS_CONFIG_INTR(dev, AcpiGbl_FADT->SciInt, INTR_TRIGGER_LEVEL,
+                   INTR_POLARITY_LOW);
+       else
                acpi_SetIntrModel(intr_model);
 
        SYSCTL_ADD_UINT(&sc->acpi_sysctl_ctx,
index 6e8adaa..453a764 100644 (file)
@@ -23,8 +23,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/acpica/acpi_toshiba.c,v 1.3 2004/01/12 19:35:31 njl Exp $
- * $DragonFly: src/sys/platform/pc32/acpica5/Attic/acpi_toshiba.c,v 1.1 2004/02/21 06:48:05 dillon Exp $
+ * $FreeBSD: src/sys/i386/acpica/acpi_toshiba.c,v 1.7 2004/04/14 03:32:01 njl Exp $
+ * $DragonFly: src/sys/platform/pc32/acpica5/Attic/acpi_toshiba.c,v 1.2 2004/06/27 08:52:45 dillon Exp $
  */
 
 #include "opt_acpi.h"
@@ -35,9 +35,6 @@
 #include "acpi.h"
 #include "acpivar.h"
 
-#define _COMPONENT      ACPI_TOSHIBA
-ACPI_MODULE_NAME("TOSHIBA")
-
 /*
  * Toshiba HCI interface definitions
  *
@@ -51,6 +48,7 @@ ACPI_MODULE_NAME("TOSHIBA")
 
 #define METHOD_HCI             "GHCI"
 #define METHOD_HCI_ENABLE      "ENAB"
+#define METHOD_VIDEO           "DSSX"
 
 /* Operations */
 #define HCI_SET                                0xFF00
@@ -122,6 +120,7 @@ ACPI_MODULE_NAME("TOSHIBA")
 struct acpi_toshiba_softc {
        device_t        dev;
        ACPI_HANDLE     handle;
+       ACPI_HANDLE     video_handle;
        struct          sysctl_ctx_list sysctl_ctx;
        struct          sysctl_oid *sysctl_tree;
 };
@@ -139,9 +138,12 @@ static hci_fn_t    hci_lcd_brightness;
 static hci_fn_t        hci_lcd_backlight;
 static hci_fn_t        hci_cpu_speed;
 static int     hci_call(ACPI_HANDLE h, int op, int function, UINT32 *arg);
-static void    hci_key_action(ACPI_HANDLE h, UINT32 key);
+static void    hci_key_action(struct acpi_toshiba_softc *sc, ACPI_HANDLE h,
+                   UINT32 key);
 static void    acpi_toshiba_notify(ACPI_HANDLE h, UINT32 notify,
-                                   void *context);
+                   void *context);
+static int     acpi_toshiba_video_probe(device_t dev);
+static int     acpi_toshiba_video_attach(device_t dev);
 
 /* Table of sysctl names and HCI functions to call. */
 static struct {
@@ -173,8 +175,26 @@ static driver_t acpi_toshiba_driver = {
 
 static devclass_t acpi_toshiba_devclass;
 DRIVER_MODULE(acpi_toshiba, acpi, acpi_toshiba_driver, acpi_toshiba_devclass,
-             0, 0);
-MODULE_DEPEND(acpi_toshiba, acpi, 100, 100, 100);
+    0, 0);
+MODULE_DEPEND(acpi_toshiba, acpi, 1, 1, 1);
+
+static device_method_t acpi_toshiba_video_methods[] = {
+       DEVMETHOD(device_probe,         acpi_toshiba_video_probe),
+       DEVMETHOD(device_attach,        acpi_toshiba_video_attach),
+
+       {0, 0}
+};
+
+static driver_t acpi_toshiba_video_driver = {
+       "acpi_toshiba_video",
+       acpi_toshiba_video_methods,
+       0,
+};
+
+static devclass_t acpi_toshiba_video_devclass;
+DRIVER_MODULE(acpi_toshiba_video, acpi, acpi_toshiba_video_driver,
+    acpi_toshiba_video_devclass, 0, 0);
+MODULE_DEPEND(acpi_toshiba_video, acpi, 1, 1, 1);
 
 static int     enable_fn_keys = 1;
 TUNABLE_INT("hw.acpi.toshiba.enable_fn_keys", &enable_fn_keys);
@@ -212,8 +232,6 @@ acpi_toshiba_attach(device_t dev)
        ACPI_STATUS     status;
        int             i;
 
-       ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
-
        sc = device_get_softc(dev);
        sc->dev = dev;
        sc->handle = acpi_get_handle(dev);
@@ -252,8 +270,6 @@ acpi_toshiba_detach(device_t dev)
 {
        struct          acpi_toshiba_softc *sc;
 
-       ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
-
        sc = device_get_softc(dev);
        if (enable_fn_keys != 0) {
                AcpiRemoveNotifyHandler(sc->handle, ACPI_DEVICE_NOTIFY,
@@ -312,15 +328,25 @@ static int
 hci_video_output(ACPI_HANDLE h, int op, UINT32 *video_output)
 {
        int             ret;
+       ACPI_STATUS     status;
 
        if (op == HCI_SET) {
                if (*video_output < 1 || *video_output > 7)
                        return (EINVAL);
+               if (h == NULL)
+                       return (ENXIO);
                *video_output |= HCI_VIDEO_OUTPUT_FLAG;
+               status = acpi_SetInteger(h, METHOD_VIDEO, *video_output);
+               if (ACPI_SUCCESS(status))
+                       ret = 0;
+               else
+                       ret = ENXIO;
+       } else {
+               ret = hci_call(h, op, HCI_REG_VIDEO_OUTPUT, video_output);
+               if (ret == 0)
+                       *video_output &= 0xff;
        }
-       ret = hci_call(h, op, HCI_REG_VIDEO_OUTPUT, video_output);
-       if (ret == 0 && op == HCI_GET)
-               *video_output &= 0xff;
+
        return (ret);
 }
 
@@ -425,7 +451,7 @@ end:
  * functionality by reading the keystrokes we send to devd(8).
  */
 static void
-hci_key_action(ACPI_HANDLE h, UINT32 key)
+hci_key_action(struct acpi_toshiba_softc *sc, ACPI_HANDLE h, UINT32 key)
 {
        UINT32          arg;
 
@@ -450,7 +476,7 @@ hci_key_action(ACPI_HANDLE h, UINT32 key)
                /* Cycle through video outputs. */
                hci_video_output(h, HCI_GET, &arg);
                arg = (arg + 1) % 7;
-               hci_video_output(h, HCI_SET, &arg);
+               hci_video_output(sc->video_handle, HCI_SET, &arg);
                break;
        case FN_F8_RELEASE:
                /* Toggle LCD backlight. */
@@ -477,10 +503,45 @@ acpi_toshiba_notify(ACPI_HANDLE h, UINT32 notify, void *context)
 
        if (notify == 0x80) {
                while (hci_call(h, HCI_GET, HCI_REG_SYSTEM_EVENT, &key) == 0) {
-                       hci_key_action(h, key);
+                       hci_key_action(sc, h, key);
                        acpi_UserNotify("TOSHIBA", h, (uint8_t)key);
                }
-       } else {
+       } else
                device_printf(sc->dev, "unknown notify: 0x%x\n", notify);
+}
+
+/*
+ * Toshiba video pseudo-device to provide the DSSX method.
+ *
+ * HID      Model
+ * -------------------------------------
+ * TOS6201  Libretto L Series
+ */
+static int
+acpi_toshiba_video_probe(device_t dev)
+{
+       int ret = ENXIO;
+
+       if (!acpi_disabled("toshiba") &&
+           acpi_get_type(dev) == ACPI_TYPE_DEVICE &&
+           device_get_unit(dev) == 0 &&
+            acpi_MatchHid(dev, "TOS6201")) {
+               device_quiet(dev);
+               device_set_desc(dev, "Toshiba Video");
+               ret = 0;
        }
+
+       return (ret);
+}
+
+static int
+acpi_toshiba_video_attach(device_t dev)
+{
+       struct          acpi_toshiba_softc *sc;
+
+       sc = devclass_get_softc(acpi_toshiba_devclass, 0);
+       if (sc == NULL)
+               return (ENXIO);
+       sc->video_handle = acpi_get_handle(dev);
+       return (0);
 }
index fda9382..2cf690d 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/acpica/acpi_wakeup.c,v 1.30 2003/11/03 22:18:57 jhb Exp $
- * $DragonFly: src/sys/platform/pc32/acpica5/acpi_wakeup.c,v 1.1 2004/02/21 06:48:05 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/acpica5/acpi_wakeup.c,v 1.2 2004/06/27 08:52:45 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -63,13 +63,13 @@ extern uint32_t     acpi_reset_video;
 extern void    initializecpu(void);
 
 static struct region_descriptor        r_idt, r_gdt, *p_gdt;
-static u_int16_t       r_ldt;
+static uint16_t                r_ldt;
 
-static u_int32_t       r_eax, r_ebx, r_ecx, r_edx, r_ebp, r_esi, r_edi,
+static uint32_t                r_eax, r_ebx, r_ecx, r_edx, r_ebp, r_esi, r_edi,
                        r_efl, r_cr0, r_cr2, r_cr3, r_cr4, ret_addr;
 
-static u_int16_t       r_cs, r_ds, r_es, r_fs, r_gs, r_ss, r_tr;
-static u_int32_t       r_esp = 0;
+static uint16_t                r_cs, r_ds, r_es, r_fs, r_gs, r_ss, r_tr;
+static uint32_t                r_esp = 0;
 
 static void            acpi_printcpu(void);
 static void            acpi_realmodeinst(void *arg, bus_dma_segment_t *segs,
@@ -80,7 +80,7 @@ static void           acpi_alloc_wakeup_handler(void);
 extern int             acpi_savecpu(void);
 extern int             acpi_restorecpu(void);
 
-#ifdef __GNUC__
+#if defined(__GNUC__) || defined(__INTEL_COMPILER)
 __asm__("                              \n\
        .text                           \n\
        .p2align 2, 0x90                \n\
@@ -147,7 +147,7 @@ acpi_savecpu:                               \n\
        movl    $1,%eax                 \n\
        ret                             \n\
 ");
-#endif /* __GNUC__ */
+#endif /* __GNUC__ || __INTEL_COMPILER */
 
 static void
 acpi_printcpu(void)
@@ -187,7 +187,7 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
        vm_page_t               page;
        static vm_page_t        opage = NULL;
        int                     ret = 0;
-       u_int32_t               cr3;
+       uint32_t                cr3;
        u_long                  ef;
        struct proc             *p;
 
@@ -227,28 +227,28 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
                p_gdt->rd_limit = r_gdt.rd_limit;
                p_gdt->rd_base = vtophys(r_gdt.rd_base);
 
-               WAKECODE_FIXUP(physical_esp, u_int32_t, vtophys(r_esp));
-               WAKECODE_FIXUP(previous_cr0, u_int32_t, r_cr0);
-               WAKECODE_FIXUP(previous_cr2, u_int32_t, r_cr2);
-               WAKECODE_FIXUP(previous_cr3, u_int32_t, r_cr3);
-               WAKECODE_FIXUP(previous_cr4, u_int32_t, r_cr4);
+               WAKECODE_FIXUP(physical_esp, uint32_t, vtophys(r_esp));
+               WAKECODE_FIXUP(previous_cr0, uint32_t, r_cr0);
+               WAKECODE_FIXUP(previous_cr2, uint32_t, r_cr2);
+               WAKECODE_FIXUP(previous_cr3, uint32_t, r_cr3);
+               WAKECODE_FIXUP(previous_cr4, uint32_t, r_cr4);
 
-               WAKECODE_FIXUP(reset_video, u_int32_t, acpi_reset_video);
+               WAKECODE_FIXUP(reset_video, uint32_t, acpi_reset_video);
 
-               WAKECODE_FIXUP(previous_tr,  u_int16_t, r_tr);
+               WAKECODE_FIXUP(previous_tr,  uint16_t, r_tr);
                WAKECODE_BCOPY(previous_gdt, struct region_descriptor, r_gdt);
-               WAKECODE_FIXUP(previous_ldt, u_int16_t, r_ldt);
+               WAKECODE_FIXUP(previous_ldt, uint16_t, r_ldt);
                WAKECODE_BCOPY(previous_idt, struct region_descriptor, r_idt);
 
                WAKECODE_FIXUP(where_to_recover, void, acpi_restorecpu);
 
-               WAKECODE_FIXUP(previous_ds,  u_int16_t, r_ds);
-               WAKECODE_FIXUP(previous_es,  u_int16_t, r_es);
-               WAKECODE_FIXUP(previous_fs,  u_int16_t, r_fs);
-               WAKECODE_FIXUP(previous_gs,  u_int16_t, r_gs);
-               WAKECODE_FIXUP(previous_ss,  u_int16_t, r_ss);
+               WAKECODE_FIXUP(previous_ds,  uint16_t, r_ds);
+               WAKECODE_FIXUP(previous_es,  uint16_t, r_es);
+               WAKECODE_FIXUP(previous_fs,  uint16_t, r_fs);
+               WAKECODE_FIXUP(previous_gs,  uint16_t, r_gs);
+               WAKECODE_FIXUP(previous_ss,  uint16_t, r_ss);
 
-               if (acpi_get_verbose(sc))
+               if (bootverbose)
                        acpi_printcpu();
 
                /* Call ACPICA to enter the desired sleep state */
@@ -273,7 +273,7 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
 #endif
                cpu_enable_intr();
 
-               if (acpi_get_verbose(sc)) {
+               if (bootverbose) {
                        acpi_savecpu();
                        acpi_printcpu();
                }
@@ -326,9 +326,9 @@ static void
 acpi_realmodeinst(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
 {
        struct acpi_softc       *sc = arg;
-       u_int32_t               *addr;
+       uint32_t                *addr;
 
-       addr = (u_int32_t *)&wakecode[wakeup_sw32 + 2];
+       addr = (uint32_t *)&wakecode[wakeup_sw32 + 2];
        *addr = segs[0].ds_addr + wakeup_32;
        bcopy(wakecode, (void *)sc->acpi_wakeaddr, sizeof(wakecode));
        sc->acpi_wakephys = segs[0].ds_addr;
index 4433470..013411a 100644 (file)
@@ -26,8 +26,8 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/acpica/madt.c,v 1.10 2004/01/26 19:34:24 jhb Exp $
- * $DragonFly: src/sys/platform/pc32/acpica5/madt.c,v 1.1 2004/02/21 06:48:05 dillon Exp $
+ * $FreeBSD: src/sys/i386/acpica/madt.c,v 1.15 2004/05/11 20:06:32 jhb Exp $
+ * $DragonFly: src/sys/platform/pc32/acpica5/madt.c,v 1.2 2004/06/27 08:52:45 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -51,6 +51,7 @@
 #include <machine/globaldata.h>
 
 #include "acpi.h"
+#include "actables.h"
 #include "acpivar.h"
 #include <bus/pci/pcivar.h>
 
@@ -76,14 +77,15 @@ struct lapic_info {
        u_int la_apic_id:8;
 } lapics[NLAPICS + 1];
 
+static int madt_found_sci_override;
 static MULTIPLE_APIC_TABLE *madt;
 static vm_paddr_t madt_physaddr;
 static vm_offset_t madt_length;
 
 MALLOC_DEFINE(M_MADT, "MADT Table", "ACPI MADT Table Items");
 
-static u_char  interrupt_polarity(UINT16 Polarity);
-static u_char  interrupt_trigger(UINT16 TriggerMode);
+static enum intr_polarity interrupt_polarity(UINT16 Polarity, UINT8 Source);
+static enum intr_trigger interrupt_trigger(UINT16 TriggerMode, UINT8 Source);
 static int     madt_find_cpu(u_int acpi_id, u_int *apic_id);
 static int     madt_find_interrupt(int intr, void **apic, u_int *pin);
 static void    *madt_map(vm_paddr_t pa, int offset, vm_offset_t length);
@@ -164,6 +166,7 @@ madt_map_table(vm_paddr_t pa, int offset, const char *sig)
 {
        ACPI_TABLE_HEADER *header;
        vm_offset_t length;
+       void *table;
 
        header = madt_map(pa, offset, sizeof(ACPI_TABLE_HEADER));
        if (strncmp(header->Signature, sig, 4) != 0) {
@@ -172,7 +175,14 @@ madt_map_table(vm_paddr_t pa, int offset, const char *sig)
        }
        length = header->Length;
        madt_unmap(header, sizeof(ACPI_TABLE_HEADER));
-       return (madt_map(pa, offset, length));
+       table = madt_map(pa, offset, length);
+       if (ACPI_FAILURE(AcpiTbVerifyTableChecksum(table))) {
+               if (bootverbose)
+                       printf("MADT: Failed checksum for table %s\n", sig);
+               madt_unmap(table, length);
+               return (NULL);
+       }
+       return (table);
 }
 
 static void
@@ -224,6 +234,16 @@ madt_probe(void)
         * Page 0 is used to map in the headers of candidate ACPI tables.
         */
        if (rsdp->Revision >= 2) {
+               /*
+                * AcpiOsGetRootPointer only verifies the checksum for
+                * the version 1.0 portion of the RSDP.  Version 2.0 has
+                * an additional checksum that we verify first.
+                */
+               if (AcpiTbChecksum(rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0) {
+                       if (bootverbose)
+                               printf("MADT: RSDP failed extended checksum\n");
+                       return (ENXIO);
+               }
                xsdt = madt_map_table(rsdp->XsdtPhysicalAddress, 1, XSDT_SIG);
                if (xsdt == NULL) {
                        if (bootverbose)
@@ -260,6 +280,16 @@ madt_probe(void)
                printf("MADT: Found table at 0x%jx\n",
                    (uintmax_t)madt_physaddr);
 
+       /*
+        * Verify that we can map the full table and that its checksum is
+        * correct, etc.
+        */
+       madt = madt_map_table(madt_physaddr, 0, APIC_SIG);
+       if (madt == NULL)
+               return (ENXIO);
+       madt_unmap_table(madt);
+       madt = NULL;
+
        return (0);
 }
 
@@ -282,7 +312,6 @@ madt_probe_table(vm_paddr_t address)
                printf("Table '%.4s' at 0x%jx\n", table->Signature,
                    (uintmax_t)address);
 
-       /* XXX: Verify checksum? */
        if (strncmp(table->Signature, APIC_SIG, 4) != 0) {
                madt_unmap(table, sizeof(ACPI_TABLE_HEADER));
                return (0);
@@ -334,6 +363,8 @@ madt_setup_local(void)
 static int
 madt_setup_io(void)
 {
+       void *ioapic;
+       u_int pin;
        int i;
 
        /* Try to initialize ACPI so that we can access the FADT. */
@@ -346,11 +377,30 @@ madt_setup_io(void)
        }
                    
        /* First, we run through adding I/O APIC's. */
+       if (madt->PCATCompat)
+               ioapic_enable_mixed_mode();
        madt_walk_table(madt_parse_apics, NULL);
 
        /* Second, we run through the table tweaking interrupt sources. */
        madt_walk_table(madt_parse_ints, NULL);
 
+       /*
+        * If there was not an explicit override entry for the SCI,
+        * force it to use level trigger and active-low polarity.
+        */
+       if (!madt_found_sci_override) {
+               if (madt_find_interrupt(AcpiGbl_FADT->SciInt, &ioapic, &pin)
+                   != 0)
+                       printf("MADT: Could not find APIC for SCI IRQ %d\n",
+                           AcpiGbl_FADT->SciInt);
+               else {
+                       printf(
+       "MADT: Forcing active-low polarity and level trigger for SCI\n");
+                       ioapic_set_polarity(ioapic, pin, INTR_POLARITY_LOW);
+                       ioapic_set_triggermode(ioapic, pin, INTR_TRIGGER_LEVEL);
+               }
+       }
+
        /* Third, we register all the I/O APIC's. */
        for (i = 0; i < NIOAPICS; i++)
                if (ioapics[i].io_apic != NULL)
@@ -454,35 +504,44 @@ madt_parse_apics(APIC_HEADER *entry, void *arg __unused)
 }
 
 /*
- * Determine properties of an interrupt source.  Note that for ACPI,
- * these are only used for ISA interrupts, so we assume ISA bus values
- * (Active Hi, Edge Triggered) for conforming values.
+ * Determine properties of an interrupt source.  Note that for ACPI these
+ * functions are only used for ISA interrupts, so we assume ISA bus values
+ * (Active Hi, Edge Triggered) for conforming values except for the ACPI
+ * SCI for which we use Active Lo, Level Triggered.
  */
-static u_char
-interrupt_polarity(UINT16 Polarity)
+static enum intr_polarity
+interrupt_polarity(UINT16 Polarity, UINT8 Source)
 {
 
        switch (Polarity) {
        case POLARITY_CONFORMS:
+               if (Source == AcpiGbl_FADT->SciInt)
+                       return (INTR_POLARITY_LOW);
+               else
+                       return (INTR_POLARITY_HIGH);
        case POLARITY_ACTIVE_HIGH:
-               return (1);
+               return (INTR_POLARITY_HIGH);
        case POLARITY_ACTIVE_LOW:
-               return (0);
+               return (INTR_POLARITY_LOW);
        default:
                panic("Bogus Interrupt Polarity");
        }
 }
 
-static u_char
-interrupt_trigger(UINT16 TriggerMode)
+static enum intr_trigger
+interrupt_trigger(UINT16 TriggerMode, UINT8 Source)
 {
 
        switch (TriggerMode) {
        case TRIGGER_CONFORMS:
+               if (Source == AcpiGbl_FADT->SciInt)
+                       return (INTR_TRIGGER_LEVEL);
+               else
+                       return (INTR_TRIGGER_EDGE);
        case TRIGGER_EDGE:
-               return (1);
+               return (INTR_TRIGGER_EDGE);
        case TRIGGER_LEVEL:
-               return (0);
+               return (INTR_TRIGGER_LEVEL);
        default:
                panic("Bogus Interrupt Trigger Mode");
        }
@@ -540,7 +599,9 @@ madt_parse_interrupt_override(MADT_INTERRUPT_OVERRIDE *intr)
 {
        void *new_ioapic, *old_ioapic;
        u_int new_pin, old_pin;
-       int force_lo;
+       enum intr_trigger trig;
+       enum intr_polarity pol;
+       char buf[64];
 
        if (bootverbose)
                printf("MADT: intr override: source %u, irq %u\n",
@@ -554,18 +615,46 @@ madt_parse_interrupt_override(MADT_INTERRUPT_OVERRIDE *intr)
        }
 
        /*
-        * If the SCI is remapped to a non-ISA global interrupt,
-        * force it to level trigger and active-lo polarity.
+        * Lookup the appropriate trigger and polarity modes for this
+        * entry.
+        */
+       trig = interrupt_trigger(intr->TriggerMode, intr->Source);
+       pol = interrupt_polarity(intr->Polarity, intr->Source);
+
+       /*
         * If the SCI is identity mapped but has edge trigger and
-        * active-hi polarity, also force it to use level/lo. 
+        * active-hi polarity or the force_sci_lo tunable is set,
+        * force it to use level/lo.
         */
-       force_lo = 0;
-       if (intr->Source == AcpiGbl_FADT->SciInt)
-               if (intr->Interrupt > 15 || (intr->Interrupt == intr->Source &&
-                   intr->TriggerMode == TRIGGER_EDGE &&
-                   intr->Polarity == POLARITY_ACTIVE_HIGH))
-                       force_lo = 1;
+       if (intr->Source == AcpiGbl_FADT->SciInt) {
+               madt_found_sci_override = 1;
+               if (getenv_string("hw.acpi.sci.trigger", buf, sizeof(buf))) {
+                       if (tolower(buf[0]) == 'e')
+                               trig = INTR_TRIGGER_EDGE;
+                       else if (tolower(buf[0]) == 'l')
+                               trig = INTR_TRIGGER_LEVEL;
+                       else
+                               panic(
+                               "Invalid trigger %s: must be 'edge' or 'level'",
+                                   buf);
+                       printf("MADT: Forcing SCI to %s trigger\n",
+                           trig == INTR_TRIGGER_EDGE ? "edge" : "level");
+               }
+               if (getenv_string("hw.acpi.sci.polarity", buf, sizeof(buf))) {
+                       if (tolower(buf[0]) == 'h')
+                               pol = INTR_POLARITY_HIGH;
+                       else if (tolower(buf[0]) == 'l')
+                               pol = INTR_POLARITY_LOW;
+                       else
+                               panic(
+                               "Invalid polarity %s: must be 'high' or 'low'",
+                                   buf);
+                       printf("MADT: Forcing SCI to active %s polarity\n",
+                           pol == INTR_POLARITY_HIGH ? "high" : "low");
+               }
+       }
 
+       /* Remap the IRQ if it is mapped to a different interrupt vector. */
        if (intr->Source != intr->Interrupt) {
                /*
                 * If the SCI is remapped to a non-ISA global interrupt,
@@ -585,18 +674,10 @@ madt_parse_interrupt_override(MADT_INTERRUPT_OVERRIDE *intr)
                    intr->Source)
                        ioapic_disable_pin(old_ioapic, old_pin);
        }
-       if (force_lo) {
-               printf(
-       "MADT: Forcing active-lo polarity and level trigger for IRQ %d\n",
-                   intr->Source);
-               ioapic_set_polarity(new_ioapic, new_pin, 0);
-               ioapic_set_triggermode(new_ioapic, new_pin, 0);
-       } else {
-               ioapic_set_polarity(new_ioapic, new_pin,
-                   interrupt_polarity(intr->Polarity));
-               ioapic_set_triggermode(new_ioapic, new_pin,
-                   interrupt_trigger(intr->TriggerMode));
-       }
+
+       /* Program the polarity and trigger mode. */
+       ioapic_set_triggermode(new_ioapic, new_pin, trig);
+       ioapic_set_polarity(new_ioapic, new_pin, pol);
 }
 
 /*
@@ -617,10 +698,10 @@ madt_parse_nmi(MADT_NMI_SOURCE *nmi)
        ioapic_set_nmi(ioapic, pin);
        if (nmi->TriggerMode != TRIGGER_CONFORMS)
                ioapic_set_triggermode(ioapic, pin,
-                   interrupt_trigger(nmi->TriggerMode));
+                   interrupt_trigger(nmi->TriggerMode, 0));
        if (nmi->Polarity != TRIGGER_CONFORMS)
                ioapic_set_polarity(ioapic, pin,
-                   interrupt_polarity(nmi->Polarity));
+                   interrupt_polarity(nmi->Polarity, 0));
 }
 
 /*
@@ -646,10 +727,10 @@ madt_parse_local_nmi(MADT_LOCAL_APIC_NMI *nmi)
        lapic_set_lvt_mode(apic_id, pin, APIC_LVT_DM_NMI);
        if (nmi->TriggerMode != TRIGGER_CONFORMS)
                lapic_set_lvt_triggermode(apic_id, pin,
-                   interrupt_trigger(nmi->TriggerMode));
+                   interrupt_trigger(nmi->TriggerMode, 0));
        if (nmi->Polarity != POLARITY_CONFORMS)
                lapic_set_lvt_polarity(apic_id, pin,
-                   interrupt_polarity(nmi->Polarity));
+                   interrupt_polarity(nmi->Polarity, 0));
 }
 
 /*
index f2ef1b8..1d17985 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/include/apicvar.h,v 1.5 2003/11/14 22:21:30 peter Exp $
- * $DragonFly: src/sys/platform/pc32/apic/apicvar.h,v 1.1 2004/02/21 06:37:07 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/apic/apicvar.h,v 1.2 2004/06/27 08:52:46 dillon Exp $
  */
 
 #ifndef _MACHINE_APICVAR_H_
@@ -127,6 +127,7 @@ u_int       apic_idt_to_irq(u_int vector);
 void   apic_register_enumerator(struct apic_enumerator *enumerator);
 void   *ioapic_create(uintptr_t addr, int32_t id, int intbase);
 int    ioapic_disable_pin(void *cookie, u_int pin);
+void   ioapic_enable_mixed_mode(void);
 int    ioapic_get_vector(void *cookie, u_int pin);
 int    ioapic_next_logical_cluster(void);
 void   ioapic_register(void *cookie);
index f603b06..eeb9054 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)machdep.c     7.4 (Berkeley) 6/3/91
  * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.385.2.30 2003/05/31 08:48:05 alc Exp $
- * $DragonFly: src/sys/platform/pc32/i386/machdep.c,v 1.59 2004/06/26 02:12:08 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/machdep.c,v 1.60 2004/06/27 08:52:36 dillon Exp $
  */
 
 #include "use_apm.h"
@@ -875,6 +875,19 @@ SYSCTL_INT(_machdep, OID_AUTO, cpu_idle_hltcnt, CTLFLAG_RW,
 SYSCTL_INT(_machdep, OID_AUTO, cpu_idle_spincnt, CTLFLAG_RW,
     &cpu_idle_spincnt, 0, "Idle loop entry spins");
 
+static void
+cpu_idle_default_hook(void)
+{
+       /*
+        * We must guarentee that hlt is exactly the instruction
+        * following the sti.
+        */
+       __asm __volatile("sti; hlt");
+}
+
+/* Other subsystems (e.g., ACPI) can hook this later. */
+void (*cpu_idle_hook)(void) = cpu_idle_default_hook;
+
 void
 cpu_idle(void)
 {
@@ -895,13 +908,9 @@ cpu_idle(void)
                 */
                if (cpu_idle_hlt && !lwkt_runnable() &&
                    (td->td_flags & TDF_IDLE_NOHLT) == 0) {
-                       /*
-                        * We must guarentee that hlt is exactly the instruction
-                        * following the sti.
-                        */
                        __asm __volatile("cli");
                        splz();
-                       __asm __volatile("sti; hlt");
+                       cpu_idle_hook();
                        ++cpu_idle_hltcnt;
                } else {
                        td->td_flags &= ~TDF_IDLE_NOHLT;
@@ -2496,6 +2505,107 @@ Debugger(const char *msg)
 }
 #endif /* no DDB */
 
+#ifndef APIC_IO
+#include <machine/apicvar.h>
+
+/*
+ * Provide stub functions so that the MADT APIC enumerator in the acpi
+ * kernel module will link against a kernel without 'option APIC_IO'.
+ *
+ * XXX - This is a gross hack.
+ */
+void
+apic_register_enumerator(struct apic_enumerator *enumerator)
+{
+}
+
+void *
+ioapic_create(uintptr_t addr, int32_t id, int intbase)
+{
+       return (NULL);
+}
+
+int
+ioapic_disable_pin(void *cookie, u_int pin)
+{
+       return (ENXIO);
+}
+
+void
+ioapic_enable_mixed_mode(void)
+{
+}
+
+int
+ioapic_get_vector(void *cookie, u_int pin)
+{
+       return (-1);
+}
+
+void
+ioapic_register(void *cookie)
+{
+}
+
+int
+ioapic_remap_vector(void *cookie, u_int pin, int vector)
+{
+       return (ENXIO);
+}
+
+int
+ioapic_set_extint(void *cookie, u_int pin)
+{
+       return (ENXIO);
+}
+
+int
+ioapic_set_nmi(void *cookie, u_int p