Merge commit 'origin/vendor/PAM_PASSWDQC'
[dragonfly.git] / sys / dev / acpica5 / acpi.c
1 /*-
2  * Copyright (c) 2000 Takanori Watanabe <takawata@jp.freebsd.org>
3  * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
4  * Copyright (c) 2000, 2001 Michael Smith
5  * Copyright (c) 2000 BSDi
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *      $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.160 2004/06/14 03:52:19 njl Exp $
30  *      $DragonFly: src/sys/dev/acpica5/acpi.c,v 1.37 2008/10/03 00:26:21 hasso Exp $
31  */
32
33 #include "opt_acpi.h"
34 #include <sys/param.h>
35 #include <sys/kernel.h>
36 #include <sys/proc.h>
37 #include <sys/fcntl.h>
38 #include <sys/malloc.h>
39 #include <sys/bus.h>
40 #include <sys/conf.h>
41 #include <sys/device.h>
42 #include <sys/ioccom.h>
43 #include <sys/reboot.h>
44 #include <sys/sysctl.h>
45 #include <sys/ctype.h>
46 #include <sys/linker.h>
47 #include <sys/power.h>
48 #include <sys/sbuf.h>
49 #include <sys/rman.h>
50
51 #include <sys/thread2.h>
52 #include <sys/lock.h>
53
54 #include <machine/clock.h>
55 #include <machine/globaldata.h>
56 #include <bus/isa/isavar.h>
57
58 #include "acpi.h"
59 #include <dev/acpica5/acpivar.h>
60 #include <dev/acpica5/acpiio.h>
61 #include <acnamesp.h>
62
63 MALLOC_DEFINE(M_ACPIDEV, "acpidev", "ACPI devices");
64
65 /* Hooks for the ACPI CA debugging infrastructure */
66 #define _COMPONENT      ACPI_BUS
67 ACPI_MODULE_NAME("ACPI")
68
69 static d_open_t         acpiopen;
70 static d_close_t        acpiclose;
71 static d_ioctl_t        acpiioctl;
72
73 #define CDEV_MAJOR 152
74 static struct dev_ops acpi_ops = {
75         { "acpi", CDEV_MAJOR, 0 },
76         .d_open = acpiopen,
77         .d_close = acpiclose,
78         .d_ioctl = acpiioctl
79 };
80
81 #if __FreeBSD_version >= 500000
82 struct mtx      acpi_mutex;
83 #endif
84
85 /* Local pools for managing system resources for ACPI child devices. */
86 struct rman acpi_rman_io, acpi_rman_mem;
87
88 struct acpi_quirks {
89     char        *OemId;
90     uint32_t    OemRevision;
91     char        *value;
92 };
93
94 #define ACPI_OEM_REV_ANY        0
95
96 static struct acpi_quirks acpi_quirks_table[] = {
97 #ifdef notyet
98     /* Bad PCI routing table.  Used on some SuperMicro boards. */
99     { "PTLTD ", 0x06040000, "pci_link" },
100 #endif
101 #ifdef ACPI_QUIRK_VMWARE
102     /*
103      * VMware's ACPI-fast24 timer runs roughly 65 times too fast, and not
104      * predictably/monotonic either. This is observed at least under SMP
105      * conditions.
106      *
107      * NOTE: this combination of OemId and OemRevision is NOT unique; it is
108      * known or suspected that at least some SuperMicro boards (see above) and
109      * the Compaq Presario 1952 use this combination. That's why this quirks
110      * entry is guarded by an #ifdef, and associated config option.
111      */
112     { "PTLTD ", 0x06040000, "timer" },
113 #endif /* ACPI_QUIRK_VMWARE */
114     { NULL, 0, NULL }
115 };
116
117 static int      acpi_modevent(struct module *mod, int event, void *junk);
118 static int      acpi_identify(driver_t *driver, device_t parent);
119 static int      acpi_probe(device_t dev);
120 static int      acpi_attach(device_t dev);
121 static int      acpi_shutdown(device_t dev);
122 static void     acpi_quirks_set(void);
123 static device_t acpi_add_child(device_t bus, device_t parent, int order,
124                         const char *name, int unit);
125 static int      acpi_print_child(device_t bus, device_t child);
126 static int      acpi_read_ivar(device_t dev, device_t child, int index,
127                         uintptr_t *result);
128 static int      acpi_write_ivar(device_t dev, device_t child, int index,
129                         uintptr_t value);
130 static struct resource_list *acpi_get_rlist(device_t dev, device_t child);
131 static struct resource *acpi_alloc_resource(device_t bus, device_t child,
132                         int type, int *rid, u_long start, u_long end,
133                         u_long count, u_int flags);
134 static int      acpi_release_resource(device_t bus, device_t child, int type,
135                         int rid, struct resource *r);
136 static uint32_t acpi_isa_get_logicalid(device_t dev);
137 static int      acpi_isa_get_compatid(device_t dev, uint32_t *cids, int count);
138 static char     *acpi_device_id_probe(device_t bus, device_t dev, char **ids);
139 static int      acpi_isa_pnp_probe(device_t bus, device_t child,
140                         struct isa_pnp_id *ids);
141 static void     acpi_probe_children(device_t bus);
142 static ACPI_STATUS acpi_probe_child(ACPI_HANDLE handle, UINT32 level,
143                         void *context, void **status);
144 static void     acpi_shutdown_pre_sync(void *arg, int howto);
145 static void     acpi_shutdown_final(void *arg, int howto);
146 static void     acpi_shutdown_poweroff(void *arg);
147 static void     acpi_enable_fixed_events(struct acpi_softc *sc);
148 static int      acpi_parse_prw(ACPI_HANDLE h, struct acpi_prw_data *prw);
149 static ACPI_STATUS acpi_wake_limit(ACPI_HANDLE h, UINT32 level, void *context,
150                     void **status);
151 static int      acpi_wake_limit_walk(int sstate);
152 static int      acpi_wake_sysctl_walk(device_t dev);
153 #ifdef dfly_notyet
154 static int      acpi_wake_set_sysctl(SYSCTL_HANDLER_ARGS);
155 #endif
156 static void     acpi_system_eventhandler_sleep(void *arg, int state);
157 static void     acpi_system_eventhandler_wakeup(void *arg, int state);
158 static int      acpi_supported_sleep_state_sysctl(SYSCTL_HANDLER_ARGS);
159 static int      acpi_sleep_state_sysctl(SYSCTL_HANDLER_ARGS);
160 static int      acpi_pm_func(u_long cmd, void *arg, ...);
161 static int      acpi_child_location_str_method(device_t acdev, device_t child,
162                                                char *buf, size_t buflen);
163 static int      acpi_child_pnpinfo_str_method(device_t acdev, device_t child,
164                                               char *buf, size_t buflen);
165
166 static device_method_t acpi_methods[] = {
167     /* Device interface */
168     DEVMETHOD(device_identify,          acpi_identify),
169     DEVMETHOD(device_probe,             acpi_probe),
170     DEVMETHOD(device_attach,            acpi_attach),
171     DEVMETHOD(device_shutdown,          acpi_shutdown),
172     DEVMETHOD(device_detach,            bus_generic_detach),
173     DEVMETHOD(device_suspend,           bus_generic_suspend),
174     DEVMETHOD(device_resume,            bus_generic_resume),
175
176     /* Bus interface */
177     DEVMETHOD(bus_add_child,            acpi_add_child),
178     DEVMETHOD(bus_print_child,          acpi_print_child),
179     DEVMETHOD(bus_read_ivar,            acpi_read_ivar),
180     DEVMETHOD(bus_write_ivar,           acpi_write_ivar),
181     DEVMETHOD(bus_get_resource_list,    acpi_get_rlist),
182     DEVMETHOD(bus_set_resource,         bus_generic_rl_set_resource),
183     DEVMETHOD(bus_get_resource,         bus_generic_rl_get_resource),
184     DEVMETHOD(bus_alloc_resource,       acpi_alloc_resource),
185     DEVMETHOD(bus_release_resource,     acpi_release_resource),
186     DEVMETHOD(bus_child_pnpinfo_str,    acpi_child_pnpinfo_str_method),
187     DEVMETHOD(bus_child_location_str,   acpi_child_location_str_method),
188     DEVMETHOD(bus_driver_added,         bus_generic_driver_added),
189     DEVMETHOD(bus_activate_resource,    bus_generic_activate_resource),
190     DEVMETHOD(bus_deactivate_resource,  bus_generic_deactivate_resource),
191     DEVMETHOD(bus_setup_intr,           bus_generic_setup_intr),
192     DEVMETHOD(bus_teardown_intr,        bus_generic_teardown_intr),
193
194     /* ACPI bus */
195     DEVMETHOD(acpi_id_probe,            acpi_device_id_probe),
196
197     /* ISA emulation */
198     DEVMETHOD(isa_pnp_probe,            acpi_isa_pnp_probe),
199
200     {0, 0}
201 };
202
203 static driver_t acpi_driver = {
204     "acpi",
205     acpi_methods,
206     sizeof(struct acpi_softc),
207 };
208
209 static devclass_t acpi_devclass;
210 DRIVER_MODULE(acpi, nexus, acpi_driver, acpi_devclass, acpi_modevent, 0);
211 MODULE_VERSION(acpi, 1);
212
213 static const char* sleep_state_names[] = {
214     "S0", "S1", "S2", "S3", "S4", "S5", "NONE"};
215
216 SYSCTL_NODE(_debug, OID_AUTO, acpi, CTLFLAG_RW, NULL, "ACPI debugging");
217 static char acpi_ca_version[12];
218 SYSCTL_STRING(_debug_acpi, OID_AUTO, acpi_ca_version, CTLFLAG_RD,
219               acpi_ca_version, 0, "Version of Intel ACPI-CA");
220
221 /*
222  * Allow override of whether methods execute in parallel or not.
223  * Enable this for serial behavior, which fixes "AE_ALREADY_EXISTS"
224  * errors for AML that really can't handle parallel method execution.
225  * It is off by default since this breaks recursive methods and
226  * some IBMs use such code.
227  */
228 static int acpi_serialize_methods;
229 TUNABLE_INT("hw.acpi.serialize_methods", &acpi_serialize_methods);
230
231 /*
232  * ACPI can only be loaded as a module by the loader; activating it after
233  * system bootstrap time is not useful, and can be fatal to the system.
234  * It also cannot be unloaded, since the entire system bus heirarchy hangs
235  * off it.
236  */
237 static int
238 acpi_modevent(struct module *mod, int event, void *junk)
239 {
240     switch(event) {
241     case MOD_LOAD:
242         if (!cold) {
243             kprintf("The ACPI driver cannot be loaded after boot.\n");
244             return (EPERM);
245         }
246         break;
247     case MOD_UNLOAD:
248         if (!cold && power_pm_get_type() == POWER_PM_TYPE_ACPI)
249             return (EBUSY);
250         break;
251     default:
252         break;
253     }
254     return (0);
255 }
256
257 /*
258  * Perform early initialization.
259  */
260 ACPI_STATUS
261 acpi_Startup(void)
262 {
263 #ifdef ACPI_DEBUGGER
264     char *debugpoint;
265 #endif
266     static int error, started = 0;
267
268     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
269
270     if (started)
271         return_VALUE (error);
272     started = 1;
273
274     /* Start up the ACPI CA subsystem. */
275 #ifdef ACPI_DEBUGGER
276     debugpoint = kgetenv("debug.acpi.debugger");
277     if (debugpoint) {
278         if (!strcmp(debugpoint, "init"))
279             acpi_EnterDebugger();
280         kfreeenv(debugpoint);
281     }
282 #endif
283     error = AcpiInitializeTables(NULL, 16, TRUE);
284     if (ACPI_FAILURE(error)) {
285         kprintf("ACPI: table initialization failed:\n");
286         return_VALUE (error);
287     }
288
289     /* Set up any quirks we have for this XSDT. */
290     acpi_quirks_set();
291     if (acpi_disabled("acpi"))
292         return_VALUE (AE_ERROR);
293
294     return_VALUE (AE_OK);
295 }
296
297 /*
298  * Detect ACPI, perform early initialisation
299  */
300 static int
301 acpi_identify(driver_t *driver, device_t parent)
302 {
303     device_t    child;
304
305     /*
306      * No sense rescanning an ACPI 'bus'.
307      */
308     if (device_get_state(parent) == DS_ATTACHED)
309         return(0);
310
311     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
312
313     if (!cold)
314         return (ENXIO);
315
316     /* Check that we haven't been disabled with a hint. */
317     if (resource_disabled("acpi", 0))
318         return (ENXIO);
319
320     /* Make sure we're not being doubly invoked. */
321     if (device_find_child(parent, "acpi", 0) != NULL)
322         return (ENXIO);
323
324     /* Initialize ACPI-CA. */
325     if (ACPI_FAILURE(acpi_Startup()))
326         return (ENXIO);
327
328     ksnprintf(acpi_ca_version, sizeof(acpi_ca_version), "%#x", ACPI_CA_VERSION);
329
330     /* Attach the actual ACPI device. */
331     if ((child = BUS_ADD_CHILD(parent, parent, 0, "acpi", 0)) == NULL) {
332         device_printf(parent, "ACPI: could not attach\n");
333         return (ENXIO);
334     }
335     return (0);
336 }
337
338 /*
339  * Get a mapping of the root table header, as ACPICA code no longer
340  * keeps local copy of RSDT/XSDT
341  *
342  * return value: if non-NULL, mapped physical address of root table header.
343  * caller is supposed to unmap the region by AcpiOsUnmapMemory()
344  */
345 static ACPI_TABLE_HEADER *
346 acpi_map_rsdt_header(void)
347 {
348     ACPI_PHYSICAL_ADDRESS rsdp_addr, addr;
349     ACPI_TABLE_RSDP *rsdp;
350
351     if ((rsdp_addr = AcpiOsGetRootPointer()) == 0)
352         return(NULL);
353     if ((rsdp = AcpiOsMapMemory(rsdp_addr, sizeof(*rsdp))) == NULL)
354         return(NULL);
355     if (rsdp->Revision > 1 && rsdp->XsdtPhysicalAddress)
356         addr = (ACPI_PHYSICAL_ADDRESS)rsdp->XsdtPhysicalAddress;
357     else
358         addr = (ACPI_PHYSICAL_ADDRESS)rsdp->RsdtPhysicalAddress;
359     AcpiOsUnmapMemory(rsdp, sizeof(*rsdp));
360
361     return AcpiOsMapMemory(addr, sizeof(ACPI_TABLE_HEADER));
362 }
363
364 /*
365  * Fetch some descriptive data from ACPI to put in our attach message
366  */
367 static int
368 acpi_probe(device_t dev)
369 {
370     ACPI_TABLE_HEADER   *th;
371     char                buf[20];
372     int                 error;
373     struct sbuf         sb;
374     ACPI_LOCK_DECL;
375
376     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
377
378     if (power_pm_get_type() != POWER_PM_TYPE_NONE &&
379         power_pm_get_type() != POWER_PM_TYPE_ACPI) {
380
381         device_printf(dev, "Other PM system enabled.\n");
382         return_VALUE(ENXIO);
383     }
384
385     ACPI_LOCK;
386
387     th = acpi_map_rsdt_header();
388     if (th == NULL) {
389         device_printf(dev, "couldn't get RSDT header\n");
390         error = ENXIO;
391         goto unlock;
392     }
393
394     sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN);
395     sbuf_bcat(&sb, th->OemId, 6);
396     sbuf_trim(&sb);
397     sbuf_putc(&sb, ' ');
398     sbuf_bcat(&sb, th->OemTableId, 8);
399     sbuf_trim(&sb);
400     sbuf_finish(&sb);
401     device_set_desc_copy(dev, sbuf_data(&sb));
402     sbuf_delete(&sb);
403     AcpiOsUnmapMemory(th, sizeof(*th));
404     error = 0;
405 unlock:
406     ACPI_UNLOCK;
407     return_VALUE(error);
408 }
409
410 static int
411 acpi_attach(device_t dev)
412 {
413     struct acpi_softc   *sc;
414     ACPI_STATUS         status;
415     int                 error, state;
416     UINT32              flags;
417     UINT8               TypeA, TypeB;
418     char                *env;
419     ACPI_TABLE_FACS     *facsp;
420 #ifdef ACPI_DEBUGGER
421     char                *debugpoint;
422 #endif
423     ACPI_LOCK_DECL;
424
425     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
426 #if __FreeBSD_version >= 500000
427     /* Initialise the ACPI mutex */
428     mtx_init(&acpi_mutex, "ACPI global lock", NULL, MTX_DEF);
429 #endif
430
431     ACPI_LOCK;
432     sc = device_get_softc(dev);
433     bzero(sc, sizeof(*sc));
434     sc->acpi_dev = dev;
435     callout_init(&sc->acpi_sleep_timer);
436
437     if ((error = acpi_task_thread_init())) {
438         device_printf(dev, "Could not start task thread.\n");
439         goto out;
440     }
441
442     /*
443      * Set the globals from our tunables.  This is needed because ACPI-CA
444      * uses UINT8 for some values and we have no tunable_byte.
445      */
446     AcpiGbl_AllMethodsSerialized = (UINT8)acpi_serialize_methods;
447     AcpiGbl_EnableInterpreterSlack = TRUE;
448
449     error = ENXIO;
450 #ifdef ACPI_DEBUGGER
451     debugpoint = kgetenv("debug.acpi.debugger");
452     if (debugpoint) {
453         if (!strcmp(debugpoint, "tables"))
454             acpi_EnterDebugger();
455         kfreeenv(debugpoint);
456     }
457 #endif
458
459     if (ACPI_FAILURE(status = AcpiInitializeSubsystem())) {
460         kprintf("ACPI: initialisation failed: %s\n",
461                AcpiFormatException(status));
462         goto out;
463     }
464     if (ACPI_FAILURE(status = AcpiLoadTables())) {
465         kprintf("ACPI: table load failed: %s\n", AcpiFormatException(status));
466         goto out;
467     }
468
469     /* Initialize resource manager. */
470     acpi_rman_io.rm_type = RMAN_ARRAY;
471     acpi_rman_io.rm_start = 0;
472     acpi_rman_io.rm_end = 0xffff;
473     acpi_rman_io.rm_descr = "I/O ports";
474     if (rman_init(&acpi_rman_io) != 0)
475         panic("acpi rman_init IO ports failed");
476     acpi_rman_mem.rm_type = RMAN_ARRAY;
477     acpi_rman_mem.rm_start = 0;
478     acpi_rman_mem.rm_end = ~0ul;
479     acpi_rman_mem.rm_descr = "I/O memory addresses";
480     if (rman_init(&acpi_rman_mem) != 0)
481         panic("acpi rman_init memory failed");
482
483 #ifdef ACPI_DEBUGGER
484     debugpoint = kgetenv("debug.acpi.debugger");
485     if (debugpoint) {
486         if (!strcmp(debugpoint, "spaces"))
487             acpi_EnterDebugger();
488         kfreeenv(debugpoint);
489     }
490 #endif
491     /* Install the default address space handlers. */
492     status = AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT,
493                 ACPI_ADR_SPACE_SYSTEM_MEMORY, ACPI_DEFAULT_HANDLER, NULL, NULL);
494     if (ACPI_FAILURE(status)) {
495         device_printf(dev, "Could not initialise SystemMemory handler: %s\n",
496                       AcpiFormatException(status));
497         goto out;
498     }
499     status = AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT,
500                 ACPI_ADR_SPACE_SYSTEM_IO, ACPI_DEFAULT_HANDLER, NULL, NULL);
501     if (ACPI_FAILURE(status)) {
502         device_printf(dev, "Could not initialise SystemIO handler: %s\n",
503                       AcpiFormatException(status));
504         goto out;
505     }
506     status = AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT,
507                 ACPI_ADR_SPACE_PCI_CONFIG, ACPI_DEFAULT_HANDLER, NULL, NULL);
508     if (ACPI_FAILURE(status)) {
509         device_printf(dev, "could not initialise PciConfig handler: %s\n",
510                       AcpiFormatException(status));
511         goto out;
512     }
513
514     /*
515      * Bring ACPI fully online.
516      *
517      * Note that some systems (specifically, those with namespace evaluation
518      * issues that require the avoidance of parts of the namespace) must
519      * avoid running _INI and _STA on everything, as well as dodging the final
520      * object init pass.
521      *
522      * For these devices, we set ACPI_NO_DEVICE_INIT and ACPI_NO_OBJECT_INIT).
523      * For avoiding portions of the namespace without totally disabling _INI
524      * and _STA, use "debug.acpi.avoid.paths".
525      *
526      * XXX We should arrange for the object init pass after we have attached
527      *     all our child devices, but on many systems it works here.
528      */
529 #ifdef ACPI_DEBUGGER
530     debugpoint = kgetenv("debug.acpi.debugger");
531     if (debugpoint) {
532         if (!strcmp(debugpoint, "enable"))
533             acpi_EnterDebugger();
534         kfreeenv(debugpoint);
535     }
536 #endif
537     flags = 0;
538     if (ktestenv("debug.acpi.avoid"))
539         flags = ACPI_NO_DEVICE_INIT | ACPI_NO_OBJECT_INIT;
540     if (ACPI_FAILURE(status = AcpiEnableSubsystem(flags))) {
541         device_printf(dev, "Could not enable ACPI: %s\n",
542                       AcpiFormatException(status));
543         goto out;
544     }
545
546     /*
547      * Call the ECDT probe function to provide EC functionality before
548      * the namespace has been evaluated.
549      */
550     acpi_ec_ecdt_probe(dev);
551
552     if (ACPI_FAILURE(status = AcpiInitializeObjects(flags))) {
553         device_printf(dev, "Could not initialize ACPI objects: %s\n",
554                       AcpiFormatException(status));
555         goto out;
556     }
557
558     /*
559      * Setup our sysctl tree.
560      *
561      * XXX: This doesn't check to make sure that none of these fail.
562      */
563     sysctl_ctx_init(&sc->acpi_sysctl_ctx);
564     sc->acpi_sysctl_tree = SYSCTL_ADD_NODE(&sc->acpi_sysctl_ctx,
565                                SYSCTL_STATIC_CHILDREN(_hw), OID_AUTO,
566                                device_get_name(dev), CTLFLAG_RD, 0, "");
567     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
568         OID_AUTO, "supported_sleep_state", CTLTYPE_STRING | CTLFLAG_RD,
569         0, 0, acpi_supported_sleep_state_sysctl, "A", "");
570     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
571         OID_AUTO, "power_button_state", CTLTYPE_STRING | CTLFLAG_RW,
572         &sc->acpi_power_button_sx, 0, acpi_sleep_state_sysctl, "A", "");
573     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
574         OID_AUTO, "sleep_button_state", CTLTYPE_STRING | CTLFLAG_RW,
575         &sc->acpi_sleep_button_sx, 0, acpi_sleep_state_sysctl, "A", "");
576     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
577         OID_AUTO, "lid_switch_state", CTLTYPE_STRING | CTLFLAG_RW,
578         &sc->acpi_lid_switch_sx, 0, acpi_sleep_state_sysctl, "A", "");
579     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
580         OID_AUTO, "standby_state", CTLTYPE_STRING | CTLFLAG_RW,
581         &sc->acpi_standby_sx, 0, acpi_sleep_state_sysctl, "A", "");
582     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
583         OID_AUTO, "suspend_state", CTLTYPE_STRING | CTLFLAG_RW,
584         &sc->acpi_suspend_sx, 0, acpi_sleep_state_sysctl, "A", "");
585     SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
586         OID_AUTO, "sleep_delay", CTLFLAG_RD | CTLFLAG_RW,
587         &sc->acpi_sleep_delay, 0, "sleep delay");
588     SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
589         OID_AUTO, "s4bios", CTLFLAG_RD | CTLFLAG_RW,
590         &sc->acpi_s4bios, 0, "S4BIOS mode");
591     SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
592         OID_AUTO, "verbose", CTLFLAG_RD | CTLFLAG_RW,
593         &sc->acpi_verbose, 0, "verbose mode");
594     SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
595         OID_AUTO, "disable_on_poweroff", CTLFLAG_RD | CTLFLAG_RW,
596         &sc->acpi_disable_on_poweroff, 0, "ACPI subsystem disable on poweroff");
597
598     /*
599      * Default to 1 second before sleeping to give some machines time to
600      * stabilize.
601      */
602     sc->acpi_sleep_delay = 1;
603     sc->acpi_disable_on_poweroff = 0;
604     if (bootverbose)
605         sc->acpi_verbose = 1;
606     if ((env = kgetenv("hw.acpi.verbose")) && strcmp(env, "0")) {
607         sc->acpi_verbose = 1;
608         kfreeenv(env);
609     }
610
611     /* Only enable S4BIOS by default if the FACS says it is available. */
612     status = AcpiGetTableByIndex(ACPI_TABLE_INDEX_FACS,
613                                 (ACPI_TABLE_HEADER **)&facsp);
614     if (ACPI_SUCCESS(status)) {
615         if ((facsp->Flags & ACPI_FACS_S4_BIOS_PRESENT) != 0)
616             sc->acpi_s4bios = 1;
617     }
618
619     /*
620      * Dispatch the default sleep state to devices.  The lid switch is set
621      * to NONE by default to avoid surprising users.
622      */
623     sc->acpi_power_button_sx = ACPI_STATE_S5;
624     sc->acpi_lid_switch_sx = ACPI_S_STATES_MAX + 1;
625     sc->acpi_standby_sx = ACPI_STATE_S1;
626     sc->acpi_suspend_sx = ACPI_STATE_S3;
627
628     /* Pick the first valid sleep state for the sleep button default. */
629     sc->acpi_sleep_button_sx = ACPI_S_STATES_MAX + 1;
630     for (state = ACPI_STATE_S1; state < ACPI_STATE_S5; state++)
631         if (ACPI_SUCCESS(AcpiGetSleepTypeData(state, &TypeA, &TypeB))) {
632             sc->acpi_sleep_button_sx = state;
633             break;
634         }
635
636     acpi_enable_fixed_events(sc);
637
638     /*
639      * Scan the namespace and attach/initialise children.
640      */
641 #ifdef ACPI_DEBUGGER
642     debugpoint = kgetenv("debug.acpi.debugger");
643     if (debugpoint) {
644         if (!strcmp(debugpoint, "probe"))
645             acpi_EnterDebugger();
646         kfreeenv(debugpoint);
647     }
648 #endif
649
650     /* Register our shutdown handlers */
651     EVENTHANDLER_REGISTER(shutdown_pre_sync, acpi_shutdown_pre_sync, sc,
652         SHUTDOWN_PRI_LAST);
653     EVENTHANDLER_REGISTER(shutdown_final, acpi_shutdown_final, sc,
654         SHUTDOWN_PRI_LAST);
655
656     /*
657      * Register our acpi event handlers.
658      * XXX should be configurable eg. via userland policy manager.
659      */
660     EVENTHANDLER_REGISTER(acpi_sleep_event, acpi_system_eventhandler_sleep,
661         sc, ACPI_EVENT_PRI_LAST);
662     EVENTHANDLER_REGISTER(acpi_wakeup_event, acpi_system_eventhandler_wakeup,
663         sc, ACPI_EVENT_PRI_LAST);
664
665     /* Flag our initial states. */
666     sc->acpi_enabled = 1;
667     sc->acpi_sstate = ACPI_STATE_S0;
668     sc->acpi_sleep_disabled = 0;
669
670     /* Create the control device */
671     dev_ops_add(&acpi_ops, 0, 0);
672     sc->acpi_dev_t = make_dev(&acpi_ops, 0, UID_ROOT, GID_WHEEL, 0644,
673                               "acpi");
674     sc->acpi_dev_t->si_drv1 = sc;
675
676 #ifdef ACPI_DEBUGGER
677     debugpoint = kgetenv("debug.acpi.debugger");
678     if (debugpoint) {
679         if (strcmp(debugpoint, "running") == 0)
680             acpi_EnterDebugger();
681         kfreeenv(debugpoint);
682     }
683 #endif
684
685     if ((error = acpi_machdep_init(dev)))
686         goto out;
687
688     /* Register ACPI again to pass the correct argument of pm_func. */
689     power_pm_register(POWER_PM_TYPE_ACPI, acpi_pm_func, sc);
690
691     if (!acpi_disabled("bus"))
692         acpi_probe_children(dev);
693
694     error = 0;
695
696  out:
697     ACPI_UNLOCK;
698     return_VALUE (error);
699 }
700
701 static int
702 acpi_shutdown(device_t dev)
703 {
704     /* Allow children to shutdown first. */
705     bus_generic_shutdown(dev);
706
707     /* Disable all wake GPEs not appropriate for reboot/poweroff. */
708     acpi_wake_limit_walk(ACPI_STATE_S5);
709     return (0);
710 }
711
712 static void
713 acpi_quirks_set(void)
714 {
715     ACPI_TABLE_HEADER *rsdt;
716     struct acpi_quirks *quirk;
717     char *env, *tmp;
718     int len;
719
720     /*
721      * If the user loaded a custom table or disabled "quirks", leave
722      * the settings alone.
723      */
724     len = 0;
725     if ((env = kgetenv("acpi_dsdt_load")) != NULL) {
726         /* XXX No strcasecmp but this is good enough. */
727         if (*env == 'Y' || *env == 'y')
728             goto out;
729         kfreeenv(env);
730     }
731     if ((env = kgetenv("debug.acpi.disabled")) != NULL) {
732         if (strstr("quirks", env) != NULL)
733             goto out;
734         len = strlen(env);
735     }
736
737     /*
738      * Search through our quirk table and concatenate the disabled
739      * values with whatever we find.
740      */
741     if ((rsdt = acpi_map_rsdt_header()) == NULL)
742         goto out;
743     for (quirk = acpi_quirks_table; quirk->OemId; quirk++) {
744         if (!strncmp(rsdt->OemId, quirk->OemId, strlen(quirk->OemId)) &&
745             (rsdt->OemRevision == quirk->OemRevision ||
746             quirk->OemRevision == ACPI_OEM_REV_ANY)) {
747                 len += strlen(quirk->value) + 2;
748                 if ((tmp = kmalloc(len, M_TEMP, M_NOWAIT)) == NULL)
749                     goto out;
750                 ksprintf(tmp, "%s %s", env ? env : "", quirk->value);
751                 ksetenv("debug.acpi.disabled", tmp);
752                 kfree(tmp, M_TEMP);
753                 break;
754         }
755     }
756     AcpiOsUnmapMemory(rsdt, sizeof(*rsdt));
757
758 out:
759     if (env)
760         kfreeenv(env);
761 }
762
763 /*
764  * Handle a new device being added
765  */
766 static device_t
767 acpi_add_child(device_t bus, device_t parent, int order,
768                 const char *name, int unit)
769 {
770     struct acpi_device  *ad;
771     device_t            child;
772
773     ad = kmalloc(sizeof(*ad), M_ACPIDEV, M_INTWAIT | M_ZERO);
774
775     resource_list_init(&ad->ad_rl);
776
777     child = device_add_child_ordered(parent, order, name, unit);
778     if (child != NULL)
779         device_set_ivars(child, ad);
780     return (child);
781 }
782
783 static int
784 acpi_print_child(device_t bus, device_t child)
785 {
786     struct acpi_device   *adev = device_get_ivars(child);
787     struct resource_list *rl = &adev->ad_rl;
788     int retval = 0;
789
790     retval += bus_print_child_header(bus, child);
791     retval += resource_list_print_type(rl, "port",  SYS_RES_IOPORT, "%#lx");
792     retval += resource_list_print_type(rl, "iomem", SYS_RES_MEMORY, "%#lx");
793     retval += resource_list_print_type(rl, "irq",   SYS_RES_IRQ,    "%ld");
794     retval += resource_list_print_type(rl, "drq",   SYS_RES_DRQ,    "%ld");
795     retval += bus_print_child_footer(bus, child);
796
797     return (retval);
798 }
799
800 /* Location hint for devctl(8) */
801 static int
802 acpi_child_location_str_method(device_t cbdev, device_t child, char *buf,
803     size_t buflen)
804 {
805     struct acpi_device *dinfo = device_get_ivars(child);
806
807     if (dinfo->ad_handle)
808         ksnprintf(buf, buflen, "path=%s", acpi_name(dinfo->ad_handle));
809     else
810         ksnprintf(buf, buflen, "magic=unknown");
811     return (0);
812 }
813
814 /* PnP information for devctl(8) */
815 static int
816 acpi_child_pnpinfo_str_method(device_t cbdev, device_t child, char *buf,
817     size_t buflen)
818 {
819     ACPI_BUFFER adbuf = {ACPI_ALLOCATE_BUFFER, NULL};
820     ACPI_DEVICE_INFO *adinfo;
821     struct acpi_device *dinfo = device_get_ivars(child);
822     char *end;
823     int error;
824
825     error = AcpiGetObjectInfo(dinfo->ad_handle, &adbuf);
826     adinfo = (ACPI_DEVICE_INFO *) adbuf.Pointer;
827
828     if (error)
829         ksnprintf(buf, buflen, "Unknown");
830     else
831         ksnprintf(buf, buflen, "_HID=%s _UID=%lu",
832                 (adinfo->Valid & ACPI_VALID_HID) ?
833                 adinfo->HardwareId.Value : "UNKNOWN",
834                 (adinfo->Valid & ACPI_VALID_UID) ?
835                 strtoul(adinfo->UniqueId.Value, &end, 10) : 0);
836
837     if (adinfo)
838         AcpiOsFree(adinfo);
839
840     return (0);
841 }
842
843 /*
844  * Handle per-device ivars
845  */
846 static int
847 acpi_read_ivar(device_t dev, device_t child, int index, uintptr_t *result)
848 {
849     struct acpi_device  *ad;
850
851     if ((ad = device_get_ivars(child)) == NULL) {
852         kprintf("device has no ivars\n");
853         return (ENOENT);
854     }
855
856     /* ACPI and ISA compatibility ivars */
857     switch(index) {
858     case ACPI_IVAR_HANDLE:
859         *(ACPI_HANDLE *)result = ad->ad_handle;
860         break;
861     case ACPI_IVAR_MAGIC:
862         *(int *)result = ad->ad_magic;
863         break;
864     case ACPI_IVAR_PRIVATE:
865         *(void **)result = ad->ad_private;
866         break;
867     case ISA_IVAR_VENDORID:
868     case ISA_IVAR_SERIAL:
869     case ISA_IVAR_COMPATID:
870         *(int *)result = -1;
871         break;
872     case ISA_IVAR_LOGICALID:
873         *(int *)result = acpi_isa_get_logicalid(child);
874         break;
875     default:
876         return (ENOENT);
877     }
878
879     return (0);
880 }
881
882 static int
883 acpi_write_ivar(device_t dev, device_t child, int index, uintptr_t value)
884 {
885     struct acpi_device  *ad;
886
887     if ((ad = device_get_ivars(child)) == NULL) {
888         kprintf("device has no ivars\n");
889         return (ENOENT);
890     }
891
892     switch(index) {
893     case ACPI_IVAR_HANDLE:
894         ad->ad_handle = (ACPI_HANDLE)value;
895         break;
896     case ACPI_IVAR_MAGIC:
897         ad->ad_magic = (int)value;
898         break;
899     case ACPI_IVAR_PRIVATE:
900         ad->ad_private = (void *)value;
901         break;
902     default:
903         panic("bad ivar write request (%d)", index);
904         return (ENOENT);
905     }
906
907     return (0);
908 }
909
910 /*
911  * Handle child resource allocation/removal
912  */
913 static struct resource_list *
914 acpi_get_rlist(device_t dev, device_t child)
915 {
916     struct acpi_device          *ad;
917
918     ad = device_get_ivars(child);
919     return (&ad->ad_rl);
920 }
921
922 static struct resource *
923 acpi_alloc_resource(device_t bus, device_t child, int type, int *rid,
924     u_long start, u_long end, u_long count, u_int flags)
925 {
926     struct acpi_device *ad = device_get_ivars(child);
927     struct resource_list *rl = &ad->ad_rl;
928     struct resource_list_entry *rle;
929     struct resource *res;
930     struct rman *rm;
931     int needactivate;
932
933     /*
934      * If this is an allocation of the "default" range for a given RID, and
935      * we know what the resources for this device are (i.e., they're on the
936      * child's resource list), use those start/end values.
937      */
938     if (start == 0UL && end == ~0UL) {
939         rle = resource_list_find(rl, type, *rid);
940         if (rle == NULL)
941             return (NULL);
942         start = rle->start;
943         end = rle->end;
944         count = rle->count;
945     }
946
947     /* If we don't manage this address, pass the request up to the parent. */
948     rle = acpi_sysres_find(type, start);
949     if (rle == NULL) {
950         return (BUS_ALLOC_RESOURCE(device_get_parent(bus), child, type, rid,
951             start, end, count, flags));
952     }
953
954     /* We only handle memory and IO resources through rman. */
955     switch (type) {
956     case SYS_RES_IOPORT:
957         rm = &acpi_rman_io;
958         break;
959     case SYS_RES_MEMORY:
960         rm = &acpi_rman_mem;
961         break;
962     default:
963         panic("acpi_alloc_resource: invalid res type %d", type);
964     }
965
966     /* If we do know it, allocate it from the local pool. */
967     needactivate = flags & RF_ACTIVE;
968     flags &= ~RF_ACTIVE;
969     res = rman_reserve_resource(rm, start, end, count, flags, child);
970     if (res == NULL)
971         return (NULL);
972
973     /* Copy the bus tag from the pre-allocated resource. */
974     rman_set_bustag(res, rman_get_bustag(rle->res));
975     if (type == SYS_RES_IOPORT)
976         rman_set_bushandle(res, res->r_start);
977
978     /* If requested, activate the resource using the parent's method. */
979     if (needactivate)
980         if (bus_activate_resource(child, type, *rid, res) != 0) {
981             rman_release_resource(res);
982             return (NULL);
983         }
984
985     return (res);
986 }
987
988 static int
989 acpi_release_resource(device_t bus, device_t child, int type, int rid,
990     struct resource *r)
991 {
992     int ret;
993
994     /*
995      * If we know about this address, deactivate it and release it to the
996      * local pool.  If we don't, pass this request up to the parent.
997      */
998     if (acpi_sysres_find(type, rman_get_start(r)) == NULL) {
999         if (rman_get_flags(r) & RF_ACTIVE) {
1000             ret = bus_deactivate_resource(child, type, rid, r);
1001             if (ret != 0)
1002                 return (ret);
1003         }
1004         ret = rman_release_resource(r);
1005     } else
1006         ret = BUS_RELEASE_RESOURCE(device_get_parent(bus), child, type, rid, r);
1007
1008     return (ret);
1009 }
1010
1011 /* Allocate an IO port or memory resource, given its GAS. */
1012 struct resource *
1013 acpi_bus_alloc_gas(device_t dev, int *rid, ACPI_GENERIC_ADDRESS *gas,
1014     u_int flags)
1015 {
1016     int type;
1017
1018     if (gas == NULL || !ACPI_VALID_ADDRESS(gas->Address) || gas->BitWidth < 8)
1019         return (NULL);
1020
1021     switch (gas->SpaceId) {
1022     case ACPI_ADR_SPACE_SYSTEM_MEMORY:
1023         type = SYS_RES_MEMORY;
1024         break;
1025     case ACPI_ADR_SPACE_SYSTEM_IO:
1026         type = SYS_RES_IOPORT;
1027         break;
1028     default:
1029         return (NULL);
1030     }
1031
1032     bus_set_resource(dev, type, *rid, gas->Address, gas->BitWidth / 8);
1033     return (bus_alloc_resource_any(dev, type, rid, RF_ACTIVE | flags));
1034 }
1035
1036 /*
1037  * Handle ISA-like devices probing for a PnP ID to match.
1038  */
1039 #define PNP_EISAID(s)                           \
1040         ((((s[0] - '@') & 0x1f) << 2)           \
1041          | (((s[1] - '@') & 0x18) >> 3)         \
1042          | (((s[1] - '@') & 0x07) << 13)        \
1043          | (((s[2] - '@') & 0x1f) << 8)         \
1044          | (PNP_HEXTONUM(s[4]) << 16)           \
1045          | (PNP_HEXTONUM(s[3]) << 20)           \
1046          | (PNP_HEXTONUM(s[6]) << 24)           \
1047          | (PNP_HEXTONUM(s[5]) << 28))
1048
1049 static uint32_t
1050 acpi_isa_get_logicalid(device_t dev)
1051 {
1052     ACPI_DEVICE_INFO    *devinfo;
1053     ACPI_BUFFER         buf;
1054     ACPI_HANDLE         h;
1055     ACPI_STATUS         error;
1056     u_int32_t           pnpid;
1057     ACPI_LOCK_DECL;
1058
1059     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
1060
1061     pnpid = 0;
1062     buf.Pointer = NULL;
1063     buf.Length = ACPI_ALLOCATE_BUFFER;
1064
1065     ACPI_LOCK;
1066     
1067     /* Fetch and validate the HID. */
1068     if ((h = acpi_get_handle(dev)) == NULL)
1069         goto out;
1070     error = AcpiGetObjectInfo(h, &buf);
1071     if (ACPI_FAILURE(error))
1072         goto out;
1073     devinfo = (ACPI_DEVICE_INFO *)buf.Pointer;
1074
1075     if ((devinfo->Valid & ACPI_VALID_HID) != 0)
1076         pnpid = PNP_EISAID(devinfo->HardwareId.Value);
1077
1078 out:
1079     if (buf.Pointer != NULL)
1080         AcpiOsFree(buf.Pointer);
1081     ACPI_UNLOCK;
1082     return_VALUE (pnpid);
1083 }
1084
1085 static int
1086 acpi_isa_get_compatid(device_t dev, uint32_t *cids, int count)
1087 {
1088     ACPI_DEVICE_INFO    *devinfo;
1089     ACPI_BUFFER         buf;
1090     ACPI_HANDLE         h;
1091     ACPI_STATUS         error;
1092     uint32_t            *pnpid;
1093     int                 valid, i;
1094     ACPI_LOCK_DECL;
1095
1096     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
1097
1098     pnpid = cids;
1099     valid = 0;
1100     buf.Pointer = NULL;
1101     buf.Length = ACPI_ALLOCATE_BUFFER;
1102
1103     ACPI_LOCK;
1104     
1105     /* Fetch and validate the CID */
1106     if ((h = acpi_get_handle(dev)) == NULL)
1107         goto out;
1108     error = AcpiGetObjectInfo(h, &buf);
1109     if (ACPI_FAILURE(error))
1110         goto out;
1111     devinfo = (ACPI_DEVICE_INFO *)buf.Pointer;
1112     if ((devinfo->Valid & ACPI_VALID_CID) == 0)
1113         goto out;
1114
1115     if (devinfo->CompatibilityId.Count < count)
1116         count = devinfo->CompatibilityId.Count;
1117     for (i = 0; i < count; i++) {
1118         if (strncmp(devinfo->CompatibilityId.Id[i].Value, "PNP", 3) != 0)
1119             continue;
1120         *pnpid++ = PNP_EISAID(devinfo->CompatibilityId.Id[i].Value);
1121         valid++;
1122     }
1123
1124 out:
1125     if (buf.Pointer != NULL)
1126         AcpiOsFree(buf.Pointer);
1127     ACPI_UNLOCK;
1128     return_VALUE (valid);
1129 }
1130
1131 static char *
1132 acpi_device_id_probe(device_t bus, device_t dev, char **ids) 
1133 {
1134     ACPI_HANDLE h;
1135     int i;
1136
1137     h = acpi_get_handle(dev);
1138     if (ids == NULL || h == NULL || acpi_get_type(dev) != ACPI_TYPE_DEVICE)
1139         return (NULL);
1140
1141     /* Try to match one of the array of IDs with a HID or CID. */
1142     for (i = 0; ids[i] != NULL; i++) {
1143         if (acpi_MatchHid(h, ids[i]))
1144             return (ids[i]);
1145     }
1146     return (NULL);
1147 }
1148
1149 static int
1150 acpi_isa_pnp_probe(device_t bus, device_t child, struct isa_pnp_id *ids)
1151 {
1152     int                 result, cid_count, i;
1153     uint32_t            lid, cids[8];
1154
1155     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
1156
1157     /*
1158      * ISA-style drivers attached to ACPI may persist and
1159      * probe manually if we return ENOENT.  We never want
1160      * that to happen, so don't ever return it.
1161      */
1162     result = ENXIO;
1163
1164     /* Scan the supplied IDs for a match */
1165     lid = acpi_isa_get_logicalid(child);
1166     cid_count = acpi_isa_get_compatid(child, cids, 8);
1167     while (ids && ids->ip_id) {
1168         if (lid == ids->ip_id) {
1169             result = 0;
1170             goto out;
1171         }
1172         for (i = 0; i < cid_count; i++) {
1173             if (cids[i] == ids->ip_id) {
1174                 result = 0;
1175                 goto out;
1176             }
1177         }
1178         ids++;
1179     }
1180
1181  out:
1182     return_VALUE (result);
1183 }
1184
1185 /*
1186  * Scan relevant portions of the ACPI namespace and attach child devices.
1187  *
1188  * Note that we only expect to find devices in the \_PR_, \_TZ_, \_SI_ and
1189  * \_SB_ scopes, and \_PR_ and \_TZ_ become obsolete in the ACPI 2.0 spec.
1190  */
1191 static void
1192 acpi_probe_children(device_t bus)
1193 {
1194     ACPI_HANDLE parent;
1195     ACPI_STATUS status;
1196     int         i;
1197     static char *scopes[] = {"\\_PR_", "\\_TZ_", "\\_SI", "\\_SB_", NULL};
1198
1199     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
1200     ACPI_ASSERTLOCK;
1201
1202     /*
1203      * Scan the namespace and insert placeholders for all the devices that
1204      * we find.  We also probe/attach any early devices.
1205      *
1206      * Note that we use AcpiWalkNamespace rather than AcpiGetDevices because
1207      * we want to create nodes for all devices, not just those that are
1208      * currently present. (This assumes that we don't want to create/remove
1209      * devices as they appear, which might be smarter.)
1210      */
1211     ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "namespace scan\n"));
1212     for (i = 0; scopes[i] != NULL; i++) {
1213         status = AcpiGetHandle(ACPI_ROOT_OBJECT, scopes[i], &parent);
1214         if (ACPI_SUCCESS(status)) {
1215             AcpiWalkNamespace(ACPI_TYPE_ANY, parent, 100, acpi_probe_child,
1216                               bus, NULL);
1217         }
1218     }
1219
1220     /* Create any static children by calling device identify methods. */
1221     ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "device identify routines\n"));
1222     bus_generic_probe(bus);
1223
1224     /*
1225      * Scan all of the child devices we have created and let them probe/attach.
1226      */
1227     ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "first bus_generic_attach\n"));
1228     bus_generic_attach(bus);
1229
1230     /*
1231      * Some of these children may have attached others as part of their attach
1232      * process (eg. the root PCI bus driver), so rescan.
1233      */
1234     ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "second bus_generic_attach\n"));
1235     bus_generic_attach(bus);
1236
1237     /* Attach wake sysctls. */
1238     acpi_wake_sysctl_walk(bus);
1239
1240     ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "done attaching children\n"));
1241     return_VOID;
1242 }
1243
1244 static int
1245 acpi_probe_order(ACPI_HANDLE handle, int level, int *order)
1246 {
1247     int ret;
1248
1249     ret = 0;
1250     /* IO port and memory system resource holders are first. */
1251     if (acpi_MatchHid(handle, "PNP0C01") || acpi_MatchHid(handle, "PNP0C02")) {
1252         *order = 1;
1253         ret = 1;
1254     }
1255
1256     /* The embedded controller is needed to handle accesses early. */
1257     if (acpi_MatchHid(handle, "PNP0C09")) {
1258         *order = 2;
1259         ret = 1;
1260     }
1261
1262     *order = (level + 1) * 10;
1263     return (ret);
1264 }
1265
1266 /*
1267  * Evaluate a child device and determine whether we might attach a device to
1268  * it.
1269  */
1270 static ACPI_STATUS
1271 acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status)
1272 {
1273     ACPI_OBJECT_TYPE    type;
1274     device_t            child, bus;
1275     int                 order, probe_now;
1276
1277     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
1278
1279     /* Skip this device if we think we'll have trouble with it. */
1280     if (acpi_avoid(handle)) {
1281         ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "not scanning '%s'\n",
1282                          acpi_name(handle)));
1283         return_ACPI_STATUS (AE_OK);
1284     }
1285
1286     bus = (device_t)context;
1287     if (ACPI_SUCCESS(AcpiGetType(handle, &type))) {
1288         switch(type) {
1289         case ACPI_TYPE_DEVICE:
1290         case ACPI_TYPE_PROCESSOR:
1291         case ACPI_TYPE_THERMAL:
1292         case ACPI_TYPE_POWER:
1293             if (acpi_disabled("children"))
1294                 break;
1295
1296             /* 
1297              * Create a placeholder device for this node.  Sort the placeholder
1298              * so that the probe/attach passes will run breadth-first.
1299              */
1300             ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "scanning '%s'\n",
1301                              acpi_name(handle)));
1302             probe_now = acpi_probe_order(handle, level, &order);
1303             child = BUS_ADD_CHILD(bus, bus, order, NULL, -1);
1304             if (child == NULL)
1305                 break;
1306
1307             /* Associate the handle with the device_t and vice versa. */
1308             acpi_set_handle(child, handle);
1309             AcpiAttachData(handle, acpi_fake_objhandler, child);
1310
1311             /* Check if the device can generate wake events. */
1312             if (ACPI_SUCCESS(AcpiEvaluateObject(handle, "_PRW", NULL, NULL)))
1313                 device_set_flags(child, ACPI_FLAG_WAKE_CAPABLE);
1314
1315             /*
1316              * Check that the device is present.  If it's not present,
1317              * leave it disabled (so that we have a device_t attached to
1318              * the handle, but we don't probe it).
1319              */
1320             if (type == ACPI_TYPE_DEVICE && !acpi_DeviceIsPresent(child)) {
1321                 device_disable(child);
1322                 break;
1323             }
1324
1325             /*
1326              * Get the device's resource settings and attach them.
1327              * Note that if the device has _PRS but no _CRS, we need
1328              * to decide when it's appropriate to try to configure the
1329              * device.  Ignore the return value here; it's OK for the
1330              * device not to have any resources.
1331              */
1332             acpi_parse_resources(child, handle, &acpi_res_parse_set, NULL);
1333
1334             /* If order was overridden, probe/attach now rather than later. */
1335             if (probe_now)
1336                 device_probe_and_attach(child);
1337             break;
1338         }
1339     }
1340
1341     return_ACPI_STATUS (AE_OK);
1342 }
1343
1344 static void
1345 acpi_shutdown_pre_sync(void *arg, int howto)
1346 {
1347     struct acpi_softc *sc = arg;
1348
1349     ACPI_ASSERTLOCK;
1350
1351     /*
1352      * Disable all ACPI events before soft off, otherwise the system
1353      * will be turned on again on some laptops.
1354      *
1355      * XXX this should probably be restricted to masking some events just
1356      *     before powering down, since we may still need ACPI during the
1357      *     shutdown process.
1358      */
1359     if (sc->acpi_disable_on_poweroff)
1360         acpi_Disable(sc);
1361 }
1362
1363 /*
1364  * AcpiAttachData() requires an object handler but never uses it.  This is a
1365  * placeholder object handler so we can store a device_t in an ACPI_HANDLE.
1366  */
1367 void
1368 acpi_fake_objhandler(ACPI_HANDLE h, UINT32 fn, void *data)
1369 {
1370 }
1371
1372 static void
1373 acpi_shutdown_final(void *arg, int howto)
1374 {
1375     ACPI_STATUS status;
1376     ACPI_ASSERTLOCK;
1377
1378     /*
1379      * If powering off, run the actual shutdown code on each processor.
1380      * It will only perform the shutdown on the BSP.  Some chipsets do
1381      * not power off the system correctly if called from an AP.
1382      */
1383     if ((howto & RB_POWEROFF) != 0) {
1384         status = AcpiEnterSleepStatePrep(ACPI_STATE_S5);
1385         if (ACPI_FAILURE(status)) {
1386             kprintf("AcpiEnterSleepStatePrep failed - %s\n",
1387                    AcpiFormatException(status));
1388             return;
1389         }
1390         kprintf("Powering system off using ACPI\n");
1391         acpi_shutdown_poweroff(NULL);
1392     } else {
1393         kprintf("Shutting down ACPI\n");
1394         AcpiTerminate();
1395     }
1396 }
1397
1398 /*
1399  * Since this function may be called with locks held or in an unknown
1400  * context, it cannot allocate memory, acquire locks, sleep, etc.
1401  */
1402 static void
1403 acpi_shutdown_poweroff(void *arg)
1404 {
1405     ACPI_STATUS status;
1406
1407     ACPI_ASSERTLOCK;
1408
1409     /* Only attempt to power off if this is the BSP (cpuid 0). */
1410     if (mdcpu->mi.gd_cpuid != 0)
1411         return;
1412
1413     ACPI_DISABLE_IRQS();
1414     status = AcpiEnterSleepState(ACPI_STATE_S5);
1415     if (ACPI_FAILURE(status)) {
1416         kprintf("ACPI power-off failed - %s\n", AcpiFormatException(status));
1417     } else {
1418         DELAY(1000000);
1419         kprintf("ACPI power-off failed - timeout\n");
1420     }
1421 }
1422
1423 static void
1424 acpi_enable_fixed_events(struct acpi_softc *sc)
1425 {
1426     static int  first_time = 1;
1427
1428     ACPI_ASSERTLOCK;
1429
1430     /* Enable and clear fixed events and install handlers. */
1431     if ((AcpiGbl_FADT.Flags & ACPI_FADT_POWER_BUTTON) == 0) {
1432         AcpiClearEvent(ACPI_EVENT_POWER_BUTTON);
1433         AcpiInstallFixedEventHandler(ACPI_EVENT_POWER_BUTTON,
1434                                      acpi_event_power_button_sleep, sc);
1435         if (first_time)
1436             device_printf(sc->acpi_dev, "Power Button (fixed)\n");
1437     }
1438     if ((AcpiGbl_FADT.Flags & ACPI_FADT_SLEEP_BUTTON) == 0) {
1439         AcpiClearEvent(ACPI_EVENT_SLEEP_BUTTON);
1440         AcpiInstallFixedEventHandler(ACPI_EVENT_SLEEP_BUTTON,
1441                                      acpi_event_sleep_button_sleep, sc);
1442         if (first_time)
1443             device_printf(sc->acpi_dev, "Sleep Button (fixed)\n");
1444     }
1445
1446     first_time = 0;
1447 }
1448
1449 /*
1450  * Returns true if the device is actually present and should
1451  * be attached to.  This requires the present, enabled, UI-visible 
1452  * and diagnostics-passed bits to be set.
1453  */
1454 BOOLEAN
1455 acpi_DeviceIsPresent(device_t dev)
1456 {
1457     ACPI_DEVICE_INFO    *devinfo;
1458     ACPI_HANDLE         h;
1459     ACPI_BUFFER         buf;
1460     ACPI_STATUS         error;
1461     int                 ret;
1462
1463     ACPI_ASSERTLOCK;
1464     
1465     ret = FALSE;
1466     if ((h = acpi_get_handle(dev)) == NULL)
1467         return (FALSE);
1468     buf.Pointer = NULL;
1469     buf.Length = ACPI_ALLOCATE_BUFFER;
1470     error = AcpiGetObjectInfo(h, &buf);
1471     if (ACPI_FAILURE(error))
1472         return (FALSE);
1473     devinfo = (ACPI_DEVICE_INFO *)buf.Pointer;
1474
1475     /* If no _STA method, must be present */
1476     if ((devinfo->Valid & ACPI_VALID_STA) == 0)
1477         ret = TRUE;
1478
1479     /* Return true for 'present' and 'functioning' */
1480     if ((devinfo->CurrentStatus & 0x9) == 0x9)
1481         ret = TRUE;
1482
1483     AcpiOsFree(buf.Pointer);
1484     return (ret);
1485 }
1486
1487 /*
1488  * Returns true if the battery is actually present and inserted.
1489  */
1490 BOOLEAN
1491 acpi_BatteryIsPresent(device_t dev)
1492 {
1493     ACPI_DEVICE_INFO    *devinfo;
1494     ACPI_HANDLE         h;
1495     ACPI_BUFFER         buf;
1496     ACPI_STATUS         error;
1497     int                 ret;
1498
1499     ACPI_ASSERTLOCK;
1500     
1501     ret = FALSE;
1502     if ((h = acpi_get_handle(dev)) == NULL)
1503         return (FALSE);
1504     buf.Pointer = NULL;
1505     buf.Length = ACPI_ALLOCATE_BUFFER;
1506     error = AcpiGetObjectInfo(h, &buf);
1507     if (ACPI_FAILURE(error))
1508         return (FALSE);
1509     devinfo = (ACPI_DEVICE_INFO *)buf.Pointer;
1510
1511     /* If no _STA method, must be present */
1512     if ((devinfo->Valid & ACPI_VALID_STA) == 0)
1513         ret = TRUE;
1514
1515     /* Return true for 'present' and 'functioning' */
1516     if ((devinfo->CurrentStatus & 0x19) == 0x19)
1517         ret = TRUE;
1518
1519     AcpiOsFree(buf.Pointer);
1520     return (ret);
1521 }
1522
1523 /*
1524  * Match a HID string against a handle
1525  */
1526 BOOLEAN
1527 acpi_MatchHid(ACPI_HANDLE h, char *hid) 
1528 {
1529     ACPI_DEVICE_INFO    *devinfo;
1530     ACPI_BUFFER         buf;
1531     ACPI_STATUS         error;
1532     int                 ret, i;
1533
1534     ACPI_ASSERTLOCK;
1535
1536     ret = FALSE;
1537     if (hid == NULL || h == NULL)
1538         return (ret);
1539     buf.Pointer = NULL;
1540     buf.Length = ACPI_ALLOCATE_BUFFER;
1541     error = AcpiGetObjectInfo(h, &buf);
1542     if (ACPI_FAILURE(error))
1543         return (ret);
1544     devinfo = (ACPI_DEVICE_INFO *)buf.Pointer;
1545
1546     if ((devinfo->Valid & ACPI_VALID_HID) != 0 &&
1547         strcmp(hid, devinfo->HardwareId.Value) == 0)
1548             ret = TRUE;
1549     else if ((devinfo->Valid & ACPI_VALID_CID) != 0) {
1550         for (i = 0; i < devinfo->CompatibilityId.Count; i++) {
1551             if (strcmp(hid, devinfo->CompatibilityId.Id[i].Value) == 0) {
1552                 ret = TRUE;
1553                 break;
1554             }
1555         }
1556     }
1557
1558     AcpiOsFree(buf.Pointer);
1559     return (ret);
1560 }
1561
1562 /*
1563  * Return the handle of a named object within our scope, ie. that of (parent)
1564  * or one if its parents.
1565  */
1566 ACPI_STATUS
1567 acpi_GetHandleInScope(ACPI_HANDLE parent, char *path, ACPI_HANDLE *result)
1568 {
1569     ACPI_HANDLE         r;
1570     ACPI_STATUS         status;
1571
1572     ACPI_ASSERTLOCK;
1573
1574     /* Walk back up the tree to the root */
1575     for (;;) {
1576         status = AcpiGetHandle(parent, path, &r);
1577         if (ACPI_SUCCESS(status)) {
1578             *result = r;
1579             return (AE_OK);
1580         }
1581         if (status != AE_NOT_FOUND)
1582             return (AE_OK);
1583         if (ACPI_FAILURE(AcpiGetParent(parent, &r)))
1584             return (AE_NOT_FOUND);
1585         parent = r;
1586     }
1587 }
1588
1589 /* Find the difference between two PM tick counts. */
1590 uint32_t
1591 acpi_TimerDelta(uint32_t end, uint32_t start)
1592 {
1593     uint32_t delta;
1594
1595     if (end >= start)
1596         delta = end - start;
1597     else if ((AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) == 0)
1598         delta = ((0x00FFFFFF - start) + end + 1) & 0x00FFFFFF;
1599     else
1600         delta = ((0xFFFFFFFF - start) + end + 1);
1601     return (delta);
1602 }
1603
1604 /*
1605  * Allocate a buffer with a preset data size.
1606  */
1607 ACPI_BUFFER *
1608 acpi_AllocBuffer(int size)
1609 {
1610     ACPI_BUFFER *buf;
1611
1612     buf = kmalloc(size + sizeof(*buf), M_ACPIDEV, M_INTWAIT);
1613     buf->Length = size;
1614     buf->Pointer = (void *)(buf + 1);
1615     return (buf);
1616 }
1617
1618 ACPI_STATUS
1619 acpi_SetInteger(ACPI_HANDLE handle, char *path, UINT32 number)
1620 {
1621     ACPI_OBJECT arg1;
1622     ACPI_OBJECT_LIST args;
1623
1624     ACPI_ASSERTLOCK;
1625
1626     arg1.Type = ACPI_TYPE_INTEGER;
1627     arg1.Integer.Value = number;
1628     args.Count = 1;
1629     args.Pointer = &arg1;
1630
1631     return (AcpiEvaluateObject(handle, path, &args, NULL));
1632 }
1633
1634 /*
1635  * Evaluate a path that should return an integer.
1636  */
1637 ACPI_STATUS
1638 acpi_GetInteger(ACPI_HANDLE handle, char *path, UINT32 *number)
1639 {
1640     ACPI_STATUS status;
1641     ACPI_BUFFER buf;
1642     ACPI_OBJECT param;
1643
1644     ACPI_ASSERTLOCK;
1645
1646     if (handle == NULL)
1647         handle = ACPI_ROOT_OBJECT;
1648
1649     /*
1650      * Assume that what we've been pointed at is an Integer object, or
1651      * a method that will return an Integer.
1652      */
1653     buf.Pointer = &param;
1654     buf.Length = sizeof(param);
1655     status = AcpiEvaluateObject(handle, path, NULL, &buf);
1656     if (ACPI_SUCCESS(status)) {
1657         if (param.Type == ACPI_TYPE_INTEGER)
1658             *number = param.Integer.Value;
1659         else
1660             status = AE_TYPE;
1661     }
1662
1663     /* 
1664      * In some applications, a method that's expected to return an Integer
1665      * may instead return a Buffer (probably to simplify some internal
1666      * arithmetic).  We'll try to fetch whatever it is, and if it's a Buffer,
1667      * convert it into an Integer as best we can.
1668      *
1669      * This is a hack.
1670      */
1671     if (status == AE_BUFFER_OVERFLOW) {
1672         if ((buf.Pointer = AcpiOsAllocate(buf.Length)) == NULL) {
1673             status = AE_NO_MEMORY;
1674         } else {
1675             status = AcpiEvaluateObject(handle, path, NULL, &buf);
1676             if (ACPI_SUCCESS(status))
1677                 status = acpi_ConvertBufferToInteger(&buf, number);
1678             AcpiOsFree(buf.Pointer);
1679         }
1680     }
1681     return (status);
1682 }
1683
1684 ACPI_STATUS
1685 acpi_ConvertBufferToInteger(ACPI_BUFFER *bufp, UINT32 *number)
1686 {
1687     ACPI_OBJECT *p;
1688     UINT8       *val;
1689     int         i;
1690
1691     p = (ACPI_OBJECT *)bufp->Pointer;
1692     if (p->Type == ACPI_TYPE_INTEGER) {
1693         *number = p->Integer.Value;
1694         return (AE_OK);
1695     }
1696     if (p->Type != ACPI_TYPE_BUFFER)
1697         return (AE_TYPE);
1698     if (p->Buffer.Length > sizeof(int))
1699         return (AE_BAD_DATA);
1700
1701     *number = 0;
1702     val = p->Buffer.Pointer;
1703     for (i = 0; i < p->Buffer.Length; i++)
1704         *number += val[i] << (i * 8);
1705     return (AE_OK);
1706 }
1707
1708 /*
1709  * Iterate over the elements of an a package object, calling the supplied
1710  * function for each element.
1711  *
1712  * XXX possible enhancement might be to abort traversal on error.
1713  */
1714 ACPI_STATUS
1715 acpi_ForeachPackageObject(ACPI_OBJECT *pkg,
1716         void (*func)(ACPI_OBJECT *comp, void *arg), void *arg)
1717 {
1718     ACPI_OBJECT *comp;
1719     int         i;
1720     
1721     if (pkg == NULL || pkg->Type != ACPI_TYPE_PACKAGE)
1722         return (AE_BAD_PARAMETER);
1723
1724     /* Iterate over components */
1725     i = 0;
1726     comp = pkg->Package.Elements;
1727     for (; i < pkg->Package.Count; i++, comp++)
1728         func(comp, arg);
1729
1730     return (AE_OK);
1731 }
1732
1733 /*
1734  * Find the (index)th resource object in a set.
1735  */
1736 ACPI_STATUS
1737 acpi_FindIndexedResource(ACPI_BUFFER *buf, int index, ACPI_RESOURCE **resp)
1738 {
1739     ACPI_RESOURCE       *rp;
1740     int                 i;
1741
1742     rp = (ACPI_RESOURCE *)buf->Pointer;
1743     i = index;
1744     while (i-- > 0) {
1745         /* Range check */       
1746         if (rp > (ACPI_RESOURCE *)((u_int8_t *)buf->Pointer + buf->Length))
1747             return (AE_BAD_PARAMETER);
1748
1749         /* Check for terminator */
1750         if (rp->Type == ACPI_RESOURCE_TYPE_END_TAG || rp->Length == 0)
1751             return (AE_NOT_FOUND);
1752         rp = ACPI_NEXT_RESOURCE(rp);
1753     }
1754     if (resp != NULL)
1755         *resp = rp;
1756
1757     return (AE_OK);
1758 }
1759
1760 /*
1761  * Append an ACPI_RESOURCE to an ACPI_BUFFER.
1762  *
1763  * Given a pointer to an ACPI_RESOURCE structure, expand the ACPI_BUFFER
1764  * provided to contain it.  If the ACPI_BUFFER is empty, allocate a sensible
1765  * backing block.  If the ACPI_RESOURCE is NULL, return an empty set of
1766  * resources.
1767  */
1768 #define ACPI_INITIAL_RESOURCE_BUFFER_SIZE       512
1769
1770 ACPI_STATUS
1771 acpi_AppendBufferResource(ACPI_BUFFER *buf, ACPI_RESOURCE *res)
1772 {
1773     ACPI_RESOURCE       *rp;
1774     void                *newp;
1775     
1776     /* Initialise the buffer if necessary. */
1777     if (buf->Pointer == NULL) {
1778         buf->Length = ACPI_INITIAL_RESOURCE_BUFFER_SIZE;
1779         if ((buf->Pointer = AcpiOsAllocate(buf->Length)) == NULL)
1780             return (AE_NO_MEMORY);
1781         rp = (ACPI_RESOURCE *)buf->Pointer;
1782         rp->Type = ACPI_RESOURCE_TYPE_END_TAG;
1783         rp->Length = 0;
1784     }
1785     if (res == NULL)
1786         return (AE_OK);
1787     
1788     /*
1789      * Scan the current buffer looking for the terminator.
1790      * This will either find the terminator or hit the end
1791      * of the buffer and return an error.
1792      */
1793     rp = (ACPI_RESOURCE *)buf->Pointer;
1794     for (;;) {
1795         /* Range check, don't go outside the buffer */
1796         if (rp >= (ACPI_RESOURCE *)((u_int8_t *)buf->Pointer + buf->Length))
1797             return (AE_BAD_PARAMETER);
1798         if (rp->Type == ACPI_RESOURCE_TYPE_END_TAG || rp->Length == 0)
1799             break;
1800         rp = ACPI_NEXT_RESOURCE(rp);
1801     }
1802
1803     /*
1804      * Check the size of the buffer and expand if required.
1805      *
1806      * Required size is:
1807      *  size of existing resources before terminator + 
1808      *  size of new resource and header +
1809      *  size of terminator.
1810      *
1811      * Note that this loop should really only run once, unless
1812      * for some reason we are stuffing a *really* huge resource.
1813      */
1814     while ((((u_int8_t *)rp - (u_int8_t *)buf->Pointer) + 
1815             res->Length + ACPI_RS_SIZE_NO_DATA +
1816             ACPI_RS_SIZE_MIN) >= buf->Length) {
1817         if ((newp = AcpiOsAllocate(buf->Length * 2)) == NULL)
1818             return (AE_NO_MEMORY);
1819         bcopy(buf->Pointer, newp, buf->Length);
1820         rp = (ACPI_RESOURCE *)((u_int8_t *)newp +
1821                                ((u_int8_t *)rp - (u_int8_t *)buf->Pointer));
1822         AcpiOsFree(buf->Pointer);
1823         buf->Pointer = newp;
1824         buf->Length += buf->Length;
1825     }
1826     
1827     /* Insert the new resource. */
1828     bcopy(res, rp, res->Length + ACPI_RS_SIZE_NO_DATA);
1829     
1830     /* And add the terminator. */
1831     rp = ACPI_NEXT_RESOURCE(rp);
1832     rp->Type = ACPI_RESOURCE_TYPE_END_TAG;
1833     rp->Length = 0;
1834
1835     return (AE_OK);
1836 }
1837
1838 /*
1839  * Set interrupt model.
1840  */
1841 ACPI_STATUS
1842 acpi_SetIntrModel(int model)
1843 {
1844     return (acpi_SetInteger(ACPI_ROOT_OBJECT, "_PIC", model));
1845 }
1846
1847 #define ACPI_MINIMUM_AWAKETIME  5
1848
1849 static void
1850 acpi_sleep_enable(void *arg)
1851 {
1852     ((struct acpi_softc *)arg)->acpi_sleep_disabled = 0;
1853 }
1854
1855 /*
1856  * Set the system sleep state
1857  *
1858  * Currently we support S1-S5 but S4 is only S4BIOS
1859  */
1860 ACPI_STATUS
1861 acpi_SetSleepState(struct acpi_softc *sc, int state)
1862 {
1863     ACPI_STATUS status = AE_OK;
1864     UINT8       TypeA;
1865     UINT8       TypeB;
1866
1867     ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, state);
1868     ACPI_ASSERTLOCK;
1869
1870     /* Avoid reentry if already attempting to suspend. */
1871     if (sc->acpi_sstate != ACPI_STATE_S0)
1872         return_ACPI_STATUS (AE_BAD_PARAMETER);
1873
1874     /* We recently woke up so don't suspend again for a while. */
1875     if (sc->acpi_sleep_disabled)
1876         return_ACPI_STATUS (AE_OK);
1877
1878     switch (state) {
1879     case ACPI_STATE_S1:
1880     case ACPI_STATE_S2:
1881     case ACPI_STATE_S3:
1882     case ACPI_STATE_S4:
1883         status = AcpiGetSleepTypeData((UINT8)state, &TypeA, &TypeB);
1884         if (status == AE_NOT_FOUND) {
1885             device_printf(sc->acpi_dev,
1886                           "Sleep state S%d not supported by BIOS\n", state);
1887             break;
1888         } else if (ACPI_FAILURE(status)) {
1889             device_printf(sc->acpi_dev, "AcpiGetSleepTypeData failed - %s\n",
1890                           AcpiFormatException(status));
1891             break;
1892         }
1893
1894         sc->acpi_sstate = state;
1895         sc->acpi_sleep_disabled = 1;
1896
1897         /* Disable all wake GPEs not appropriate for this state. */
1898         acpi_wake_limit_walk(state);
1899
1900         /* Inform all devices that we are going to sleep. */
1901         if (DEVICE_SUSPEND(root_bus) != 0) {
1902             /*
1903              * Re-wake the system.
1904              *
1905              * XXX note that a better two-pass approach with a 'veto' pass
1906              *     followed by a "real thing" pass would be better, but the
1907              *     current bus interface does not provide for this.
1908              */
1909             DEVICE_RESUME(root_bus);
1910             return_ACPI_STATUS (AE_ERROR);
1911         }
1912
1913         status = AcpiEnterSleepStatePrep(state);
1914         if (ACPI_FAILURE(status)) {
1915             device_printf(sc->acpi_dev, "AcpiEnterSleepStatePrep failed - %s\n",
1916                           AcpiFormatException(status));
1917             break;
1918         }
1919
1920         if (sc->acpi_sleep_delay > 0)
1921             DELAY(sc->acpi_sleep_delay * 1000000);
1922
1923         if (state != ACPI_STATE_S1) {
1924             acpi_sleep_machdep(sc, state);
1925 #if 0
1926             /* AcpiEnterSleepState() may be incomplete, unlock if locked. */
1927             AcpiOsReleaseLock(AcpiGbl_HardwareLock, 1);
1928 #endif
1929             /* Re-enable ACPI hardware on wakeup from sleep state 4. */
1930             if (state == ACPI_STATE_S4)
1931                 AcpiEnable();
1932         } else {
1933             status = AcpiEnterSleepState((UINT8)state);
1934             if (ACPI_FAILURE(status)) {
1935                 device_printf(sc->acpi_dev, "AcpiEnterSleepState failed - %s\n",
1936                               AcpiFormatException(status));
1937                 break;
1938             }
1939         }
1940         AcpiLeaveSleepState((UINT8)state);
1941         DEVICE_RESUME(root_bus);
1942         sc->acpi_sstate = ACPI_STATE_S0;
1943         acpi_enable_fixed_events(sc);
1944         break;
1945     case ACPI_STATE_S5:
1946         /*
1947          * Shut down cleanly and power off.  This will call us back through the
1948          * shutdown handlers.
1949          */
1950         shutdown_nice(RB_POWEROFF);
1951         break;
1952     case ACPI_STATE_S0:
1953     default:
1954         status = AE_BAD_PARAMETER;
1955         break;
1956     }
1957
1958     /* Disable a second sleep request for a short period */
1959     if (sc->acpi_sleep_disabled)
1960         callout_reset(&sc->acpi_sleep_timer, hz * ACPI_MINIMUM_AWAKETIME,
1961                       acpi_sleep_enable, sc);
1962
1963     return_ACPI_STATUS (status);
1964 }
1965
1966 /* Initialize a device's wake GPE. */
1967 int
1968 acpi_wake_init(device_t dev, int type)
1969 {
1970     struct acpi_prw_data prw;
1971
1972     /* Check that the device can wake the system. */
1973     if ((device_get_flags(dev) & ACPI_FLAG_WAKE_CAPABLE) == 0)
1974         return (ENXIO);
1975
1976     /* Evaluate _PRW to find the GPE. */
1977     if (acpi_parse_prw(acpi_get_handle(dev), &prw) != 0)
1978         return (ENXIO);
1979
1980     /* Set the requested type for the GPE (runtime, wake, or both). */
1981     if (ACPI_FAILURE(AcpiSetGpeType(prw.gpe_handle, prw.gpe_bit, type))) {
1982         device_printf(dev, "set GPE type failed\n");
1983         return (ENXIO);
1984     }
1985
1986     return (0);
1987 }
1988
1989 /* Enable or disable the device's wake GPE. */
1990 int
1991 acpi_wake_set_enable(device_t dev, int enable)
1992 {
1993     struct acpi_prw_data prw;
1994     ACPI_HANDLE handle;
1995     ACPI_STATUS status;
1996     int flags;
1997
1998     /* Make sure the device supports waking the system. */
1999     flags = device_get_flags(dev);
2000     handle = acpi_get_handle(dev);
2001     if ((flags & ACPI_FLAG_WAKE_CAPABLE) == 0 || handle == NULL)
2002         return (ENXIO);
2003
2004     /* Evaluate _PRW to find the GPE. */
2005     if (acpi_parse_prw(handle, &prw) != 0)
2006         return (ENXIO);
2007
2008     if (enable) {
2009         status = AcpiEnableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
2010         if (ACPI_FAILURE(status)) {
2011             device_printf(dev, "enable wake failed\n");
2012             return (ENXIO);
2013         }
2014         device_set_flags(dev, flags | ACPI_FLAG_WAKE_ENABLED);
2015     } else {
2016         status = AcpiDisableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
2017         if (ACPI_FAILURE(status)) {
2018             device_printf(dev, "disable wake failed\n");
2019             return (ENXIO);
2020         }
2021         device_set_flags(dev, flags & ~ACPI_FLAG_WAKE_ENABLED);
2022     }
2023
2024     return (0);
2025 }
2026
2027 /* Configure a device's GPE appropriately for the new sleep state. */
2028 int
2029 acpi_wake_sleep_prep(device_t dev, int sstate)
2030 {
2031     struct acpi_prw_data prw;
2032     ACPI_HANDLE handle;
2033     int flags;
2034
2035     /* Check that this is an ACPI device and get its GPE. */
2036     flags = device_get_flags(dev);
2037     handle = acpi_get_handle(dev);
2038     if ((flags & ACPI_FLAG_WAKE_CAPABLE) == 0 || handle == NULL)
2039         return (ENXIO);
2040
2041     /* Evaluate _PRW to find the GPE. */
2042     if (acpi_parse_prw(handle, &prw) != 0)
2043         return (ENXIO);
2044
2045     /*
2046      * TBD: All Power Resources referenced by elements 2 through N
2047      *      of the _PRW object are put into the ON state.
2048      */
2049
2050     /*
2051      * If the user requested that this device wake the system and the next
2052      * sleep state is valid for this GPE, enable it and the device's wake
2053      * capability.  The sleep state must be less than (i.e., higher power)
2054      * or equal to the value specified by _PRW.  Return early, leaving
2055      * the appropriate power resources enabled.
2056      */
2057     if ((flags & ACPI_FLAG_WAKE_ENABLED) != 0 &&
2058         sstate <= prw.lowest_wake) {
2059         if (bootverbose)
2060             device_printf(dev, "wake_prep enabled gpe %#x for state %d\n",
2061                 prw.gpe_bit, sstate);
2062         AcpiEnableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
2063         acpi_SetInteger(handle, "_PSW", 1);
2064         return (0);
2065     }
2066
2067     /*
2068      * If the device wake was disabled or this sleep state is too low for
2069      * this device, disable its wake capability and GPE.
2070      */
2071     AcpiDisableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
2072     acpi_SetInteger(handle, "_PSW", 0);
2073     if (bootverbose)
2074         device_printf(dev, "wake_prep disabled gpe %#x for state %d\n",
2075             prw.gpe_bit, sstate);
2076
2077     /*
2078      * TBD: All Power Resources referenced by elements 2 through N
2079      *      of the _PRW object are put into the OFF state.
2080      */
2081
2082     return (0);
2083 }
2084
2085 /* Re-enable GPEs after wake. */
2086 int
2087 acpi_wake_run_prep(device_t dev)
2088 {
2089     struct acpi_prw_data prw;
2090     ACPI_HANDLE handle;
2091     int flags;
2092
2093     /* Check that this is an ACPI device and get its GPE. */
2094     flags = device_get_flags(dev);
2095     handle = acpi_get_handle(dev);
2096     if ((flags & ACPI_FLAG_WAKE_CAPABLE) == 0 || handle == NULL)
2097         return (ENXIO);
2098
2099     /* Evaluate _PRW to find the GPE. */
2100     if (acpi_parse_prw(handle, &prw) != 0)
2101         return (ENXIO);
2102
2103     /*
2104      * TBD: Be sure all Power Resources referenced by elements 2 through N
2105      *      of the _PRW object are in the ON state.
2106      */
2107
2108     /* Disable wake capability and if the user requested, enable the GPE. */
2109     acpi_SetInteger(handle, "_PSW", 0);
2110     if ((flags & ACPI_FLAG_WAKE_ENABLED) != 0)
2111         AcpiEnableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
2112     return (0);
2113 }
2114
2115 static ACPI_STATUS
2116 acpi_wake_limit(ACPI_HANDLE h, UINT32 level, void *context, void **status)
2117 {
2118     struct acpi_prw_data prw;
2119     int *sstate;
2120
2121     /* It's ok not to have _PRW if the device can't wake the system. */
2122     if (acpi_parse_prw(h, &prw) != 0)
2123         return (AE_OK);
2124
2125     sstate = (int *)context;
2126     if (*sstate > prw.lowest_wake)
2127         AcpiDisableGpe(prw.gpe_handle, prw.gpe_bit, ACPI_NOT_ISR);
2128
2129     return (AE_OK);
2130 }
2131
2132 /* Walk all system devices, disabling them if necessary for sstate. */
2133 static int
2134 acpi_wake_limit_walk(int sstate)
2135 {
2136     ACPI_HANDLE sb_handle;
2137
2138     if (ACPI_SUCCESS(AcpiGetHandle(ACPI_ROOT_OBJECT, "\\_SB_", &sb_handle)))
2139         AcpiWalkNamespace(ACPI_TYPE_ANY, sb_handle, 100,
2140             acpi_wake_limit, &sstate, NULL);
2141     return (0);
2142 }
2143
2144 /* Walk the tree rooted at acpi0 to attach per-device wake sysctls. */
2145 static int
2146 acpi_wake_sysctl_walk(device_t dev)
2147 {
2148     int error, i, numdevs;
2149     device_t *devlist;
2150     device_t child;
2151
2152     error = device_get_children(dev, &devlist, &numdevs);
2153     if (error != 0 || numdevs == 0)
2154         return (error);
2155     for (i = 0; i < numdevs; i++) {
2156         child = devlist[i];
2157         if (!device_is_attached(child))
2158             continue;
2159         if (device_get_flags(child) & ACPI_FLAG_WAKE_CAPABLE) {
2160 #ifdef dfly_notyet
2161             SYSCTL_ADD_PROC(device_get_sysctl_ctx(child),
2162                 SYSCTL_CHILDREN(device_get_sysctl_tree(child)), OID_AUTO,
2163                 "wake", CTLTYPE_INT | CTLFLAG_RW, child, 0,
2164                 acpi_wake_set_sysctl, "I", "Device set to wake the system");
2165 #endif /* dfly_notyet */
2166         }
2167         acpi_wake_sysctl_walk(child);
2168     }
2169     kfree(devlist, M_TEMP);
2170
2171     return (0);
2172 }
2173
2174 #ifdef dfly_notyet
2175 /* Enable or disable wake from userland. */
2176 static int
2177 acpi_wake_set_sysctl(SYSCTL_HANDLER_ARGS)
2178 {
2179     int enable, error;
2180     device_t dev;
2181
2182     dev = (device_t)arg1;
2183     enable = (device_get_flags(dev) & ACPI_FLAG_WAKE_ENABLED) ? 1 : 0;
2184
2185     error = sysctl_handle_int(oidp, &enable, 0, req);
2186     if (error != 0 || req->newptr == NULL)
2187         return (error);
2188     if (enable != 0 && enable != 1)
2189         return (EINVAL);
2190
2191     return (acpi_wake_set_enable(dev, enable));
2192 }
2193 #endif /* dfly_notyet */
2194
2195 /* Parse a device's _PRW into a structure. */
2196 static int
2197 acpi_parse_prw(ACPI_HANDLE h, struct acpi_prw_data *prw)
2198 {
2199     ACPI_STATUS                 status;
2200     ACPI_BUFFER                 prw_buffer;
2201     ACPI_OBJECT                 *res, *res2;
2202     int error;
2203
2204     if (h == NULL || prw == NULL)
2205         return (EINVAL);
2206
2207     /*
2208      * The _PRW object (7.2.9) is only required for devices that have the
2209      * ability to wake the system from a sleeping state.
2210      */
2211     error = EINVAL;
2212     prw_buffer.Pointer = NULL;
2213     prw_buffer.Length = ACPI_ALLOCATE_BUFFER;
2214     status = AcpiEvaluateObject(h, "_PRW", NULL, &prw_buffer);
2215     if (ACPI_FAILURE(status))
2216         return (ENOENT);
2217     res = (ACPI_OBJECT *)prw_buffer.Pointer;
2218     if (res == NULL)
2219         return (ENOENT);
2220     if (!ACPI_PKG_VALID(res, 2))
2221         goto out;
2222
2223     /*
2224      * Element 1 of the _PRW object:
2225      * The lowest power system sleeping state that can be entered while still
2226      * providing wake functionality.  The sleeping state being entered must
2227      * be less than (i.e., higher power) or equal to this value.
2228      */
2229     if (acpi_PkgInt32(res, 1, &prw->lowest_wake) != 0)
2230         goto out;
2231
2232     /*
2233      * Element 0 of the _PRW object:
2234      */
2235     switch (res->Package.Elements[0].Type) {
2236     case ACPI_TYPE_INTEGER:
2237         /*
2238          * If the data type of this package element is numeric, then this
2239          * _PRW package element is the bit index in the GPEx_EN, in the
2240          * GPE blocks described in the FADT, of the enable bit that is
2241          * enabled for the wake event.
2242          */
2243         prw->gpe_handle = NULL;
2244         prw->gpe_bit = res->Package.Elements[0].Integer.Value;
2245         error = 0;
2246         break;
2247     case ACPI_TYPE_PACKAGE:
2248         /*
2249          * If the data type of this package element is a package, then this
2250          * _PRW package element is itself a package containing two
2251          * elements.  The first is an object reference to the GPE Block
2252          * device that contains the GPE that will be triggered by the wake
2253          * event.  The second element is numeric and it contains the bit
2254          * index in the GPEx_EN, in the GPE Block referenced by the
2255          * first element in the package, of the enable bit that is enabled for
2256          * the wake event.
2257          *
2258          * For example, if this field is a package then it is of the form:
2259          * Package() {\_SB.PCI0.ISA.GPE, 2}
2260          */
2261         res2 = &res->Package.Elements[0];
2262         if (!ACPI_PKG_VALID(res2, 2))
2263             goto out;
2264         prw->gpe_handle = acpi_GetReference(NULL, &res2->Package.Elements[0]);
2265         if (prw->gpe_handle == NULL)
2266             goto out;
2267         if (acpi_PkgInt32(res2, 1, &prw->gpe_bit) != 0)
2268             goto out;
2269         error = 0;
2270         break;
2271     default:
2272         goto out;
2273     }
2274
2275     /* XXX No power resource handling yet. */
2276     prw->power_res = NULL;
2277
2278 out:
2279     if (prw_buffer.Pointer != NULL)
2280         AcpiOsFree(prw_buffer.Pointer);
2281     return (error);
2282 }
2283
2284 /*
2285  * Enable/Disable ACPI
2286  */
2287 ACPI_STATUS
2288 acpi_Enable(struct acpi_softc *sc)
2289 {
2290     ACPI_STATUS status;
2291     u_int32_t   flags;
2292
2293     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
2294     ACPI_ASSERTLOCK;
2295
2296     flags = ACPI_NO_ADDRESS_SPACE_INIT | ACPI_NO_HARDWARE_INIT |
2297             ACPI_NO_DEVICE_INIT | ACPI_NO_OBJECT_INIT;
2298     if (!sc->acpi_enabled)
2299         status = AcpiEnableSubsystem(flags);
2300     else
2301         status = AE_OK;
2302
2303     if (status == AE_OK)
2304         sc->acpi_enabled = 1;
2305
2306     return_ACPI_STATUS (status);
2307 }
2308
2309 ACPI_STATUS
2310 acpi_Disable(struct acpi_softc *sc)
2311 {
2312     ACPI_STATUS status;
2313
2314     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
2315     ACPI_ASSERTLOCK;
2316
2317     if (sc->acpi_enabled)
2318         status = AcpiDisable();
2319     else
2320         status = AE_OK;
2321
2322     if (status == AE_OK)
2323         sc->acpi_enabled = 0;
2324
2325     return_ACPI_STATUS (status);
2326 }
2327
2328 /*
2329  * ACPI Event Handlers
2330  */
2331
2332 /* System Event Handlers (registered by EVENTHANDLER_REGISTER) */
2333
2334 static void
2335 acpi_system_eventhandler_sleep(void *arg, int state)
2336 {
2337     ACPI_LOCK_DECL;
2338     ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, state);
2339
2340     ACPI_LOCK;
2341     if (state >= ACPI_STATE_S0 && state <= ACPI_S_STATES_MAX)
2342         acpi_SetSleepState((struct acpi_softc *)arg, state);
2343     ACPI_UNLOCK;
2344     return_VOID;
2345 }
2346
2347 static void
2348 acpi_system_eventhandler_wakeup(void *arg, int state)
2349 {
2350     ACPI_LOCK_DECL;
2351     ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, state);
2352
2353     /* Well, what to do? :-) */
2354
2355     ACPI_LOCK;
2356     ACPI_UNLOCK;
2357
2358     return_VOID;
2359 }
2360
2361 /* 
2362  * ACPICA Event Handlers (FixedEvent, also called from button notify handler)
2363  */
2364 UINT32
2365 acpi_event_power_button_sleep(void *context)
2366 {
2367     struct acpi_softc   *sc = (struct acpi_softc *)context;
2368
2369     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
2370
2371     EVENTHANDLER_INVOKE(acpi_sleep_event, sc->acpi_power_button_sx);
2372
2373     return_VALUE (ACPI_INTERRUPT_HANDLED);
2374 }
2375
2376 UINT32
2377 acpi_event_power_button_wake(void *context)
2378 {
2379     struct acpi_softc   *sc = (struct acpi_softc *)context;
2380
2381     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
2382
2383     EVENTHANDLER_INVOKE(acpi_wakeup_event, sc->acpi_power_button_sx);
2384
2385     return_VALUE (ACPI_INTERRUPT_HANDLED);
2386 }
2387
2388 UINT32
2389 acpi_event_sleep_button_sleep(void *context)
2390 {
2391     struct acpi_softc   *sc = (struct acpi_softc *)context;
2392
2393     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
2394
2395     EVENTHANDLER_INVOKE(acpi_sleep_event, sc->acpi_sleep_button_sx);
2396
2397     return_VALUE (ACPI_INTERRUPT_HANDLED);
2398 }
2399
2400 UINT32
2401 acpi_event_sleep_button_wake(void *context)
2402 {
2403     struct acpi_softc   *sc = (struct acpi_softc *)context;
2404
2405     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
2406
2407     EVENTHANDLER_INVOKE(acpi_wakeup_event, sc->acpi_sleep_button_sx);
2408
2409     return_VALUE (ACPI_INTERRUPT_HANDLED);
2410 }
2411
2412 /*
2413  * XXX This is kinda ugly, and should not be here.
2414  */
2415 struct acpi_staticbuf {
2416     ACPI_BUFFER buffer;
2417     char        data[512];
2418 };
2419
2420 char *
2421 acpi_name(ACPI_HANDLE handle)
2422 {
2423     static struct acpi_staticbuf        buf;
2424
2425     ACPI_ASSERTLOCK;
2426
2427     buf.buffer.Length = 512;
2428     buf.buffer.Pointer = &buf.data[0];
2429
2430     if (ACPI_SUCCESS(AcpiGetName(handle, ACPI_FULL_PATHNAME, &buf.buffer)))
2431         return (buf.buffer.Pointer);
2432
2433     return ("(unknown path)");
2434 }
2435
2436 /*
2437  * Debugging/bug-avoidance.  Avoid trying to fetch info on various
2438  * parts of the namespace.
2439  */
2440 int
2441 acpi_avoid(ACPI_HANDLE handle)
2442 {
2443     char        *cp, *env, *np;
2444     int         len;
2445
2446     np = acpi_name(handle);
2447     if (*np == '\\')
2448         np++;
2449     if ((env = kgetenv("debug.acpi.avoid.paths")) == NULL &&
2450         (env = kgetenv("debug.acpi.avoid")) == NULL)
2451         return (0);
2452
2453     /* Scan the avoid list checking for a match */
2454     cp = env;
2455     for (;;) {
2456         while ((*cp != 0) && isspace(*cp))
2457             cp++;
2458         if (*cp == 0)
2459             break;
2460         len = 0;
2461         while ((cp[len] != 0) && !isspace(cp[len]))
2462             len++;
2463         if (!strncmp(cp, np, len)) {
2464             kfreeenv(env);
2465             return(1);
2466         }
2467         cp += len;
2468     }
2469     kfreeenv(env);
2470
2471     return (0);
2472 }
2473
2474 /*
2475  * Debugging/bug-avoidance.  Disable ACPI subsystem components.   Note that
2476  * some components may be disabled by default and can only be enabled
2477  * via acpi_enabled() (debug.acpi.enabled).
2478  */
2479 int
2480 acpi_disabled(char *subsys)
2481 {
2482     char        *cp, *env;
2483     int         len;
2484
2485     if ((env = kgetenv("debug.acpi.disabled")) == NULL)
2486         return (0);
2487     if (strcmp(env, "all") == 0) {
2488         kfreeenv(env);
2489         return (1);
2490     }
2491
2492     /* Scan the disable list, checking for a match. */
2493     cp = env;
2494     for (;;) {
2495         while (*cp != '\0' && isspace(*cp))
2496             cp++;
2497         if (*cp == '\0')
2498             break;
2499         len = 0;
2500         while (cp[len] != '\0' && !isspace(cp[len]))
2501             len++;
2502         if (strncmp(cp, subsys, len) == 0) {
2503             kfreeenv(env);
2504             return (1);
2505         }
2506         cp += len;
2507     }
2508     kfreeenv(env);
2509
2510     return (0);
2511 }
2512
2513 /*
2514  * Debugging/bug-avoidance.  Enable ACPI subsystem components.  Most 
2515  * components are enabled by default.  The ones that are not have to be 
2516  * enabled via debug.acpi.enabled.
2517  */
2518 int
2519 acpi_enabled(char *subsys)
2520 {
2521     char        *cp, *env;
2522     int         len;
2523
2524     if ((env = kgetenv("debug.acpi.enabled")) == NULL)
2525         return (0);
2526     if (strcmp(env, "all") == 0) {
2527         kfreeenv(env);
2528         return (1);
2529     }
2530
2531     /* Scan the enable list, checking for a match. */
2532     cp = env;
2533     for (;;) {
2534         while (*cp != '\0' && isspace(*cp))
2535             cp++;
2536         if (*cp == '\0')
2537             break;
2538         len = 0;
2539         while (cp[len] != '\0' && !isspace(cp[len]))
2540             len++;
2541         if (strncmp(cp, subsys, len) == 0) {
2542             kfreeenv(env);
2543             return (1);
2544         }
2545         cp += len;
2546     }
2547     kfreeenv(env);
2548
2549     return (0);
2550 }
2551
2552 /*
2553  * Control interface.
2554  *
2555  * We multiplex ioctls for all participating ACPI devices here.  Individual 
2556  * drivers wanting to be accessible via /dev/acpi should use the
2557  * register/deregister interface to make their handlers visible.
2558  */
2559 struct acpi_ioctl_hook
2560 {
2561     TAILQ_ENTRY(acpi_ioctl_hook) link;
2562     u_long                       cmd;
2563     acpi_ioctl_fn                fn;
2564     void                         *arg;
2565 };
2566
2567 static TAILQ_HEAD(,acpi_ioctl_hook)     acpi_ioctl_hooks;
2568 static int                              acpi_ioctl_hooks_initted;
2569
2570 /*
2571  * Register an ioctl handler.
2572  */
2573 int
2574 acpi_register_ioctl(u_long cmd, acpi_ioctl_fn fn, void *arg)
2575 {
2576     struct acpi_ioctl_hook      *hp;
2577
2578     hp = kmalloc(sizeof(*hp), M_ACPIDEV, M_INTWAIT);
2579     hp->cmd = cmd;
2580     hp->fn = fn;
2581     hp->arg = arg;
2582     if (acpi_ioctl_hooks_initted == 0) {
2583         TAILQ_INIT(&acpi_ioctl_hooks);
2584         acpi_ioctl_hooks_initted = 1;
2585     }
2586     TAILQ_INSERT_TAIL(&acpi_ioctl_hooks, hp, link);
2587     return (0);
2588 }
2589
2590 /*
2591  * Deregister an ioctl handler.
2592  */
2593 void    
2594 acpi_deregister_ioctl(u_long cmd, acpi_ioctl_fn fn)
2595 {
2596     struct acpi_ioctl_hook      *hp;
2597
2598     TAILQ_FOREACH(hp, &acpi_ioctl_hooks, link)
2599         if ((hp->cmd == cmd) && (hp->fn == fn))
2600             break;
2601
2602     if (hp != NULL) {
2603         TAILQ_REMOVE(&acpi_ioctl_hooks, hp, link);
2604         kfree(hp, M_ACPIDEV);
2605     }
2606 }
2607
2608 static int
2609 acpiopen(struct dev_open_args *ap)
2610 {
2611     return (0);
2612 }
2613
2614 static int
2615 acpiclose(struct dev_close_args *ap)
2616 {
2617     return (0);
2618 }
2619
2620 static int
2621 acpiioctl(struct dev_ioctl_args *ap)
2622 {
2623     struct acpi_softc           *sc;
2624     struct acpi_ioctl_hook      *hp;
2625     int                         error, xerror, state;
2626     ACPI_LOCK_DECL;
2627
2628     ACPI_LOCK;
2629
2630     error = state = 0;
2631     sc = ap->a_head.a_dev->si_drv1;
2632
2633     /*
2634      * Scan the list of registered ioctls, looking for handlers.
2635      */
2636     if (acpi_ioctl_hooks_initted) {
2637         TAILQ_FOREACH(hp, &acpi_ioctl_hooks, link) {
2638             if (hp->cmd == ap->a_cmd) {
2639                 xerror = hp->fn(ap->a_cmd, ap->a_data, hp->arg);
2640                 if (xerror != 0)
2641                     error = xerror;
2642                 goto out;
2643             }
2644         }
2645     }
2646
2647     /*
2648      * Core ioctls are not permitted for non-writable user.
2649      * Currently, other ioctls just fetch information.
2650      * Not changing system behavior.
2651      */
2652     if((ap->a_fflag & FWRITE) == 0) {
2653         error = EPERM;
2654         goto out;
2655     }
2656
2657     /* Core system ioctls. */
2658     switch (ap->a_cmd) {
2659     case ACPIIO_ENABLE:
2660         if (ACPI_FAILURE(acpi_Enable(sc)))
2661             error = ENXIO;
2662         break;
2663     case ACPIIO_DISABLE:
2664         if (ACPI_FAILURE(acpi_Disable(sc)))
2665             error = ENXIO;
2666         break;
2667     case ACPIIO_SETSLPSTATE:
2668         if (!sc->acpi_enabled) {
2669             error = ENXIO;
2670             break;
2671         }
2672         state = *(int *)ap->a_data;
2673         if (state >= ACPI_STATE_S0  && state <= ACPI_S_STATES_MAX) {
2674             if (ACPI_FAILURE(acpi_SetSleepState(sc, state)))
2675                 error = EINVAL;
2676         } else {
2677             error = EINVAL;
2678         }
2679         break;
2680     default:
2681         if (error == 0)
2682             error = EINVAL;
2683         break;
2684     }
2685
2686 out:
2687     ACPI_UNLOCK;
2688     return (error);
2689 }
2690
2691 static int
2692 acpi_supported_sleep_state_sysctl(SYSCTL_HANDLER_ARGS)
2693 {
2694     char sleep_state[4];
2695     char buf[16];
2696     int error;
2697     UINT8 state, TypeA, TypeB;
2698
2699     buf[0] = '\0';
2700     for (state = ACPI_STATE_S1; state < ACPI_S_STATES_MAX + 1; state++) {
2701         if (ACPI_SUCCESS(AcpiGetSleepTypeData(state, &TypeA, &TypeB))) {
2702             ksprintf(sleep_state, "S%d ", state);
2703             strcat(buf, sleep_state);
2704         }
2705     }
2706     error = sysctl_handle_string(oidp, buf, sizeof(buf), req);
2707     return (error);
2708 }
2709
2710 static int
2711 acpi_sleep_state_sysctl(SYSCTL_HANDLER_ARGS)
2712 {
2713     char sleep_state[10];
2714     int error;
2715     u_int new_state, old_state;
2716
2717     old_state = *(u_int *)oidp->oid_arg1;
2718     if (old_state > ACPI_S_STATES_MAX + 1) {
2719         strcpy(sleep_state, "unknown");
2720     } else {
2721         bzero(sleep_state, sizeof(sleep_state));
2722         strncpy(sleep_state, sleep_state_names[old_state],
2723                 sizeof(sleep_state_names[old_state]));
2724     }
2725     error = sysctl_handle_string(oidp, sleep_state, sizeof(sleep_state), req);
2726     if (error == 0 && req->newptr != NULL) {
2727         new_state = ACPI_STATE_S0;
2728         for (; new_state <= ACPI_S_STATES_MAX + 1; new_state++) {
2729             if (strncmp(sleep_state, sleep_state_names[new_state],
2730                         sizeof(sleep_state)) == 0)
2731                 break;
2732         }
2733         if (new_state <= ACPI_S_STATES_MAX + 1) {
2734             if (new_state != old_state)
2735                 *(u_int *)oidp->oid_arg1 = new_state;
2736         } else {
2737             error = EINVAL;
2738         }
2739     }
2740
2741     return (error);
2742 }
2743
2744 /* Inform devctl(4) when we receive a Notify. */
2745 void
2746 acpi_UserNotify(const char *subsystem, ACPI_HANDLE h, uint8_t notify)
2747 {
2748     char                notify_buf[16];
2749     ACPI_BUFFER         handle_buf;
2750     ACPI_STATUS         status;
2751
2752     if (subsystem == NULL)
2753         return;
2754
2755     handle_buf.Pointer = NULL;
2756     handle_buf.Length = ACPI_ALLOCATE_BUFFER;
2757     status = AcpiNsHandleToPathname(h, &handle_buf);
2758     if (ACPI_FAILURE(status))
2759         return;
2760     ksnprintf(notify_buf, sizeof(notify_buf), "notify=0x%02x", notify);
2761     devctl_notify("ACPI", subsystem, handle_buf.Pointer, notify_buf);
2762     AcpiOsFree(handle_buf.Pointer);
2763 }
2764
2765 #ifdef ACPI_DEBUG
2766 /*
2767  * Support for parsing debug options from the kernel environment.
2768  *
2769  * Bits may be set in the AcpiDbgLayer and AcpiDbgLevel debug registers
2770  * by specifying the names of the bits in the debug.acpi.layer and
2771  * debug.acpi.level environment variables.  Bits may be unset by 
2772  * prefixing the bit name with !.
2773  */
2774 struct debugtag
2775 {
2776     char        *name;
2777     UINT32      value;
2778 };
2779
2780 static struct debugtag  dbg_layer[] = {
2781     {"ACPI_UTILITIES",          ACPI_UTILITIES},
2782     {"ACPI_HARDWARE",           ACPI_HARDWARE},
2783     {"ACPI_EVENTS",             ACPI_EVENTS},
2784     {"ACPI_TABLES",             ACPI_TABLES},
2785     {"ACPI_NAMESPACE",          ACPI_NAMESPACE},
2786     {"ACPI_PARSER",             ACPI_PARSER},
2787     {"ACPI_DISPATCHER",         ACPI_DISPATCHER},
2788     {"ACPI_EXECUTER",           ACPI_EXECUTER},
2789     {"ACPI_RESOURCES",          ACPI_RESOURCES},
2790     {"ACPI_CA_DEBUGGER",        ACPI_CA_DEBUGGER},
2791     {"ACPI_OS_SERVICES",        ACPI_OS_SERVICES},
2792     {"ACPI_CA_DISASSEMBLER",    ACPI_CA_DISASSEMBLER},
2793     {"ACPI_ALL_COMPONENTS",     ACPI_ALL_COMPONENTS},
2794
2795     {"ACPI_AC_ADAPTER",         ACPI_AC_ADAPTER},
2796     {"ACPI_BATTERY",            ACPI_BATTERY},
2797     {"ACPI_BUS",                ACPI_BUS},
2798     {"ACPI_BUTTON",             ACPI_BUTTON},
2799     {"ACPI_EC",                 ACPI_EC},
2800     {"ACPI_FAN",                ACPI_FAN},
2801     {"ACPI_POWERRES",           ACPI_POWERRES},
2802     {"ACPI_PROCESSOR",          ACPI_PROCESSOR},
2803     {"ACPI_THERMAL",            ACPI_THERMAL},
2804     {"ACPI_TIMER",              ACPI_TIMER},
2805     {"ACPI_ALL_DRIVERS",        ACPI_ALL_DRIVERS},
2806     {NULL, 0}
2807 };
2808
2809 static struct debugtag dbg_level[] = {
2810     {"ACPI_LV_ERROR",           ACPI_LV_ERROR},
2811     {"ACPI_LV_WARN",            ACPI_LV_WARN},
2812     {"ACPI_LV_INIT",            ACPI_LV_INIT},
2813     {"ACPI_LV_DEBUG_OBJECT",    ACPI_LV_DEBUG_OBJECT},
2814     {"ACPI_LV_INFO",            ACPI_LV_INFO},
2815     {"ACPI_LV_ALL_EXCEPTIONS",  ACPI_LV_ALL_EXCEPTIONS},
2816
2817     /* Trace verbosity level 1 [Standard Trace Level] */
2818     {"ACPI_LV_INIT_NAMES",      ACPI_LV_INIT_NAMES},
2819     {"ACPI_LV_PARSE",           ACPI_LV_PARSE},
2820     {"ACPI_LV_LOAD",            ACPI_LV_LOAD},
2821     {"ACPI_LV_DISPATCH",        ACPI_LV_DISPATCH},
2822     {"ACPI_LV_EXEC",            ACPI_LV_EXEC},
2823     {"ACPI_LV_NAMES",           ACPI_LV_NAMES},
2824     {"ACPI_LV_OPREGION",        ACPI_LV_OPREGION},
2825     {"ACPI_LV_BFIELD",          ACPI_LV_BFIELD},
2826     {"ACPI_LV_TABLES",          ACPI_LV_TABLES},
2827     {"ACPI_LV_VALUES",          ACPI_LV_VALUES},
2828     {"ACPI_LV_OBJECTS",         ACPI_LV_OBJECTS},
2829     {"ACPI_LV_RESOURCES",       ACPI_LV_RESOURCES},
2830     {"ACPI_LV_USER_REQUESTS",   ACPI_LV_USER_REQUESTS},
2831     {"ACPI_LV_PACKAGE",         ACPI_LV_PACKAGE},
2832     {"ACPI_LV_VERBOSITY1",      ACPI_LV_VERBOSITY1},
2833
2834     /* Trace verbosity level 2 [Function tracing and memory allocation] */
2835     {"ACPI_LV_ALLOCATIONS",     ACPI_LV_ALLOCATIONS},
2836     {"ACPI_LV_FUNCTIONS",       ACPI_LV_FUNCTIONS},
2837     {"ACPI_LV_OPTIMIZATIONS",   ACPI_LV_OPTIMIZATIONS},
2838     {"ACPI_LV_VERBOSITY2",      ACPI_LV_VERBOSITY2},
2839     {"ACPI_LV_ALL",             ACPI_LV_ALL},
2840
2841     /* Trace verbosity level 3 [Threading, I/O, and Interrupts] */
2842     {"ACPI_LV_MUTEX",           ACPI_LV_MUTEX},
2843     {"ACPI_LV_THREADS",         ACPI_LV_THREADS},
2844     {"ACPI_LV_IO",              ACPI_LV_IO},
2845     {"ACPI_LV_INTERRUPTS",      ACPI_LV_INTERRUPTS},
2846     {"ACPI_LV_VERBOSITY3",      ACPI_LV_VERBOSITY3},
2847
2848     /* Exceptionally verbose output -- also used in the global "DebugLevel"  */
2849     {"ACPI_LV_AML_DISASSEMBLE", ACPI_LV_AML_DISASSEMBLE},
2850     {"ACPI_LV_VERBOSE_INFO",    ACPI_LV_VERBOSE_INFO},
2851     {"ACPI_LV_FULL_TABLES",     ACPI_LV_FULL_TABLES},
2852     {"ACPI_LV_EVENTS",          ACPI_LV_EVENTS},
2853     {"ACPI_LV_VERBOSE",         ACPI_LV_VERBOSE},
2854     {NULL, 0}
2855 };    
2856
2857 static void
2858 acpi_parse_debug(char *cp, struct debugtag *tag, UINT32 *flag)
2859 {
2860     char        *ep;
2861     int         i, l;
2862     int         set;
2863
2864     while (*cp) {
2865         if (isspace(*cp)) {
2866             cp++;
2867             continue;
2868         }
2869         ep = cp;
2870         while (*ep && !isspace(*ep))
2871             ep++;
2872         if (*cp == '!') {
2873             set = 0;
2874             cp++;
2875             if (cp == ep)
2876                 continue;
2877         } else {
2878             set = 1;
2879         }
2880         l = ep - cp;
2881         for (i = 0; tag[i].name != NULL; i++) {
2882             if (!strncmp(cp, tag[i].name, l)) {
2883                 if (set)
2884                     *flag |= tag[i].value;
2885                 else
2886                     *flag &= ~tag[i].value;
2887             }
2888         }
2889         cp = ep;
2890     }
2891 }
2892
2893 /*
2894  * Warning: also called in early boot, before any allocators
2895  * are working.
2896  */
2897 static void
2898 acpi_set_debugging(void *junk)
2899 {
2900     char *layer, *level;
2901
2902     if (cold) {
2903         AcpiDbgLayer = 0;
2904         AcpiDbgLevel = 0;
2905     }
2906
2907     layer = kgetenv("debug.acpi.layer");
2908     level = kgetenv("debug.acpi.level");
2909     if (layer == NULL && level == NULL)
2910         return;
2911
2912     kprintf("ACPI set debug");
2913     if (layer != NULL) {
2914         if (strcmp("NONE", layer) != 0)
2915             kprintf(" layer '%s'", layer);
2916         acpi_parse_debug(layer, &dbg_layer[0], &AcpiDbgLayer);
2917         kfreeenv(layer);
2918     }
2919     if (level != NULL) {
2920         if (strcmp("NONE", level) != 0)
2921             kprintf(" level '%s'", level);
2922         acpi_parse_debug(level, &dbg_level[0], &AcpiDbgLevel);
2923         kfreeenv(level);
2924     }
2925     kprintf("\n");
2926 }
2927 SYSINIT(acpi_debugging, SI_BOOT1_TUNABLES, SI_ORDER_ANY,
2928         acpi_set_debugging, NULL);
2929
2930 static int
2931 acpi_debug_sysctl(SYSCTL_HANDLER_ARGS)
2932 {
2933     int          error, *dbg;
2934     struct       debugtag *tag;
2935     struct       sbuf sb;
2936
2937     if (sbuf_new(&sb, NULL, 128, SBUF_AUTOEXTEND) == NULL)
2938         return (ENOMEM);
2939     if (strcmp(oidp->oid_arg1, "debug.acpi.layer") == 0) {
2940         tag = &dbg_layer[0];
2941         dbg = &AcpiDbgLayer;
2942     } else {
2943         tag = &dbg_level[0];
2944         dbg = &AcpiDbgLevel;
2945     }
2946
2947     /* Get old values if this is a get request. */
2948     if (*dbg == 0) {
2949         sbuf_cpy(&sb, "NONE");
2950     } else if (req->newptr == NULL) {
2951         for (; tag->name != NULL; tag++) {
2952             if ((*dbg & tag->value) == tag->value)
2953                 sbuf_printf(&sb, "%s ", tag->name);
2954         }
2955     }
2956     sbuf_trim(&sb);
2957     sbuf_finish(&sb);
2958
2959     /* Copy out the old values to the user. */
2960     error = SYSCTL_OUT(req, sbuf_data(&sb), sbuf_len(&sb));
2961     sbuf_delete(&sb);
2962
2963     /* If the user is setting a string, parse it. */
2964     if (error == 0 && req->newptr != NULL) {
2965         *dbg = 0;
2966         ksetenv(oidp->oid_arg1, req->newptr);
2967         acpi_set_debugging(NULL);
2968     }
2969
2970     return (error);
2971 }
2972 SYSCTL_PROC(_debug_acpi, OID_AUTO, layer, CTLFLAG_RW | CTLTYPE_STRING,
2973             "debug.acpi.layer", 0, acpi_debug_sysctl, "A", "");
2974 SYSCTL_PROC(_debug_acpi, OID_AUTO, level, CTLFLAG_RW | CTLTYPE_STRING,
2975             "debug.acpi.level", 0, acpi_debug_sysctl, "A", "");
2976 #endif
2977
2978 static int
2979 acpi_pm_func(u_long cmd, void *arg, ...)
2980 {
2981         int     state, acpi_state;
2982         int     error;
2983         struct  acpi_softc *sc;
2984         va_list ap;
2985
2986         error = 0;
2987         switch (cmd) {
2988         case POWER_CMD_SUSPEND:
2989                 sc = (struct acpi_softc *)arg;
2990                 if (sc == NULL) {
2991                         error = EINVAL;
2992                         goto out;
2993                 }
2994
2995                 va_start(ap, arg);
2996                 state = va_arg(ap, int);
2997                 va_end(ap);     
2998
2999                 switch (state) {
3000                 case POWER_SLEEP_STATE_STANDBY:
3001                         acpi_state = sc->acpi_standby_sx;
3002                         break;
3003                 case POWER_SLEEP_STATE_SUSPEND:
3004                         acpi_state = sc->acpi_suspend_sx;
3005                         break;
3006                 case POWER_SLEEP_STATE_HIBERNATE:
3007                         acpi_state = ACPI_STATE_S4;
3008                         break;
3009                 default:
3010                         error = EINVAL;
3011                         goto out;
3012                 }
3013
3014                 acpi_SetSleepState(sc, acpi_state);
3015                 break;
3016         default:
3017                 error = EINVAL;
3018                 goto out;
3019         }
3020
3021 out:
3022         return (error);
3023 }
3024
3025 static void
3026 acpi_pm_register(void *arg)
3027 {
3028     if (!cold || resource_disabled("acpi", 0))
3029         return;
3030
3031     power_pm_register(POWER_PM_TYPE_ACPI, acpi_pm_func, NULL);
3032 }
3033
3034 SYSINIT(power, SI_BOOT2_KLD, SI_ORDER_ANY, acpi_pm_register, 0);