Merge branch 'vendor/GCC50'
[dragonfly.git] / sys / dev / acpica / acpi.c
1 /*-
2  * Copyright (c) 2000 Takanori Watanabe <takawata@jp.kfreebsd.org>
3  * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@jp.kfreebsd.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.243.2.4.4.1 2009/04/15 03:14:26 kensmith Exp $
30  */
31
32 #include "opt_acpi.h"
33 #include <sys/param.h>
34 #include <sys/kernel.h>
35 #include <sys/proc.h>
36 #include <sys/fcntl.h>
37 #include <sys/malloc.h>
38 #include <sys/module.h>
39 #include <sys/bus.h>
40 #include <sys/conf.h>
41 #include <sys/reboot.h>
42 #include <sys/sysctl.h>
43 #include <sys/ctype.h>
44 #include <sys/linker.h>
45 #include <sys/power.h>
46 #include <sys/sbuf.h>
47 #include <sys/device.h>
48 #include <sys/spinlock.h>
49 #include <sys/spinlock2.h>
50 #include <sys/uuid.h>
51
52 #include <sys/rman.h>
53 #include <bus/isa/isavar.h>
54 #include <bus/isa/pnpvar.h>
55
56 #include "acpi.h"
57 #include <dev/acpica/acpivar.h>
58 #include <dev/acpica/acpiio.h>
59 #include "achware.h"
60 #include "acnamesp.h"
61 #include "acglobal.h"
62
63 #include "pci_if.h"
64 #include <bus/pci/pci_cfgreg.h>
65 #include <bus/pci/pcivar.h>
66 #include <bus/pci/pci_private.h>
67
68 #include <vm/vm_param.h>
69
70 MALLOC_DEFINE(M_ACPIDEV, "acpidev", "ACPI devices");
71
72 /* Hooks for the ACPICA debugging infrastructure */
73 #define _COMPONENT      ACPI_BUS
74 ACPI_MODULE_NAME("ACPI");
75
76 static d_open_t         acpiopen;
77 static d_close_t        acpiclose;
78 static d_ioctl_t        acpiioctl;
79
80 static struct dev_ops acpi_ops = {
81         { "acpi", 0, 0 },
82         .d_open = acpiopen,
83         .d_close = acpiclose,
84         .d_ioctl = acpiioctl
85 };
86
87 struct acpi_interface {
88         ACPI_STRING     *data;
89         int             num;
90 };
91
92 /* Global mutex for locking access to the ACPI subsystem. */
93 struct lock acpi_lock;
94
95 /* Bitmap of device quirks. */
96 int             acpi_quirks;
97
98 static int      acpi_modevent(struct module *mod, int event, void *junk);
99 static void     acpi_identify(driver_t *driver, device_t parent);
100 static int      acpi_probe(device_t dev);
101 static int      acpi_attach(device_t dev);
102 static int      acpi_suspend(device_t dev);
103 static int      acpi_resume(device_t dev);
104 static int      acpi_shutdown(device_t dev);
105 static device_t acpi_add_child(device_t bus, device_t parent, int order, const char *name,
106                         int unit);
107 static int      acpi_print_child(device_t bus, device_t child);
108 static void     acpi_probe_nomatch(device_t bus, device_t child);
109 static void     acpi_driver_added(device_t dev, driver_t *driver);
110 static int      acpi_read_ivar(device_t dev, device_t child, int index,
111                         uintptr_t *result);
112 static int      acpi_write_ivar(device_t dev, device_t child, int index,
113                         uintptr_t value);
114 static struct resource_list *acpi_get_rlist(device_t dev, device_t child);
115 static int      acpi_sysres_alloc(device_t dev);
116 static struct resource *acpi_alloc_resource(device_t bus, device_t child,
117                         int type, int *rid, u_long start, u_long end,
118                         u_long count, u_int flags, int cpuid);
119 static int      acpi_release_resource(device_t bus, device_t child, int type,
120                         int rid, struct resource *r);
121 static void     acpi_delete_resource(device_t bus, device_t child, int type,
122                     int rid);
123 static uint32_t acpi_isa_get_logicalid(device_t dev);
124 static int      acpi_isa_get_compatid(device_t dev, uint32_t *cids, int count);
125 static char     *acpi_device_id_probe(device_t bus, device_t dev, char **ids);
126 static ACPI_STATUS acpi_device_eval_obj(device_t bus, device_t dev,
127                     ACPI_STRING pathname, ACPI_OBJECT_LIST *parameters,
128                     ACPI_BUFFER *ret);
129 static int      acpi_device_pwr_for_sleep(device_t bus, device_t dev,
130                     int *dstate);
131 static ACPI_STATUS acpi_device_scan_cb(ACPI_HANDLE h, UINT32 level,
132                     void *context, void **retval);
133 static ACPI_STATUS acpi_device_scan_children(device_t bus, device_t dev,
134                     int max_depth, acpi_scan_cb_t user_fn, void *arg);
135 static int      acpi_set_powerstate_method(device_t bus, device_t child,
136                     int state);
137 static int      acpi_isa_pnp_probe(device_t bus, device_t child,
138                     struct isa_pnp_id *ids);
139 static void     acpi_probe_children(device_t bus);
140 static void     acpi_probe_order(ACPI_HANDLE handle, int *order);
141 static ACPI_STATUS acpi_probe_child(ACPI_HANDLE handle, UINT32 level,
142                     void *context, void **status);
143 static ACPI_STATUS acpi_EnterSleepState(struct acpi_softc *sc, int state);
144 static void     acpi_shutdown_final(void *arg, int howto);
145 static void     acpi_enable_fixed_events(struct acpi_softc *sc);
146 static int      acpi_wake_sleep_prep(ACPI_HANDLE handle, int sstate);
147 static int      acpi_wake_run_prep(ACPI_HANDLE handle, int sstate);
148 static int      acpi_wake_prep_walk(int sstate);
149 static int      acpi_wake_sysctl_walk(device_t dev);
150 #ifdef notyet
151 static int      acpi_wake_set_sysctl(SYSCTL_HANDLER_ARGS);
152 #endif
153 static void     acpi_system_eventhandler_sleep(void *arg, int state);
154 static void     acpi_system_eventhandler_wakeup(void *arg, int state);
155 static int      acpi_supported_sleep_state_sysctl(SYSCTL_HANDLER_ARGS);
156 static int      acpi_sleep_state_sysctl(SYSCTL_HANDLER_ARGS);
157 static int      acpi_debug_objects_sysctl(SYSCTL_HANDLER_ARGS);
158 static int      acpi_pm_func(u_long cmd, void *arg, ...);
159 static int      acpi_child_location_str_method(device_t acdev, device_t child,
160                                                char *buf, size_t buflen);
161 static int      acpi_child_pnpinfo_str_method(device_t acdev, device_t child,
162                                               char *buf, size_t buflen);
163 static void     acpi_enable_pcie(void);
164 static void     acpi_reset_interfaces(device_t dev);
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,           acpi_suspend),
174     DEVMETHOD(device_resume,            acpi_resume),
175
176     /* Bus interface */
177     DEVMETHOD(bus_add_child,            acpi_add_child),
178     DEVMETHOD(bus_print_child,          acpi_print_child),
179     DEVMETHOD(bus_probe_nomatch,        acpi_probe_nomatch),
180     DEVMETHOD(bus_driver_added,         acpi_driver_added),
181     DEVMETHOD(bus_read_ivar,            acpi_read_ivar),
182     DEVMETHOD(bus_write_ivar,           acpi_write_ivar),
183     DEVMETHOD(bus_get_resource_list,    acpi_get_rlist),
184     DEVMETHOD(bus_set_resource,         bus_generic_rl_set_resource),
185     DEVMETHOD(bus_get_resource,         bus_generic_rl_get_resource),
186     DEVMETHOD(bus_alloc_resource,       acpi_alloc_resource),
187     DEVMETHOD(bus_release_resource,     acpi_release_resource),
188     DEVMETHOD(bus_delete_resource,      acpi_delete_resource),
189     DEVMETHOD(bus_child_pnpinfo_str,    acpi_child_pnpinfo_str_method),
190     DEVMETHOD(bus_child_location_str,   acpi_child_location_str_method),
191     DEVMETHOD(bus_activate_resource,    bus_generic_activate_resource),
192     DEVMETHOD(bus_deactivate_resource,  bus_generic_deactivate_resource),
193     DEVMETHOD(bus_setup_intr,           bus_generic_setup_intr),
194     DEVMETHOD(bus_teardown_intr,        bus_generic_teardown_intr),
195
196     /* ACPI bus */
197     DEVMETHOD(acpi_id_probe,            acpi_device_id_probe),
198     DEVMETHOD(acpi_evaluate_object,     acpi_device_eval_obj),
199     DEVMETHOD(acpi_pwr_for_sleep,       acpi_device_pwr_for_sleep),
200     DEVMETHOD(acpi_scan_children,       acpi_device_scan_children),
201
202     /* PCI emulation */
203     DEVMETHOD(pci_set_powerstate,       acpi_set_powerstate_method),
204
205     /* ISA emulation */
206     DEVMETHOD(isa_pnp_probe,            acpi_isa_pnp_probe),
207
208     DEVMETHOD_END
209 };
210
211 static driver_t acpi_driver = {
212     "acpi",
213     acpi_methods,
214     sizeof(struct acpi_softc),
215 };
216
217 static devclass_t acpi_devclass;
218 DRIVER_MODULE(acpi, nexus, acpi_driver, acpi_devclass, acpi_modevent, NULL);
219 MODULE_VERSION(acpi, 1);
220
221 ACPI_SERIAL_DECL(acpi, "ACPI serializer");
222
223 /* Local pools for managing system resources for ACPI child devices. */
224 static struct rman acpi_rman_io, acpi_rman_mem;
225
226 #define ACPI_MINIMUM_AWAKETIME  5
227
228 static const char* sleep_state_names[] = {
229     "S0", "S1", "S2", "S3", "S4", "S5", "NONE"};
230
231 SYSCTL_NODE(_debug, OID_AUTO, acpi, CTLFLAG_RD, NULL, "ACPI debugging");
232 static char acpi_ca_version[12];
233 SYSCTL_STRING(_debug_acpi, OID_AUTO, acpi_ca_version, CTLFLAG_RD,
234               acpi_ca_version, 0, "Version of Intel ACPICA");
235
236 /*
237  * Allow overriding _OSI methods.
238  */
239 static char acpi_install_interface[256];
240 TUNABLE_STR("hw.acpi.install_interface", acpi_install_interface,
241     sizeof(acpi_install_interface));
242 static char acpi_remove_interface[256];
243 TUNABLE_STR("hw.acpi.remove_interface", acpi_remove_interface,
244     sizeof(acpi_remove_interface));
245
246 /*
247  * Use this tunable to disable the control method auto-serialization
248  * mechanism that was added in 20140214 and superseded the previous
249  * AcpiGbl_SerializeAllMethods global.
250  */
251 static int acpi_auto_serialize_methods = 1;
252 TUNABLE_INT("hw.acpi.auto_serialize_methods", &acpi_auto_serialize_methods);
253
254 /* Allow users to dump Debug objects without ACPI debugger. */
255 static int acpi_debug_objects;
256 TUNABLE_INT("debug.acpi.enable_debug_objects", &acpi_debug_objects);
257 SYSCTL_PROC(_debug_acpi, OID_AUTO, enable_debug_objects,
258     CTLFLAG_RW | CTLTYPE_INT, NULL, 0, acpi_debug_objects_sysctl, "I",
259     "Enable Debug objects.");
260
261 /* Allow ignoring the XSDT. */
262 static int acpi_ignore_xsdt;
263 TUNABLE_INT("debug.acpi.ignore_xsdt", &acpi_ignore_xsdt);
264 SYSCTL_INT(_debug_acpi, OID_AUTO, ignore_xsdt, CTLFLAG_RD,
265     &acpi_ignore_xsdt, 1, "Ignore the XSDT, forcing the use of the RSDT.");
266
267 /* Allow the interpreter to ignore common mistakes in BIOS. */
268 static int acpi_interpreter_slack = 1;
269 TUNABLE_INT("debug.acpi.interpreter_slack", &acpi_interpreter_slack);
270 SYSCTL_INT(_debug_acpi, OID_AUTO, interpreter_slack, CTLFLAG_RD,
271     &acpi_interpreter_slack, 1, "Turn on interpreter slack mode.");
272
273 /* Allow preferring 32-bit FADT register addresses over the 64-bit ones. */
274 static int acpi_fadt_addr32;
275 TUNABLE_INT("debug.acpi.fadt_addr32", &acpi_fadt_addr32);
276 SYSCTL_INT(_debug_acpi, OID_AUTO, fadt_addr32, CTLFLAG_RD,
277     &acpi_fadt_addr32, 1,
278     "Prefer 32-bit FADT register addresses over 64-bit ones.");
279
280 /* Power devices off and on in suspend and resume.  XXX Remove once tested. */
281 static int acpi_do_powerstate = 1;
282 TUNABLE_INT("debug.acpi.do_powerstate", &acpi_do_powerstate);
283 SYSCTL_INT(_debug_acpi, OID_AUTO, do_powerstate, CTLFLAG_RW,
284     &acpi_do_powerstate, 1, "Turn off devices when suspending.");
285
286 /* Allow users to override quirks. */
287 TUNABLE_INT("debug.acpi.quirks", &acpi_quirks);
288
289 static int acpi_susp_bounce;
290 SYSCTL_INT(_debug_acpi, OID_AUTO, suspend_bounce, CTLFLAG_RW,
291     &acpi_susp_bounce, 0, "Don't actually suspend, just test devices.");
292
293 /*
294  * ACPI can only be loaded as a module by the loader; activating it after
295  * system bootstrap time is not useful, and can be fatal to the system.
296  * It also cannot be unloaded, since the entire system bus heirarchy hangs
297  * off it.
298  */
299 static int
300 acpi_modevent(struct module *mod, int event, void *junk)
301 {
302     switch (event) {
303     case MOD_LOAD:
304         if (!cold) {
305             kprintf("The ACPI driver cannot be loaded after boot.\n");
306             return (EPERM);
307         }
308         break;
309     case MOD_UNLOAD:
310         if (!cold && power_pm_get_type() == POWER_PM_TYPE_ACPI)
311             return (EBUSY);
312         break;
313     default:
314         break;
315     }
316     return (0);
317 }
318
319 /*
320  * Perform early initialization.
321  */
322 ACPI_STATUS
323 acpi_Startup(void)
324 {
325     static int started = 0;
326     ACPI_STATUS status;
327     int val;
328
329     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
330
331     /* Only run the startup code once.  The MADT driver also calls this. */
332     if (started)
333         return_VALUE (AE_OK);
334     started = 1;
335
336     /*
337      * Pre-allocate space for RSDT/XSDT and DSDT tables and allow resizing
338      * if more tables exist.
339      */
340     if (ACPI_FAILURE(status = AcpiInitializeTables(NULL, 2, TRUE))) {
341         kprintf("ACPI: Table initialisation failed: %s\n",
342             AcpiFormatException(status));
343         return_VALUE (status);
344     }
345
346     /* Set up any quirks we have for this system. */
347     if (acpi_quirks == ACPI_Q_OK)
348         acpi_table_quirks(&acpi_quirks);
349
350     /* If the user manually set the disabled hint to 0, force-enable ACPI. */
351     if (resource_int_value("acpi", 0, "disabled", &val) == 0 && val == 0)
352         acpi_quirks &= ~ACPI_Q_BROKEN;
353     if (acpi_quirks & ACPI_Q_BROKEN) {
354         kprintf("ACPI disabled by blacklist.  Contact your BIOS vendor.\n");
355         status = AE_SUPPORT;
356     }
357
358     return_VALUE (status);
359 }
360
361 /*
362  * Detect ACPI, perform early initialisation
363  */
364 static void
365 acpi_identify(driver_t *driver, device_t parent)
366 {
367     device_t    child;
368
369     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
370
371     if (!cold)
372         return_VOID;
373
374     /* Check that we haven't been disabled with a hint. */
375     if (resource_disabled("acpi", 0))
376         return_VOID;
377
378     /* Make sure we're not being doubly invoked. */
379     if (device_find_child(parent, "acpi", 0) != NULL)
380         return_VOID;
381
382     ksnprintf(acpi_ca_version, sizeof(acpi_ca_version), "%x", ACPI_CA_VERSION);
383
384     /* Initialize root tables. */
385     if (ACPI_FAILURE(acpi_Startup())) {
386         kprintf("ACPI: Try disabling either ACPI or apic support.\n");
387         return_VOID;
388     }
389
390     /* Attach the actual ACPI device. */
391     if ((child = BUS_ADD_CHILD(parent, parent, 10, "acpi", 0)) == NULL) {
392         device_printf(parent, "device_identify failed\n");
393         return_VOID;
394     }
395 }
396
397 /*
398  * Fetch some descriptive data from ACPI to put in our attach message.
399  */
400 static int
401 acpi_probe(device_t dev)
402 {
403     ACPI_TABLE_RSDP     *rsdp;
404     ACPI_TABLE_HEADER   *rsdt;
405     ACPI_PHYSICAL_ADDRESS paddr;
406     char                buf[ACPI_OEM_ID_SIZE + ACPI_OEM_TABLE_ID_SIZE + 2];
407     struct sbuf         sb;
408
409     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
410
411     if (power_pm_get_type() != POWER_PM_TYPE_NONE &&
412         power_pm_get_type() != POWER_PM_TYPE_ACPI) {
413         device_printf(dev, "probe failed, other PM system enabled.\n");
414         return_VALUE (ENXIO);
415     }
416
417     if ((paddr = AcpiOsGetRootPointer()) == 0 ||
418         (rsdp = AcpiOsMapMemory(paddr, sizeof(ACPI_TABLE_RSDP))) == NULL)
419         return_VALUE (ENXIO);
420     if (acpi_ignore_xsdt == 0 &&
421         rsdp->Revision > 1 && rsdp->XsdtPhysicalAddress != 0)
422         paddr = (ACPI_PHYSICAL_ADDRESS)rsdp->XsdtPhysicalAddress;
423     else
424         paddr = (ACPI_PHYSICAL_ADDRESS)rsdp->RsdtPhysicalAddress;
425     AcpiOsUnmapMemory(rsdp, sizeof(ACPI_TABLE_RSDP));
426
427     if ((rsdt = AcpiOsMapMemory(paddr, sizeof(ACPI_TABLE_HEADER))) == NULL)
428         return_VALUE (ENXIO);
429     sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN);
430     sbuf_bcat(&sb, rsdt->OemId, ACPI_OEM_ID_SIZE);
431     sbuf_trim(&sb);
432     sbuf_putc(&sb, ' ');
433     sbuf_bcat(&sb, rsdt->OemTableId, ACPI_OEM_TABLE_ID_SIZE);
434     sbuf_trim(&sb);
435     sbuf_finish(&sb);
436     device_set_desc_copy(dev, sbuf_data(&sb));
437     sbuf_delete(&sb);
438     AcpiOsUnmapMemory(rsdt, sizeof(ACPI_TABLE_HEADER));
439
440     return_VALUE (0);
441 }
442
443 static int
444 acpi_attach(device_t dev)
445 {
446     struct acpi_softc   *sc;
447     ACPI_STATUS         status;
448     int                 error, state;
449     UINT32              flags;
450     UINT8               TypeA, TypeB;
451     char                *env;
452
453     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
454
455     sc = device_get_softc(dev);
456     sc->acpi_dev = dev;
457     callout_init(&sc->susp_force_to);
458
459     if ((error = acpi_task_thread_init())) {
460         device_printf(dev, "Could not start task thread.\n");
461         goto out;
462     }
463
464     error = ENXIO;
465
466     /* Initialize resource manager. */
467     acpi_rman_io.rm_type = RMAN_ARRAY;
468     acpi_rman_io.rm_start = 0;
469     acpi_rman_io.rm_end = 0xffff;
470     acpi_rman_io.rm_descr = "ACPI I/O ports";
471     if (rman_init(&acpi_rman_io, -1) != 0)
472         panic("acpi rman_init IO ports failed");
473     acpi_rman_mem.rm_type = RMAN_ARRAY;
474     acpi_rman_mem.rm_start = 0;
475     acpi_rman_mem.rm_end = ~0ul;
476     acpi_rman_mem.rm_descr = "ACPI I/O memory addresses";
477     if (rman_init(&acpi_rman_mem, -1) != 0)
478         panic("acpi rman_init memory failed");
479
480     /* Initialise the ACPI mutex */
481     ACPI_LOCK_INIT(acpi, "acpi");
482     ACPI_SERIAL_INIT(acpi);
483
484     /*
485      * Set the globals from our tunables.  This is needed because ACPICA
486      * uses UINT8 for some values and we have no tunable_byte.
487      */
488     AcpiGbl_AutoSerializeMethods = acpi_auto_serialize_methods ? TRUE : FALSE;
489     AcpiGbl_DoNotUseXsdt = acpi_ignore_xsdt ? TRUE : FALSE;
490     AcpiGbl_EnableAmlDebugObject = acpi_debug_objects ? TRUE : FALSE;
491     AcpiGbl_EnableInterpreterSlack = acpi_interpreter_slack ? TRUE : FALSE;
492     AcpiGbl_Use32BitFadtAddresses = acpi_fadt_addr32 ? TRUE : FALSE;
493
494 #ifndef ACPI_DEBUG
495     /*
496      * Disable Debug Object output.
497      */
498     AcpiDbgLevel &= ~ACPI_LV_DEBUG_OBJECT;
499 #endif
500
501     /* Start up the ACPICA subsystem. */
502     status = AcpiInitializeSubsystem();
503     if (ACPI_FAILURE(status)) {
504         device_printf(dev, "Could not initialize Subsystem: %s\n",
505                       AcpiFormatException(status));
506         goto out;
507     }
508
509     /* Override OS interfaces if the user requested. */
510     acpi_reset_interfaces(dev);
511
512     /* Load ACPI name space. */
513     status = AcpiLoadTables();
514     if (ACPI_FAILURE(status)) {
515         device_printf(dev, "Could not load Namespace: %s\n",
516                       AcpiFormatException(status));
517         goto out;
518     }
519
520     /* Handle MCFG table if present. */
521     acpi_enable_pcie();
522
523     /*
524      * Note that some systems (specifically, those with namespace evaluation
525      * issues that require the avoidance of parts of the namespace) must
526      * avoid running _INI and _STA on everything, as well as dodging the final
527      * object init pass.
528      *
529      * For these devices, we set ACPI_NO_DEVICE_INIT and ACPI_NO_OBJECT_INIT).
530      *
531      * XXX We should arrange for the object init pass after we have attached
532      *     all our child devices, but on many systems it works here.
533      */
534     flags = 0;
535     if (ktestenv("debug.acpi.avoid"))
536         flags = ACPI_NO_DEVICE_INIT | ACPI_NO_OBJECT_INIT;
537
538     /* Bring the hardware and basic handlers online. */
539     if (ACPI_FAILURE(status = AcpiEnableSubsystem(flags))) {
540         device_printf(dev, "Could not enable ACPI: %s\n",
541                       AcpiFormatException(status));
542         goto out;
543     }
544
545     /*
546      * Fix up the interrupt timer after enabling ACPI, so that the
547      * interrupt cputimer that choked by ACPI power management could
548      * be resurrected before probing various devices.
549      */
550     DELAY(5000);
551     cputimer_intr_pmfixup();
552
553     /*
554      * Call the ECDT probe function to provide EC functionality before
555      * the namespace has been evaluated.
556      *
557      * XXX This happens before the sysresource devices have been probed and
558      * attached so its resources come from nexus0.  In practice, this isn't
559      * a problem but should be addressed eventually.
560      */
561     acpi_ec_ecdt_probe(dev);
562
563     /* Bring device objects and regions online. */
564     if (ACPI_FAILURE(status = AcpiInitializeObjects(flags))) {
565         device_printf(dev, "Could not initialize ACPI objects: %s\n",
566                       AcpiFormatException(status));
567         goto out;
568     }
569
570     /*
571      * Setup our sysctl tree.
572      *
573      * XXX: This doesn't check to make sure that none of these fail.
574      */
575     sysctl_ctx_init(&sc->acpi_sysctl_ctx);
576     sc->acpi_sysctl_tree = SYSCTL_ADD_NODE(&sc->acpi_sysctl_ctx,
577                                SYSCTL_STATIC_CHILDREN(_hw), OID_AUTO,
578                                device_get_name(dev), CTLFLAG_RD, 0, "");
579     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
580         OID_AUTO, "supported_sleep_state", CTLTYPE_STRING | CTLFLAG_RD,
581         0, 0, acpi_supported_sleep_state_sysctl, "A", "");
582     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
583         OID_AUTO, "power_button_state", CTLTYPE_STRING | CTLFLAG_RW,
584         &sc->acpi_power_button_sx, 0, acpi_sleep_state_sysctl, "A", "");
585     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
586         OID_AUTO, "sleep_button_state", CTLTYPE_STRING | CTLFLAG_RW,
587         &sc->acpi_sleep_button_sx, 0, acpi_sleep_state_sysctl, "A", "");
588     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
589         OID_AUTO, "lid_switch_state", CTLTYPE_STRING | CTLFLAG_RW,
590         &sc->acpi_lid_switch_sx, 0, acpi_sleep_state_sysctl, "A", "");
591     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
592         OID_AUTO, "standby_state", CTLTYPE_STRING | CTLFLAG_RW,
593         &sc->acpi_standby_sx, 0, acpi_sleep_state_sysctl, "A", "");
594     SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
595         OID_AUTO, "suspend_state", CTLTYPE_STRING | CTLFLAG_RW,
596         &sc->acpi_suspend_sx, 0, acpi_sleep_state_sysctl, "A", "");
597     SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
598         OID_AUTO, "sleep_delay", CTLFLAG_RW, &sc->acpi_sleep_delay, 0,
599         "sleep delay");
600     SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
601         OID_AUTO, "s4bios", CTLFLAG_RW, &sc->acpi_s4bios, 0, "S4BIOS mode");
602     SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
603         OID_AUTO, "verbose", CTLFLAG_RW, &sc->acpi_verbose, 0, "verbose mode");
604     SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
605         OID_AUTO, "disable_on_reboot", CTLFLAG_RW,
606         &sc->acpi_do_disable, 0, "Disable ACPI when rebooting/halting system");
607     SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
608         OID_AUTO, "handle_reboot", CTLFLAG_RW,
609         &sc->acpi_handle_reboot, 0, "Use ACPI Reset Register to reboot");
610
611     /*
612      * Default to 1 second before sleeping to give some machines time to
613      * stabilize.
614      */
615     sc->acpi_sleep_delay = 1;
616     if (bootverbose)
617         sc->acpi_verbose = 1;
618     if ((env = kgetenv("hw.acpi.verbose")) != NULL) {
619         if (strcmp(env, "0") != 0)
620             sc->acpi_verbose = 1;
621         kfreeenv(env);
622     }
623
624     /* Only enable reboot by default if the FADT says it is available. */
625     if (AcpiGbl_FADT.Flags & ACPI_FADT_RESET_REGISTER)
626         sc->acpi_handle_reboot = 1;
627
628     /* Only enable S4BIOS by default if the FACS says it is available. */
629     if (AcpiGbl_FACS->Flags & ACPI_FACS_S4_BIOS_PRESENT)
630         sc->acpi_s4bios = 1;
631
632     /*
633      * Dispatch the default sleep state to devices.  The lid switch is set
634      * to NONE by default to avoid surprising users.
635      */
636     sc->acpi_power_button_sx = ACPI_STATE_S5;
637     sc->acpi_lid_switch_sx = ACPI_S_STATES_MAX + 1;
638     sc->acpi_standby_sx = ACPI_STATE_S1;
639     sc->acpi_suspend_sx = ACPI_STATE_S3;
640
641     /* Pick the first valid sleep state for the sleep button default. */
642     sc->acpi_sleep_button_sx = ACPI_S_STATES_MAX + 1;
643     for (state = ACPI_STATE_S1; state <= ACPI_STATE_S4; state++)
644         if (ACPI_SUCCESS(AcpiGetSleepTypeData(state, &TypeA, &TypeB))) {
645             sc->acpi_sleep_button_sx = state;
646             break;
647         }
648
649     acpi_enable_fixed_events(sc);
650
651     /*
652      * Scan the namespace and attach/initialise children.
653      */
654
655     /* Register our shutdown handler. */
656     EVENTHANDLER_REGISTER(shutdown_final, acpi_shutdown_final, sc,
657         SHUTDOWN_PRI_LAST);
658
659     /*
660      * Register our acpi event handlers.
661      * XXX should be configurable eg. via userland policy manager.
662      */
663     EVENTHANDLER_REGISTER(acpi_sleep_event, acpi_system_eventhandler_sleep,
664         sc, ACPI_EVENT_PRI_LAST);
665     EVENTHANDLER_REGISTER(acpi_wakeup_event, acpi_system_eventhandler_wakeup,
666         sc, ACPI_EVENT_PRI_LAST);
667
668     /* Flag our initial states. */
669     sc->acpi_enabled = 1;
670     sc->acpi_sstate = ACPI_STATE_S0;
671     sc->acpi_sleep_disabled = 0;
672     /* Create the control device */
673     sc->acpi_dev_t = make_dev(&acpi_ops, 0, UID_ROOT, GID_WHEEL, 0644,
674                               "acpi");
675     sc->acpi_dev_t->si_drv1 = sc;
676
677     if ((error = acpi_machdep_init(dev)))
678         goto out;
679
680     /* Register ACPI again to pass the correct argument of pm_func. */
681     power_pm_register(POWER_PM_TYPE_ACPI, acpi_pm_func, sc);
682
683     if (!acpi_disabled("bus"))
684         acpi_probe_children(dev);
685
686     /* Update all GPEs and enable runtime GPEs. */
687     status = AcpiUpdateAllGpes();
688     if (ACPI_FAILURE(status)) {
689         device_printf(dev, "Could not update all GPEs: %s\n",
690                       AcpiFormatException(status));
691     }
692
693     /* Allow sleep request after a while. */
694     /* timeout(acpi_sleep_enable, sc, hz * ACPI_MINIMUM_AWAKETIME); */
695
696     error = 0;
697
698  out:
699     cputimer_intr_pmfixup();
700     acpi_task_thread_schedule();
701     return_VALUE (error);
702 }
703
704 static int
705 acpi_suspend(device_t dev)
706 {
707     device_t child, *devlist;
708     int error, i, numdevs, pstate;
709
710     /* First give child devices a chance to suspend. */
711     error = bus_generic_suspend(dev);
712     if (error)
713         return (error);
714
715     /*
716      * Now, set them into the appropriate power state, usually D3.  If the
717      * device has an _SxD method for the next sleep state, use that power
718      * state instead.
719      */
720     device_get_children(dev, &devlist, &numdevs);
721     for (i = 0; i < numdevs; i++) {
722         /* If the device is not attached, we've powered it down elsewhere. */
723         child = devlist[i];
724         if (!device_is_attached(child))
725             continue;
726
727         /*
728          * Default to D3 for all sleep states.  The _SxD method is optional
729          * so set the powerstate even if it's absent.
730          */
731         pstate = PCI_POWERSTATE_D3;
732         error = acpi_device_pwr_for_sleep(device_get_parent(child),
733             child, &pstate);
734         if ((error == 0 || error == ESRCH) && acpi_do_powerstate)
735             pci_set_powerstate(child, pstate);
736     }
737     kfree(devlist, M_TEMP);
738     error = 0;
739
740     return (error);
741 }
742
743 static int
744 acpi_resume(device_t dev)
745 {
746     ACPI_HANDLE handle;
747     int i, numdevs;
748     device_t child, *devlist;
749
750     /*
751      * Put all devices in D0 before resuming them.  Call _S0D on each one
752      * since some systems expect this.
753      */
754     device_get_children(dev, &devlist, &numdevs);
755     for (i = 0; i < numdevs; i++) {
756         child = devlist[i];
757         handle = acpi_get_handle(child);
758         if (handle)
759             AcpiEvaluateObject(handle, "_S0D", NULL, NULL);
760         if (device_is_attached(child) && acpi_do_powerstate)
761             pci_set_powerstate(child, PCI_POWERSTATE_D0);
762     }
763     kfree(devlist, M_TEMP);
764
765     return (bus_generic_resume(dev));
766 }
767
768 static int
769 acpi_shutdown(device_t dev)
770 {
771     /* Allow children to shutdown first. */
772     bus_generic_shutdown(dev);
773
774     /*
775      * Enable any GPEs that are able to power-on the system (i.e., RTC).
776      * Also, disable any that are not valid for this state (most).
777      */
778     acpi_wake_prep_walk(ACPI_STATE_S5);
779
780     return (0);
781 }
782
783 /*
784  * Handle a new device being added
785  */
786 static device_t
787 acpi_add_child(device_t bus, device_t parent, int order, const char *name, int unit)
788 {
789     struct acpi_device  *ad;
790     device_t            child;
791
792     if ((ad = kmalloc(sizeof(*ad), M_ACPIDEV, M_NOWAIT | M_ZERO)) == NULL)
793         return (NULL);
794
795     resource_list_init(&ad->ad_rl);
796     child = device_add_child_ordered(parent, order, name, unit);
797     if (child != NULL)
798         device_set_ivars(child, ad);
799     else
800         kfree(ad, M_ACPIDEV);
801     return (child);
802 }
803
804 static int
805 acpi_print_child(device_t bus, device_t child)
806 {
807     struct acpi_device   *adev = device_get_ivars(child);
808     struct resource_list *rl = &adev->ad_rl;
809     int retval = 0;
810
811     retval += bus_print_child_header(bus, child);
812     retval += resource_list_print_type(rl, "port",  SYS_RES_IOPORT, "%#lx");
813     retval += resource_list_print_type(rl, "iomem", SYS_RES_MEMORY, "%#lx");
814     retval += resource_list_print_type(rl, "irq",   SYS_RES_IRQ,    "%ld");
815     retval += resource_list_print_type(rl, "drq",   SYS_RES_DRQ,    "%ld");
816     if (device_get_flags(child))
817         retval += kprintf(" flags %#x", device_get_flags(child));
818     retval += bus_print_child_footer(bus, child);
819
820     return (retval);
821 }
822
823 /*
824  * If this device is an ACPI child but no one claimed it, attempt
825  * to power it off.  We'll power it back up when a driver is added.
826  *
827  * XXX Disabled for now since many necessary devices (like fdc and
828  * ATA) don't claim the devices we created for them but still expect
829  * them to be powered up.
830  */
831 static void
832 acpi_probe_nomatch(device_t bus, device_t child)
833 {
834
835     /* pci_set_powerstate(child, PCI_POWERSTATE_D3); */
836 }
837
838 /*
839  * If a new driver has a chance to probe a child, first power it up.
840  *
841  * XXX Disabled for now (see acpi_probe_nomatch for details).
842  */
843 static void
844 acpi_driver_added(device_t dev, driver_t *driver)
845 {
846     device_t child, *devlist;
847     int i, numdevs;
848
849     DEVICE_IDENTIFY(driver, dev);
850     device_get_children(dev, &devlist, &numdevs);
851     for (i = 0; i < numdevs; i++) {
852         child = devlist[i];
853         if (device_get_state(child) == DS_NOTPRESENT) {
854             /* pci_set_powerstate(child, PCI_POWERSTATE_D0); */
855             if (device_probe_and_attach(child) != 0)
856                 ; /* pci_set_powerstate(child, PCI_POWERSTATE_D3); */
857         }
858     }
859     kfree(devlist, M_TEMP);
860 }
861
862 /* Location hint for devctl(8) */
863 static int
864 acpi_child_location_str_method(device_t cbdev, device_t child, char *buf,
865     size_t buflen)
866 {
867     struct acpi_device *dinfo = device_get_ivars(child);
868
869     if (dinfo->ad_handle)
870         ksnprintf(buf, buflen, "handle=%s", acpi_name(dinfo->ad_handle));
871     else
872         ksnprintf(buf, buflen, "unknown");
873     return (0);
874 }
875
876 /* PnP information for devctl(8) */
877 static int
878 acpi_child_pnpinfo_str_method(device_t cbdev, device_t child, char *buf,
879     size_t buflen)
880 {
881     ACPI_DEVICE_INFO *adinfo;
882     struct acpi_device *dinfo = device_get_ivars(child);
883     char *end;
884
885     if (ACPI_FAILURE(AcpiGetObjectInfo(dinfo->ad_handle, &adinfo))) {
886         ksnprintf(buf, buflen, "unknown");
887     } else {
888         ksnprintf(buf, buflen, "_HID=%s _UID=%lu",
889                  (adinfo->Valid & ACPI_VALID_HID) ?
890                  adinfo->HardwareId.String : "none",
891                  (adinfo->Valid & ACPI_VALID_UID) ?
892                  strtoul(adinfo->UniqueId.String, &end, 10) : 0);
893         if (adinfo)
894             AcpiOsFree(adinfo);
895     }
896     return (0);
897 }
898
899 /*
900  * Handle per-device ivars
901  */
902 static int
903 acpi_read_ivar(device_t dev, device_t child, int index, uintptr_t *result)
904 {
905     struct acpi_device  *ad;
906
907     if ((ad = device_get_ivars(child)) == NULL) {
908         device_printf(child, "device has no ivars\n");
909         return (ENOENT);
910     }
911
912     /* ACPI and ISA compatibility ivars */
913     switch(index) {
914     case ACPI_IVAR_HANDLE:
915         *(ACPI_HANDLE *)result = ad->ad_handle;
916         break;
917     case ACPI_IVAR_MAGIC:
918         *result = ad->ad_magic;
919         break;
920     case ACPI_IVAR_PRIVATE:
921         *(void **)result = ad->ad_private;
922         break;
923     case ACPI_IVAR_FLAGS:
924         *(int *)result = ad->ad_flags;
925         break;
926     case ISA_IVAR_VENDORID:
927     case ISA_IVAR_SERIAL:
928     case ISA_IVAR_COMPATID:
929         *(int *)result = -1;
930         break;
931     case ISA_IVAR_LOGICALID:
932         *(int *)result = acpi_isa_get_logicalid(child);
933         break;
934     default:
935         return (ENOENT);
936     }
937
938     return (0);
939 }
940
941 static int
942 acpi_write_ivar(device_t dev, device_t child, int index, uintptr_t value)
943 {
944     struct acpi_device  *ad;
945
946     if ((ad = device_get_ivars(child)) == NULL) {
947         device_printf(child, "device has no ivars\n");
948         return (ENOENT);
949     }
950
951     switch(index) {
952     case ACPI_IVAR_HANDLE:
953         ad->ad_handle = (ACPI_HANDLE)value;
954         break;
955     case ACPI_IVAR_MAGIC:
956         ad->ad_magic = value;
957         break;
958     case ACPI_IVAR_PRIVATE:
959         ad->ad_private = (void *)value;
960         break;
961     case ACPI_IVAR_FLAGS:
962         ad->ad_flags = (int)value;
963         break;
964     default:
965         panic("bad ivar write request (%d)", index);
966         return (ENOENT);
967     }
968
969     return (0);
970 }
971
972 /*
973  * Handle child resource allocation/removal
974  */
975 static struct resource_list *
976 acpi_get_rlist(device_t dev, device_t child)
977 {
978     struct acpi_device          *ad;
979
980     ad = device_get_ivars(child);
981     return (&ad->ad_rl);
982 }
983
984 /*
985  * Pre-allocate/manage all memory and IO resources.  Since rman can't handle
986  * duplicates, we merge any in the sysresource attach routine.
987  */
988 static int
989 acpi_sysres_alloc(device_t dev)
990 {
991     struct resource *res;
992     struct resource_list *rl;
993     struct resource_list_entry *rle;
994     struct rman *rm;
995     char *sysres_ids[] = { "PNP0C01", "PNP0C02", NULL };
996     device_t *children;
997     int child_count, i;
998     /*
999      * Probe/attach any sysresource devices.  This would be unnecessary if we
1000      * had multi-pass probe/attach.
1001      */
1002     if (device_get_children(dev, &children, &child_count) != 0)
1003         return (ENXIO);
1004     for (i = 0; i < child_count; i++) {
1005         if (ACPI_ID_PROBE(dev, children[i], sysres_ids) != NULL)
1006             device_probe_and_attach(children[i]);
1007     }
1008     kfree(children, M_TEMP);
1009
1010     rl = BUS_GET_RESOURCE_LIST(device_get_parent(dev), dev);
1011     if(!rl)
1012         return 0;
1013     SLIST_FOREACH(rle, rl, link) {
1014         if (rle->res != NULL) {
1015             device_printf(dev, "duplicate resource for %lx\n", rle->start);
1016             continue;
1017         }
1018
1019         /* Only memory and IO resources are valid here. */
1020         switch (rle->type) {
1021         case SYS_RES_IOPORT:
1022             rm = &acpi_rman_io;
1023             break;
1024         case SYS_RES_MEMORY:
1025             rm = &acpi_rman_mem;
1026             break;
1027         default:
1028             continue;
1029         }
1030
1031         /* Pre-allocate resource and add to our rman pool. */
1032         res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, rle->type,
1033             &rle->rid, rle->start, rle->start + rle->count - 1, rle->count,
1034             0, -1);
1035         if (res != NULL) {
1036             rman_manage_region(rm, rman_get_start(res), rman_get_end(res));
1037             rle->res = res;
1038         } else
1039             device_printf(dev, "reservation of %lx, %lx (%d) failed\n",
1040                 rle->start, rle->count, rle->type);
1041     }
1042     return (0);
1043 }
1044
1045 static struct resource *
1046 acpi_alloc_resource(device_t bus, device_t child, int type, int *rid,
1047     u_long start, u_long end, u_long count, u_int flags, int cpuid)
1048 {
1049     ACPI_RESOURCE ares;
1050     struct acpi_device *ad = device_get_ivars(child);
1051     struct resource_list *rl = &ad->ad_rl;
1052     struct resource_list_entry *rle;
1053     struct resource *res;
1054     struct rman *rm;
1055
1056     res = NULL;
1057
1058     /* We only handle memory and IO resources through rman. */
1059     switch (type) {
1060     case SYS_RES_IOPORT:
1061         rm = &acpi_rman_io;
1062         break;
1063     case SYS_RES_MEMORY:
1064         rm = &acpi_rman_mem;
1065         break;
1066     default:
1067         rm = NULL;
1068     }
1069
1070     ACPI_SERIAL_BEGIN(acpi);
1071
1072     /*
1073      * If this is an allocation of the "default" range for a given RID, and
1074      * we know what the resources for this device are (i.e., they're on the
1075      * child's resource list), use those start/end values.
1076      */
1077     if (bus == device_get_parent(child) && start == 0UL && end == ~0UL) {
1078         rle = resource_list_find(rl, type, *rid);
1079         if (rle == NULL)
1080             goto out;
1081         start = rle->start;
1082         end = rle->end;
1083         count = rle->count;
1084         cpuid = rle->cpuid;
1085     }
1086
1087     /*
1088      * If this is an allocation of a specific range, see if we can satisfy
1089      * the request from our system resource regions.  If we can't, pass the
1090      * request up to the parent.
1091      */
1092     if (start + count - 1 == end && rm != NULL)
1093         res = rman_reserve_resource(rm, start, end, count, flags & ~RF_ACTIVE,
1094             child);
1095     if (res == NULL) {
1096         res = BUS_ALLOC_RESOURCE(device_get_parent(bus), child, type, rid,
1097             start, end, count, flags, cpuid);
1098     } else {
1099         rman_set_rid(res, *rid);
1100
1101         /* If requested, activate the resource using the parent's method. */
1102         if (flags & RF_ACTIVE)
1103             if (bus_activate_resource(child, type, *rid, res) != 0) {
1104                 rman_release_resource(res);
1105                 res = NULL;
1106                 goto out;
1107             }
1108     }
1109
1110     if (res != NULL && device_get_parent(child) == bus)
1111         switch (type) {
1112         case SYS_RES_IRQ:
1113             /*
1114              * Since bus_config_intr() takes immediate effect, we cannot
1115              * configure the interrupt associated with a device when we
1116              * parse the resources but have to defer it until a driver
1117              * actually allocates the interrupt via bus_alloc_resource().
1118              *
1119              * XXX: Should we handle the lookup failing?
1120              */
1121             if (ACPI_SUCCESS(acpi_lookup_irq_resource(child, *rid, res, &ares)))
1122                 acpi_config_intr(child, &ares);
1123             else
1124                 kprintf("irq resource not found\n");
1125             break;
1126         }
1127
1128 out:
1129     ACPI_SERIAL_END(acpi);
1130     return (res);
1131 }
1132
1133 static int
1134 acpi_release_resource(device_t bus, device_t child, int type, int rid,
1135     struct resource *r)
1136 {
1137     struct rman *rm;
1138     int ret;
1139
1140     /* We only handle memory and IO resources through rman. */
1141     switch (type) {
1142     case SYS_RES_IOPORT:
1143         rm = &acpi_rman_io;
1144         break;
1145     case SYS_RES_MEMORY:
1146         rm = &acpi_rman_mem;
1147         break;
1148     default:
1149         rm = NULL;
1150     }
1151
1152     ACPI_SERIAL_BEGIN(acpi);
1153
1154     /*
1155      * If this resource belongs to one of our internal managers,
1156      * deactivate it and release it to the local pool.  If it doesn't,
1157      * pass this request up to the parent.
1158      */
1159     if (rm != NULL && rman_is_region_manager(r, rm)) {
1160         if (rman_get_flags(r) & RF_ACTIVE) {
1161             ret = bus_deactivate_resource(child, type, rid, r);
1162             if (ret != 0)
1163                 goto out;
1164         }
1165         ret = rman_release_resource(r);
1166     } else
1167         ret = BUS_RELEASE_RESOURCE(device_get_parent(bus), child, type, rid, r);
1168
1169 out:
1170     ACPI_SERIAL_END(acpi);
1171     return (ret);
1172 }
1173
1174 static void
1175 acpi_delete_resource(device_t bus, device_t child, int type, int rid)
1176 {
1177     struct resource_list *rl;
1178
1179     rl = acpi_get_rlist(bus, child);
1180     resource_list_delete(rl, type, rid);
1181 }
1182
1183 /* Allocate an IO port or memory resource, given its GAS. */
1184 int
1185 acpi_bus_alloc_gas(device_t dev, int *type, int *rid, ACPI_GENERIC_ADDRESS *gas,
1186     struct resource **res, u_int flags)
1187 {
1188     int error, res_type;
1189
1190     error = ENOMEM;
1191     if (type == NULL || rid == NULL || gas == NULL || res == NULL)
1192         return (EINVAL);
1193
1194     /* We only support memory and IO spaces. */
1195     switch (gas->SpaceId) {
1196     case ACPI_ADR_SPACE_SYSTEM_MEMORY:
1197         res_type = SYS_RES_MEMORY;
1198         break;
1199     case ACPI_ADR_SPACE_SYSTEM_IO:
1200         res_type = SYS_RES_IOPORT;
1201         break;
1202     default:
1203         return (EOPNOTSUPP);
1204     }
1205
1206     /*
1207      * If the register width is less than 8, assume the BIOS author means
1208      * it is a bit field and just allocate a byte.
1209      */
1210     if (gas->BitWidth && gas->BitWidth < 8)
1211         gas->BitWidth = 8;
1212
1213     /* Validate the address after we're sure we support the space. */
1214     if (gas->Address == 0 || gas->BitWidth == 0)
1215         return (EINVAL);
1216
1217     bus_set_resource(dev, res_type, *rid, gas->Address,
1218         gas->BitWidth / 8, -1);
1219     *res = bus_alloc_resource_any(dev, res_type, rid, RF_ACTIVE | flags);
1220     if (*res != NULL) {
1221         *type = res_type;
1222         error = 0;
1223     } else
1224         bus_delete_resource(dev, res_type, *rid);
1225
1226     return (error);
1227 }
1228
1229 ACPI_STATUS
1230 acpi_eval_osc(device_t dev, ACPI_HANDLE handle, const char *uuidstr,
1231     int revision, uint32_t *buf, int count)
1232 {
1233     ACPI_BUFFER         retbuf = { ACPI_ALLOCATE_BUFFER, NULL };
1234     ACPI_OBJECT_LIST    arglist;
1235     ACPI_OBJECT         arg[4];
1236     ACPI_OBJECT         *retobj;
1237     ACPI_STATUS         status;
1238     struct uuid         uuid;
1239     uint32_t            error;
1240     uint8_t             oscuuid[16];
1241     int                 i;
1242
1243     if (parse_uuid(uuidstr, &uuid) != 0)
1244             return (AE_ERROR);
1245     le_uuid_enc(oscuuid, &uuid);
1246
1247     arglist.Pointer = arg;
1248     arglist.Count = 4;
1249     arg[0].Type = ACPI_TYPE_BUFFER;
1250     arg[0].Buffer.Length = sizeof(oscuuid);
1251     arg[0].Buffer.Pointer = oscuuid;            /* UUID */
1252     arg[1].Type = ACPI_TYPE_INTEGER;
1253     arg[1].Integer.Value = revision;            /* revision */
1254     arg[2].Type = ACPI_TYPE_INTEGER;
1255     arg[2].Integer.Value = count;               /* # of cap integers */
1256     arg[3].Type = ACPI_TYPE_BUFFER;
1257     arg[3].Buffer.Length = count * sizeof(uint32_t); /* capabilities buffer */
1258     arg[3].Buffer.Pointer = (uint8_t *)buf;
1259
1260     status = AcpiEvaluateObject(handle, "_OSC", &arglist, &retbuf);
1261     if (ACPI_FAILURE(status)) {
1262         return (status);
1263     } else {
1264         retobj = retbuf.Pointer;
1265         error = ((uint32_t *)retobj->Buffer.Pointer)[0] &
1266             ~ACPI_OSC_QUERY_SUPPORT;
1267         if (error & ACPI_OSCERR_OSCFAIL) {
1268             device_printf(dev, "_OSC unable to process request\n");
1269             status = AE_ERROR;
1270         }
1271         if (error & ACPI_OSCERR_UUID) {
1272             device_printf(dev, "_OSC unrecognized UUID (%s)\n", uuidstr);
1273             status = AE_ERROR;
1274         }
1275         if (error & ACPI_OSCERR_REVISION) {
1276             device_printf(dev, "_OSC unrecognized revision ID (%d)\n",
1277                 revision);
1278             status = AE_ERROR;
1279         }
1280         if (error & ACPI_OSCERR_CAPSMASKED) {
1281             if (buf[0] & ACPI_OSC_QUERY_SUPPORT)
1282                 goto done;
1283             for (i = 1; i < count; i++) {
1284                 device_printf(dev,
1285                     "_OSC capabilities have been masked: buf[%d]:%#x\n",
1286                     i, buf[i] & ~((uint32_t *)retobj->Buffer.Pointer)[i]);
1287             }
1288             status = AE_SUPPORT;
1289         }
1290     }
1291
1292 done:
1293     AcpiOsFree(retbuf.Pointer);
1294     return (status);
1295 }
1296
1297 /* Probe _HID and _CID for compatible ISA PNP ids. */
1298 static uint32_t
1299 acpi_isa_get_logicalid(device_t dev)
1300 {
1301     ACPI_DEVICE_INFO    *devinfo;
1302     ACPI_HANDLE         h;
1303     uint32_t            pnpid;
1304
1305     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
1306
1307     devinfo = NULL;
1308     pnpid = 0;
1309
1310     /* Fetch and validate the HID. */
1311     if ((h = acpi_get_handle(dev)) == NULL ||
1312         ACPI_FAILURE(AcpiGetObjectInfo(h, &devinfo)))
1313         goto out;
1314
1315     if ((devinfo->Valid & ACPI_VALID_HID) != 0)
1316         pnpid = PNP_EISAID(devinfo->HardwareId.String);
1317
1318 out:
1319     if (devinfo)
1320         AcpiOsFree(devinfo);
1321     return_VALUE (pnpid);
1322 }
1323
1324 static int
1325 acpi_isa_get_compatid(device_t dev, uint32_t *cids, int count)
1326 {
1327     ACPI_DEVICE_INFO    *devinfo;
1328     ACPI_HANDLE         h;
1329     uint32_t            *pnpid;
1330     int                 valid, i;
1331
1332     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
1333
1334     devinfo = NULL;
1335     pnpid = cids;
1336     valid = 0;
1337
1338     /* Fetch and validate the CID */
1339     if ((h = acpi_get_handle(dev)) == NULL ||
1340         ACPI_FAILURE(AcpiGetObjectInfo(h, &devinfo)) ||
1341         (devinfo->Valid & ACPI_VALID_CID) == 0)
1342         goto out;
1343
1344     if (devinfo->CompatibleIdList.Count < count)
1345         count = devinfo->CompatibleIdList.Count;
1346     for (i = 0; i < count; i++) {
1347         if (strncmp(devinfo->CompatibleIdList.Ids[i].String, "PNP", 3) != 0)
1348             continue;
1349         *pnpid++ = PNP_EISAID(devinfo->CompatibleIdList.Ids[i].String);
1350         valid++;
1351     }
1352
1353 out:
1354     if (devinfo)
1355         AcpiOsFree(devinfo);
1356     return_VALUE (valid);
1357 }
1358
1359 static char *
1360 acpi_device_id_probe(device_t bus, device_t dev, char **ids) 
1361 {
1362     ACPI_HANDLE h;
1363     int i;
1364
1365     h = acpi_get_handle(dev);
1366     if (ids == NULL || h == NULL || acpi_get_type(dev) != ACPI_TYPE_DEVICE)
1367         return (NULL);
1368
1369     /* Try to match one of the array of IDs with a HID or CID. */
1370     for (i = 0; ids[i] != NULL; i++) {
1371         if (acpi_MatchHid(h, ids[i]))
1372             return (ids[i]);
1373     }
1374     return (NULL);
1375 }
1376
1377 static ACPI_STATUS
1378 acpi_device_eval_obj(device_t bus, device_t dev, ACPI_STRING pathname,
1379     ACPI_OBJECT_LIST *parameters, ACPI_BUFFER *ret)
1380 {
1381     ACPI_HANDLE h;
1382
1383     if (dev == NULL)
1384         h = ACPI_ROOT_OBJECT;
1385     else if ((h = acpi_get_handle(dev)) == NULL)
1386         return (AE_BAD_PARAMETER);
1387     return (AcpiEvaluateObject(h, pathname, parameters, ret));
1388 }
1389
1390 static int
1391 acpi_device_pwr_for_sleep(device_t bus, device_t dev, int *dstate)
1392 {
1393     struct acpi_softc *sc;
1394     ACPI_HANDLE handle;
1395     ACPI_STATUS status;
1396     char sxd[8];
1397     int error;
1398
1399     sc = device_get_softc(bus);
1400     handle = acpi_get_handle(dev);
1401
1402     /*
1403      * XXX If we find these devices, don't try to power them down.
1404      * The serial and IRDA ports on my T23 hang the system when
1405      * set to D3 and it appears that such legacy devices may
1406      * need special handling in their drivers.
1407      */
1408     if (handle == NULL ||
1409         acpi_MatchHid(handle, "PNP0500") ||
1410         acpi_MatchHid(handle, "PNP0501") ||
1411         acpi_MatchHid(handle, "PNP0502") ||
1412         acpi_MatchHid(handle, "PNP0510") ||
1413         acpi_MatchHid(handle, "PNP0511"))
1414         return (ENXIO);
1415
1416     /*
1417      * Override next state with the value from _SxD, if present.  If no
1418      * dstate argument was provided, don't fetch the return value.
1419      */
1420     ksnprintf(sxd, sizeof(sxd), "_S%dD", sc->acpi_sstate);
1421     if (dstate)
1422         status = acpi_GetInteger(handle, sxd, dstate);
1423     else
1424         status = AcpiEvaluateObject(handle, sxd, NULL, NULL);
1425
1426     switch (status) {
1427     case AE_OK:
1428         error = 0;
1429         break;
1430     case AE_NOT_FOUND:
1431         error = ESRCH;
1432         break;
1433     default:
1434         error = ENXIO;
1435         break;
1436     }
1437
1438     return (error);
1439 }
1440
1441 /* Callback arg for our implementation of walking the namespace. */
1442 struct acpi_device_scan_ctx {
1443     acpi_scan_cb_t      user_fn;
1444     void                *arg;
1445     ACPI_HANDLE         parent;
1446 };
1447
1448 static ACPI_STATUS
1449 acpi_device_scan_cb(ACPI_HANDLE h, UINT32 level, void *arg, void **retval)
1450 {
1451     struct acpi_device_scan_ctx *ctx;
1452     device_t dev, old_dev;
1453     ACPI_STATUS status;
1454     ACPI_OBJECT_TYPE type;
1455
1456     /*
1457      * Skip this device if we think we'll have trouble with it or it is
1458      * the parent where the scan began.
1459      */
1460     ctx = (struct acpi_device_scan_ctx *)arg;
1461     if (acpi_avoid(h) || h == ctx->parent)
1462         return (AE_OK);
1463
1464     /* If this is not a valid device type (e.g., a method), skip it. */
1465     if (ACPI_FAILURE(AcpiGetType(h, &type)))
1466         return (AE_OK);
1467     if (type != ACPI_TYPE_DEVICE && type != ACPI_TYPE_PROCESSOR &&
1468         type != ACPI_TYPE_THERMAL && type != ACPI_TYPE_POWER)
1469         return (AE_OK);
1470
1471     /*
1472      * Call the user function with the current device.  If it is unchanged
1473      * afterwards, return.  Otherwise, we update the handle to the new dev.
1474      */
1475     old_dev = acpi_get_device(h);
1476     dev = old_dev;
1477     status = ctx->user_fn(h, &dev, level, ctx->arg);
1478     if (ACPI_FAILURE(status) || old_dev == dev)
1479         return (status);
1480
1481     /* Remove the old child and its connection to the handle. */
1482     if (old_dev != NULL) {
1483         device_delete_child(device_get_parent(old_dev), old_dev);
1484         AcpiDetachData(h, acpi_fake_objhandler);
1485     }
1486
1487     /* Recreate the handle association if the user created a device. */
1488     if (dev != NULL)
1489         AcpiAttachData(h, acpi_fake_objhandler, dev);
1490
1491     return (AE_OK);
1492 }
1493
1494 static ACPI_STATUS
1495 acpi_device_scan_children(device_t bus, device_t dev, int max_depth,
1496     acpi_scan_cb_t user_fn, void *arg)
1497 {
1498     ACPI_HANDLE h;
1499     struct acpi_device_scan_ctx ctx;
1500
1501     if (acpi_disabled("children"))
1502         return (AE_OK);
1503
1504     if (dev == NULL)
1505         h = ACPI_ROOT_OBJECT;
1506     else if ((h = acpi_get_handle(dev)) == NULL)
1507         return (AE_BAD_PARAMETER);
1508     ctx.user_fn = user_fn;
1509     ctx.arg = arg;
1510     ctx.parent = h;
1511     return (AcpiWalkNamespace(ACPI_TYPE_ANY, h, max_depth,
1512         acpi_device_scan_cb, NULL, &ctx, NULL));
1513 }
1514
1515 /*
1516  * Even though ACPI devices are not PCI, we use the PCI approach for setting
1517  * device power states since it's close enough to ACPI.
1518  */
1519 static int
1520 acpi_set_powerstate_method(device_t bus, device_t child, int state)
1521 {
1522     ACPI_HANDLE h;
1523     ACPI_STATUS status;
1524     int error;
1525
1526     error = 0;
1527     h = acpi_get_handle(child);
1528     if (state < ACPI_STATE_D0 || state > ACPI_STATE_D3)
1529         return (EINVAL);
1530     if (h == NULL)
1531         return (0);
1532
1533     /* Ignore errors if the power methods aren't present. */
1534     status = acpi_pwr_switch_consumer(h, state);
1535     if (ACPI_FAILURE(status) && status != AE_NOT_FOUND
1536         && status != AE_BAD_PARAMETER)
1537         device_printf(bus, "failed to set ACPI power state D%d on %s: %s\n",
1538             state, acpi_name(h), AcpiFormatException(status));
1539
1540     return (error);
1541 }
1542
1543 static int
1544 acpi_isa_pnp_probe(device_t bus, device_t child, struct isa_pnp_id *ids)
1545 {
1546     int                 result, cid_count, i;
1547     uint32_t            lid, cids[8];
1548
1549     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
1550
1551     /*
1552      * ISA-style drivers attached to ACPI may persist and
1553      * probe manually if we return ENOENT.  We never want
1554      * that to happen, so don't ever return it.
1555      */
1556     result = ENXIO;
1557
1558     /* Scan the supplied IDs for a match */
1559     lid = acpi_isa_get_logicalid(child);
1560     cid_count = acpi_isa_get_compatid(child, cids, 8);
1561     while (ids && ids->ip_id) {
1562         if (lid == ids->ip_id) {
1563             result = 0;
1564             goto out;
1565         }
1566         for (i = 0; i < cid_count; i++) {
1567             if (cids[i] == ids->ip_id) {
1568                 result = 0;
1569                 goto out;
1570             }
1571         }
1572         ids++;
1573     }
1574
1575  out:
1576     if (result == 0 && ids->ip_desc)
1577         device_set_desc(child, ids->ip_desc);
1578
1579     return_VALUE (result);
1580 }
1581
1582 /*
1583  * Look for a MCFG table.  If it is present, use the settings for
1584  * domain (segment) 0 to setup PCI config space access via the memory
1585  * map.
1586  */
1587 static void
1588 acpi_enable_pcie(void)
1589 {
1590         ACPI_TABLE_HEADER *hdr;
1591         ACPI_MCFG_ALLOCATION *alloc, *end;
1592         ACPI_STATUS status;
1593
1594         status = AcpiGetTable(ACPI_SIG_MCFG, 1, &hdr);
1595         if (ACPI_FAILURE(status))
1596                 return;
1597
1598         end = (ACPI_MCFG_ALLOCATION *)((char *)hdr + hdr->Length);
1599         alloc = (ACPI_MCFG_ALLOCATION *)((ACPI_TABLE_MCFG *)hdr + 1);
1600         while (alloc < end) {
1601                 if (alloc->PciSegment == 0) {
1602                         pcie_cfgregopen(alloc->Address, alloc->StartBusNumber,
1603                             alloc->EndBusNumber);
1604                         return;
1605                 }
1606                 alloc++;
1607         }
1608 }
1609
1610 /*
1611  * Scan all of the ACPI namespace and attach child devices.
1612  *
1613  * We should only expect to find devices in the \_PR, \_TZ, \_SI, and
1614  * \_SB scopes, and \_PR and \_TZ became obsolete in the ACPI 2.0 spec.
1615  * However, in violation of the spec, some systems place their PCI link
1616  * devices in \, so we have to walk the whole namespace.  We check the
1617  * type of namespace nodes, so this should be ok.
1618  */
1619 static void
1620 acpi_probe_children(device_t bus)
1621 {
1622
1623     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
1624
1625     /*
1626      * Scan the namespace and insert placeholders for all the devices that
1627      * we find.  We also probe/attach any early devices.
1628      *
1629      * Note that we use AcpiWalkNamespace rather than AcpiGetDevices because
1630      * we want to create nodes for all devices, not just those that are
1631      * currently present. (This assumes that we don't want to create/remove
1632      * devices as they appear, which might be smarter.)
1633      */
1634     ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "namespace scan\n"));
1635     AcpiWalkNamespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 100,
1636         acpi_probe_child, NULL, bus, NULL);
1637
1638     /* Pre-allocate resources for our rman from any sysresource devices. */
1639     acpi_sysres_alloc(bus);
1640     /* Create any static children by calling device identify methods. */
1641     ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "device identify routines\n"));
1642     bus_generic_probe(bus);
1643
1644     /* Probe/attach all children, created staticly and from the namespace. */
1645     ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "first bus_generic_attach\n"));
1646     bus_generic_attach(bus);
1647
1648     /*
1649      * Some of these children may have attached others as part of their attach
1650      * process (eg. the root PCI bus driver), so rescan.
1651      */
1652     ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "second bus_generic_attach\n"));
1653     bus_generic_attach(bus);
1654
1655     /* Attach wake sysctls. */
1656     acpi_wake_sysctl_walk(bus);
1657
1658     ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "done attaching children\n"));
1659     return_VOID;
1660 }
1661
1662 /*
1663  * Determine the probe order for a given device.
1664  */
1665 static void
1666 acpi_probe_order(ACPI_HANDLE handle, int *order)
1667 {
1668     ACPI_OBJECT_TYPE type;
1669
1670     /*
1671      * 1. I/O port and memory system resource holders
1672      * 2. Embedded controllers (to handle early accesses)
1673      * 3. PCI Link Devices
1674      * 100000. CPUs
1675      */
1676     AcpiGetType(handle, &type);
1677     if (acpi_MatchHid(handle, "PNP0C01") || acpi_MatchHid(handle, "PNP0C02"))
1678         *order = 1;
1679     else if (acpi_MatchHid(handle, "PNP0C09"))
1680         *order = 2;
1681     else if (acpi_MatchHid(handle, "PNP0C0F"))
1682         *order = 3;
1683     else if (type == ACPI_TYPE_PROCESSOR)
1684         *order = 100000;
1685 }
1686
1687 /*
1688  * Evaluate a child device and determine whether we might attach a device to
1689  * it.
1690  */
1691 static ACPI_STATUS
1692 acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status)
1693 {
1694     struct acpi_prw_data prw;
1695     ACPI_OBJECT_TYPE type;
1696     ACPI_HANDLE h;
1697     device_t bus, child;
1698     int order;
1699     char *handle_str;
1700
1701     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
1702
1703     if (acpi_disabled("children"))
1704         return_ACPI_STATUS (AE_OK);
1705
1706     /* Skip this device if we think we'll have trouble with it. */
1707     if (acpi_avoid(handle))
1708         return_ACPI_STATUS (AE_OK);
1709
1710     bus = (device_t)context;
1711     if (ACPI_SUCCESS(AcpiGetType(handle, &type))) {
1712         handle_str = acpi_name(handle);
1713         switch (type) {
1714         case ACPI_TYPE_DEVICE:
1715             /*
1716              * Since we scan from \, be sure to skip system scope objects.
1717              * \_SB_ and \_TZ_ are defined in ACPICA as devices to work around
1718              * BIOS bugs.  For example, \_SB_ is to allow \_SB_._INI to be run
1719              * during the intialization and \_TZ_ is to support Notify() on it.
1720              */
1721             if (strcmp(handle_str, "\\_SB_") == 0 ||
1722                 strcmp(handle_str, "\\_TZ_") == 0)
1723                 break;
1724
1725             if (acpi_parse_prw(handle, &prw) == 0)
1726                 AcpiSetupGpeForWake(handle, prw.gpe_handle, prw.gpe_bit);
1727
1728             /* FALLTHROUGH */
1729         case ACPI_TYPE_PROCESSOR:
1730         case ACPI_TYPE_THERMAL:
1731         case ACPI_TYPE_POWER:
1732             /* 
1733              * Create a placeholder device for this node.  Sort the
1734              * placeholder so that the probe/attach passes will run
1735              * breadth-first.  Orders less than ACPI_DEV_BASE_ORDER
1736              * are reserved for special objects (i.e., system
1737              * resources).  CPU devices have a very high order to
1738              * ensure they are probed after other devices.
1739              */
1740             ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "scanning '%s'\n", handle_str));
1741             order = level * 10 + 100;
1742             acpi_probe_order(handle, &order);
1743             child = BUS_ADD_CHILD(bus, bus, order, NULL, -1);
1744             if (child == NULL)
1745                 break;
1746
1747             /* Associate the handle with the device_t and vice versa. */
1748             acpi_set_handle(child, handle);
1749             AcpiAttachData(handle, acpi_fake_objhandler, child);
1750
1751             /*
1752              * Check that the device is present.  If it's not present,
1753              * leave it disabled (so that we have a device_t attached to
1754              * the handle, but we don't probe it).
1755              *
1756              * XXX PCI link devices sometimes report "present" but not
1757              * "functional" (i.e. if disabled).  Go ahead and probe them
1758              * anyway since we may enable them later.
1759              */
1760             if (type == ACPI_TYPE_DEVICE && !acpi_DeviceIsPresent(child)) {
1761                 /* Never disable PCI link devices. */
1762                 if (acpi_MatchHid(handle, "PNP0C0F"))
1763                     break;
1764                 /*
1765                  * Docking stations should remain enabled since the system
1766                  * may be undocked at boot.
1767                  */
1768                 if (ACPI_SUCCESS(AcpiGetHandle(handle, "_DCK", &h)))
1769                     break;
1770
1771                 device_disable(child);
1772                 break;
1773             }
1774
1775             /*
1776              * Get the device's resource settings and attach them.
1777              * Note that if the device has _PRS but no _CRS, we need
1778              * to decide when it's appropriate to try to configure the
1779              * device.  Ignore the return value here; it's OK for the
1780              * device not to have any resources.
1781              */
1782             acpi_parse_resources(child, handle, &acpi_res_parse_set, NULL);
1783             break;
1784         }
1785     }
1786
1787     return_ACPI_STATUS (AE_OK);
1788 }
1789
1790 /*
1791  * AcpiAttachData() requires an object handler but never uses it.  This is a
1792  * placeholder object handler so we can store a device_t in an ACPI_HANDLE.
1793  */
1794 void
1795 acpi_fake_objhandler(ACPI_HANDLE h, void *data)
1796 {
1797 }
1798
1799 static void
1800 acpi_shutdown_final(void *arg, int howto)
1801 {
1802     struct acpi_softc *sc;
1803     ACPI_STATUS status;
1804
1805     /*
1806      * XXX Shutdown code should only run on the BSP (cpuid 0).
1807      * Some chipsets do not power off the system correctly if called from
1808      * an AP.
1809      */
1810     sc = arg;
1811     if ((howto & RB_POWEROFF) != 0) {
1812         status = AcpiEnterSleepStatePrep(ACPI_STATE_S5);
1813         if (ACPI_FAILURE(status)) {
1814             device_printf(sc->acpi_dev, "AcpiEnterSleepStatePrep failed - %s\n",
1815                    AcpiFormatException(status));
1816             return;
1817         }
1818         device_printf(sc->acpi_dev, "Powering system off\n");
1819         ACPI_DISABLE_IRQS();
1820         status = AcpiEnterSleepState(ACPI_STATE_S5);
1821         if (ACPI_FAILURE(status)) {
1822             device_printf(sc->acpi_dev, "power-off failed - %s\n",
1823                 AcpiFormatException(status));
1824         } else {
1825             DELAY(1000000);
1826             device_printf(sc->acpi_dev, "power-off failed - timeout\n");
1827         }
1828     } else if ((howto & RB_HALT) == 0 && sc->acpi_handle_reboot) {
1829         /* Reboot using the reset register. */
1830         status = AcpiReset();
1831         if (ACPI_FAILURE(status)) {
1832             if (status != AE_NOT_EXIST)
1833                     device_printf(sc->acpi_dev, "reset failed - %s\n",
1834                         AcpiFormatException(status));
1835         } else {
1836             DELAY(1000000);
1837             device_printf(sc->acpi_dev, "reset failed - timeout\n");
1838         }
1839     } else if (sc->acpi_do_disable && panicstr == NULL) {
1840         /*
1841          * Only disable ACPI if the user requested.  On some systems, writing
1842          * the disable value to SMI_CMD hangs the system.
1843          */
1844         device_printf(sc->acpi_dev, "Shutting down\n");
1845         AcpiTerminate();
1846     }
1847 }
1848
1849 static void
1850 acpi_enable_fixed_events(struct acpi_softc *sc)
1851 {
1852     static int  first_time = 1;
1853
1854     /* Enable and clear fixed events and install handlers. */
1855     if ((AcpiGbl_FADT.Flags & ACPI_FADT_POWER_BUTTON) == 0) {
1856         AcpiClearEvent(ACPI_EVENT_POWER_BUTTON);
1857         AcpiInstallFixedEventHandler(ACPI_EVENT_POWER_BUTTON,
1858                                      acpi_event_power_button_sleep, sc);
1859         if (first_time)
1860             device_printf(sc->acpi_dev, "Power Button (fixed)\n");
1861     }
1862     if ((AcpiGbl_FADT.Flags & ACPI_FADT_SLEEP_BUTTON) == 0) {
1863         AcpiClearEvent(ACPI_EVENT_SLEEP_BUTTON);
1864         AcpiInstallFixedEventHandler(ACPI_EVENT_SLEEP_BUTTON,
1865                                      acpi_event_sleep_button_sleep, sc);
1866         if (first_time)
1867             device_printf(sc->acpi_dev, "Sleep Button (fixed)\n");
1868     }
1869
1870     first_time = 0;
1871 }
1872
1873 /*
1874  * Returns true if the device is actually present and should
1875  * be attached to.  This requires the present, enabled, UI-visible 
1876  * and diagnostics-passed bits to be set.
1877  */
1878 BOOLEAN
1879 acpi_DeviceIsPresent(device_t dev)
1880 {
1881     ACPI_DEVICE_INFO    *devinfo;
1882     ACPI_HANDLE         h;
1883     int                 ret;
1884
1885     ret = FALSE;
1886     if ((h = acpi_get_handle(dev)) == NULL ||
1887         ACPI_FAILURE(AcpiGetObjectInfo(h, &devinfo)))
1888         return (FALSE);
1889
1890     /* If no _STA method, must be present */
1891     if ((devinfo->Valid & ACPI_VALID_STA) == 0)
1892         ret = TRUE;
1893
1894     /* Return true for 'present' and 'functioning' */
1895     if (ACPI_DEVICE_PRESENT(devinfo->CurrentStatus))
1896         ret = TRUE;
1897
1898     AcpiOsFree(devinfo);
1899     return (ret);
1900 }
1901
1902 /*
1903  * Returns true if the battery is actually present and inserted.
1904  */
1905 BOOLEAN
1906 acpi_BatteryIsPresent(device_t dev)
1907 {
1908     ACPI_DEVICE_INFO    *devinfo;
1909     ACPI_HANDLE         h;
1910     int                 ret;
1911
1912     ret = FALSE;
1913     if ((h = acpi_get_handle(dev)) == NULL ||
1914         ACPI_FAILURE(AcpiGetObjectInfo(h, &devinfo)))
1915         return (FALSE);
1916
1917     /* If no _STA method, must be present */
1918     if ((devinfo->Valid & ACPI_VALID_STA) == 0)
1919         ret = TRUE;
1920
1921     /* Return true for 'present', 'battery present', and 'functioning' */
1922     if (ACPI_BATTERY_PRESENT(devinfo->CurrentStatus))
1923         ret = TRUE;
1924
1925     AcpiOsFree(devinfo);
1926     return (ret);
1927 }
1928
1929 /*
1930  * Match a HID string against a handle
1931  */
1932 BOOLEAN
1933 acpi_MatchHid(ACPI_HANDLE h, const char *hid)
1934 {
1935     ACPI_DEVICE_INFO    *devinfo;
1936     int                 ret, i;
1937
1938     ret = FALSE;
1939     if (hid == NULL || h == NULL ||
1940         ACPI_FAILURE(AcpiGetObjectInfo(h, &devinfo)))
1941         return (ret);
1942
1943     if ((devinfo->Valid & ACPI_VALID_HID) != 0 &&
1944         strcmp(hid, devinfo->HardwareId.String) == 0)
1945             ret = TRUE;
1946     else if ((devinfo->Valid & ACPI_VALID_CID) != 0) {
1947         for (i = 0; i < devinfo->CompatibleIdList.Count; i++) {
1948             if (strcmp(hid, devinfo->CompatibleIdList.Ids[i].String) == 0) {
1949                 ret = TRUE;
1950                 break;
1951             }
1952         }
1953     }
1954
1955     AcpiOsFree(devinfo);
1956     return (ret);
1957 }
1958
1959 /*
1960  * Return the handle of a named object within our scope, ie. that of (parent)
1961  * or one if its parents.
1962  */
1963 ACPI_STATUS
1964 acpi_GetHandleInScope(ACPI_HANDLE parent, char *path, ACPI_HANDLE *result)
1965 {
1966     ACPI_HANDLE         r;
1967     ACPI_STATUS         status;
1968
1969     /* Walk back up the tree to the root */
1970     for (;;) {
1971         status = AcpiGetHandle(parent, path, &r);
1972         if (ACPI_SUCCESS(status)) {
1973             *result = r;
1974             return (AE_OK);
1975         }
1976         /* XXX Return error here? */
1977         if (status != AE_NOT_FOUND)
1978             return (AE_OK);
1979         if (ACPI_FAILURE(AcpiGetParent(parent, &r)))
1980             return (AE_NOT_FOUND);
1981         parent = r;
1982     }
1983 }
1984
1985 /*
1986  * Allocate a buffer with a preset data size.
1987  */
1988 ACPI_BUFFER *
1989 acpi_AllocBuffer(int size)
1990 {
1991     ACPI_BUFFER *buf;
1992
1993     if ((buf = kmalloc(size + sizeof(*buf), M_ACPIDEV, M_NOWAIT)) == NULL)
1994         return (NULL);
1995     buf->Length = size;
1996     buf->Pointer = (void *)(buf + 1);
1997     return (buf);
1998 }
1999
2000 ACPI_STATUS
2001 acpi_SetInteger(ACPI_HANDLE handle, char *path, UINT32 number)
2002 {
2003     ACPI_OBJECT arg1;
2004     ACPI_OBJECT_LIST args;
2005
2006     arg1.Type = ACPI_TYPE_INTEGER;
2007     arg1.Integer.Value = number;
2008     args.Count = 1;
2009     args.Pointer = &arg1;
2010
2011     return (AcpiEvaluateObject(handle, path, &args, NULL));
2012 }
2013
2014 /*
2015  * Evaluate a path that should return an integer.
2016  */
2017 ACPI_STATUS
2018 acpi_GetInteger(ACPI_HANDLE handle, char *path, UINT32 *number)
2019 {
2020     ACPI_STATUS status;
2021     ACPI_BUFFER buf;
2022     ACPI_OBJECT param;
2023
2024     if (handle == NULL)
2025         handle = ACPI_ROOT_OBJECT;
2026
2027     /*
2028      * Assume that what we've been pointed at is an Integer object, or
2029      * a method that will return an Integer.
2030      */
2031     buf.Pointer = &param;
2032     buf.Length = sizeof(param);
2033     status = AcpiEvaluateObject(handle, path, NULL, &buf);
2034     if (ACPI_SUCCESS(status)) {
2035         if (param.Type == ACPI_TYPE_INTEGER)
2036             *number = param.Integer.Value;
2037         else
2038             status = AE_TYPE;
2039     }
2040
2041     /* 
2042      * In some applications, a method that's expected to return an Integer
2043      * may instead return a Buffer (probably to simplify some internal
2044      * arithmetic).  We'll try to fetch whatever it is, and if it's a Buffer,
2045      * convert it into an Integer as best we can.
2046      *
2047      * This is a hack.
2048      */
2049     if (status == AE_BUFFER_OVERFLOW) {
2050         if ((buf.Pointer = AcpiOsAllocate(buf.Length)) == NULL) {
2051             status = AE_NO_MEMORY;
2052         } else {
2053             status = AcpiEvaluateObject(handle, path, NULL, &buf);
2054             if (ACPI_SUCCESS(status))
2055                 status = acpi_ConvertBufferToInteger(&buf, number);
2056             AcpiOsFree(buf.Pointer);
2057         }
2058     }
2059     return (status);
2060 }
2061
2062 ACPI_STATUS
2063 acpi_ConvertBufferToInteger(ACPI_BUFFER *bufp, UINT32 *number)
2064 {
2065     ACPI_OBJECT *p;
2066     UINT8       *val;
2067     int         i;
2068
2069     p = (ACPI_OBJECT *)bufp->Pointer;
2070     if (p->Type == ACPI_TYPE_INTEGER) {
2071         *number = p->Integer.Value;
2072         return (AE_OK);
2073     }
2074     if (p->Type != ACPI_TYPE_BUFFER)
2075         return (AE_TYPE);
2076     if (p->Buffer.Length > sizeof(int))
2077         return (AE_BAD_DATA);
2078
2079     *number = 0;
2080     val = p->Buffer.Pointer;
2081     for (i = 0; i < p->Buffer.Length; i++)
2082         *number += val[i] << (i * 8);
2083     return (AE_OK);
2084 }
2085
2086 /*
2087  * Iterate over the elements of an a package object, calling the supplied
2088  * function for each element.
2089  *
2090  * XXX possible enhancement might be to abort traversal on error.
2091  */
2092 ACPI_STATUS
2093 acpi_ForeachPackageObject(ACPI_OBJECT *pkg,
2094         void (*func)(ACPI_OBJECT *comp, void *arg), void *arg)
2095 {
2096     ACPI_OBJECT *comp;
2097     int         i;
2098
2099     if (pkg == NULL || pkg->Type != ACPI_TYPE_PACKAGE)
2100         return (AE_BAD_PARAMETER);
2101
2102     /* Iterate over components */
2103     i = 0;
2104     comp = pkg->Package.Elements;
2105     for (; i < pkg->Package.Count; i++, comp++)
2106         func(comp, arg);
2107
2108     return (AE_OK);
2109 }
2110
2111 /*
2112  * Find the (index)th resource object in a set.
2113  */
2114 ACPI_STATUS
2115 acpi_FindIndexedResource(ACPI_BUFFER *buf, int index, ACPI_RESOURCE **resp)
2116 {
2117     ACPI_RESOURCE       *rp;
2118     int                 i;
2119
2120     rp = (ACPI_RESOURCE *)buf->Pointer;
2121     i = index;
2122     while (i-- > 0) {
2123         /* Range check */
2124         if (rp > (ACPI_RESOURCE *)((uint8_t *)buf->Pointer + buf->Length))
2125             return (AE_BAD_PARAMETER);
2126
2127         /* Check for terminator */
2128         if (rp->Type == ACPI_RESOURCE_TYPE_END_TAG || rp->Length == 0)
2129             return (AE_NOT_FOUND);
2130         rp = ACPI_NEXT_RESOURCE(rp);
2131     }
2132     if (resp != NULL)
2133         *resp = rp;
2134
2135     return (AE_OK);
2136 }
2137
2138 /*
2139  * Append an ACPI_RESOURCE to an ACPI_BUFFER.
2140  *
2141  * Given a pointer to an ACPI_RESOURCE structure, expand the ACPI_BUFFER
2142  * provided to contain it.  If the ACPI_BUFFER is empty, allocate a sensible
2143  * backing block.  If the ACPI_RESOURCE is NULL, return an empty set of
2144  * resources.
2145  */
2146 #define ACPI_INITIAL_RESOURCE_BUFFER_SIZE       512
2147
2148 ACPI_STATUS
2149 acpi_AppendBufferResource(ACPI_BUFFER *buf, ACPI_RESOURCE *res)
2150 {
2151     ACPI_RESOURCE       *rp;
2152     void                *newp;
2153
2154     /* Initialise the buffer if necessary. */
2155     if (buf->Pointer == NULL) {
2156         buf->Length = ACPI_INITIAL_RESOURCE_BUFFER_SIZE;
2157         if ((buf->Pointer = AcpiOsAllocate(buf->Length)) == NULL)
2158             return (AE_NO_MEMORY);
2159         rp = (ACPI_RESOURCE *)buf->Pointer;
2160         rp->Type = ACPI_RESOURCE_TYPE_END_TAG;
2161         rp->Length = ACPI_RS_SIZE_MIN;
2162     }
2163     if (res == NULL)
2164         return (AE_OK);
2165
2166     /*
2167      * Scan the current buffer looking for the terminator.
2168      * This will either find the terminator or hit the end
2169      * of the buffer and return an error.
2170      */
2171     rp = (ACPI_RESOURCE *)buf->Pointer;
2172     for (;;) {
2173         /* Range check, don't go outside the buffer */
2174         if (rp >= (ACPI_RESOURCE *)((uint8_t *)buf->Pointer + buf->Length))
2175             return (AE_BAD_PARAMETER);
2176         if (rp->Type == ACPI_RESOURCE_TYPE_END_TAG || rp->Length == 0)
2177             break;
2178         rp = ACPI_NEXT_RESOURCE(rp);
2179     }
2180
2181     /*
2182      * Check the size of the buffer and expand if required.
2183      *
2184      * Required size is:
2185      *  size of existing resources before terminator + 
2186      *  size of new resource and header +
2187      *  size of terminator.
2188      *
2189      * Note that this loop should really only run once, unless
2190      * for some reason we are stuffing a *really* huge resource.
2191      */
2192     while ((((uint8_t *)rp - (uint8_t *)buf->Pointer) + 
2193             res->Length + ACPI_RS_SIZE_NO_DATA +
2194             ACPI_RS_SIZE_MIN) >= buf->Length) {
2195         if ((newp = AcpiOsAllocate(buf->Length * 2)) == NULL)
2196             return (AE_NO_MEMORY);
2197         bcopy(buf->Pointer, newp, buf->Length);
2198         rp = (ACPI_RESOURCE *)((uint8_t *)newp +
2199                                ((uint8_t *)rp - (uint8_t *)buf->Pointer));
2200         AcpiOsFree(buf->Pointer);
2201         buf->Pointer = newp;
2202         buf->Length += buf->Length;
2203     }
2204
2205     /* Insert the new resource. */
2206     bcopy(res, rp, res->Length + ACPI_RS_SIZE_NO_DATA);
2207
2208     /* And add the terminator. */
2209     rp = ACPI_NEXT_RESOURCE(rp);
2210     rp->Type = ACPI_RESOURCE_TYPE_END_TAG;
2211     rp->Length = ACPI_RS_SIZE_MIN;
2212
2213     return (AE_OK);
2214 }
2215
2216 /*
2217  * Set interrupt model.
2218  */
2219 ACPI_STATUS
2220 acpi_SetIntrModel(int model)
2221 {
2222
2223     return (acpi_SetInteger(ACPI_ROOT_OBJECT, "_PIC", model));
2224 }
2225
2226 /*
2227  * DEPRECATED.  This interface has serious deficiencies and will be
2228  * removed.
2229  *
2230  * Immediately enter the sleep state.  In the old model, acpiconf(8) ran
2231  * rc.suspend and rc.resume so we don't have to notify devd(8) to do this.
2232  */
2233 ACPI_STATUS
2234 acpi_SetSleepState(struct acpi_softc *sc, int state)
2235 {
2236     static int once;
2237
2238     if (!once) {
2239         device_printf(sc->acpi_dev,
2240 "warning: acpi_SetSleepState() deprecated, need to update your software\n");
2241         once = 1;
2242     }
2243     return (acpi_EnterSleepState(sc, state));
2244 }
2245
2246 static void
2247 acpi_sleep_force(void *arg)
2248 {
2249     struct acpi_softc *sc;
2250
2251     sc = arg;
2252     device_printf(sc->acpi_dev,
2253         "suspend request timed out, forcing sleep now\n");
2254     if (ACPI_FAILURE(acpi_EnterSleepState(sc, sc->acpi_next_sstate)))
2255         device_printf(sc->acpi_dev, "force sleep state S%d failed\n",
2256             sc->acpi_next_sstate);
2257 }
2258
2259 /*
2260  * Request that the system enter the given suspend state.  All /dev/apm
2261  * devices and devd(8) will be notified.  Userland then has a chance to
2262  * save state and acknowledge the request.  The system sleeps once all
2263  * acks are in.
2264  */
2265 int
2266 acpi_ReqSleepState(struct acpi_softc *sc, int state)
2267 {
2268 #ifdef notyet
2269     struct apm_clone_data *clone;
2270 #endif
2271
2272     if (state < ACPI_STATE_S1 || state > ACPI_STATE_S5)
2273         return (EINVAL);
2274
2275     /* S5 (soft-off) should be entered directly with no waiting. */
2276     if (state == ACPI_STATE_S5) {
2277         if (ACPI_SUCCESS(acpi_EnterSleepState(sc, state)))
2278             return (0);
2279         else
2280             return (ENXIO);
2281     }
2282
2283 #if !defined(__i386__)
2284     /* This platform does not support acpi suspend/resume. */
2285     return (EOPNOTSUPP);
2286 #endif
2287
2288     /* If a suspend request is already in progress, just return. */
2289     ACPI_LOCK(acpi);
2290     if (sc->acpi_next_sstate != 0) {
2291         ACPI_UNLOCK(acpi);
2292         return (0);
2293     }
2294
2295     /* Record the pending state and notify all apm devices. */
2296     sc->acpi_next_sstate = state;
2297 #if 0
2298     STAILQ_FOREACH(clone, &sc->apm_cdevs, entries) {
2299         clone->notify_status = APM_EV_NONE;
2300         if ((clone->flags & ACPI_EVF_DEVD) == 0) {
2301             KNOTE(&clone->sel_read.si_note, 0);
2302         }
2303     }
2304 #endif
2305
2306     /* If devd(8) is not running, immediately enter the sleep state. */
2307     if (devctl_process_running() == FALSE) {
2308         ACPI_UNLOCK(acpi);
2309         if (ACPI_SUCCESS(acpi_EnterSleepState(sc, sc->acpi_next_sstate))) {
2310             return (0);
2311         } else {
2312             return (ENXIO);
2313         }
2314     }
2315
2316     /* Now notify devd(8) also. */
2317     acpi_UserNotify("Suspend", ACPI_ROOT_OBJECT, state);
2318
2319     /*
2320      * Set a timeout to fire if userland doesn't ack the suspend request
2321      * in time.  This way we still eventually go to sleep if we were
2322      * overheating or running low on battery, even if userland is hung.
2323      * We cancel this timeout once all userland acks are in or the
2324      * suspend request is aborted.
2325      */
2326     callout_reset(&sc->susp_force_to, 10 * hz, acpi_sleep_force, sc);
2327     ACPI_UNLOCK(acpi);
2328     return (0);
2329 }
2330
2331 /*
2332  * Acknowledge (or reject) a pending sleep state.  The caller has
2333  * prepared for suspend and is now ready for it to proceed.  If the
2334  * error argument is non-zero, it indicates suspend should be cancelled
2335  * and gives an errno value describing why.  Once all votes are in,
2336  * we suspend the system.
2337  */
2338 int
2339 acpi_AckSleepState(struct apm_clone_data *clone, int error)
2340 {
2341     struct acpi_softc *sc;
2342     int ret, sleeping;
2343
2344 #if !defined(__i386__)
2345     /* This platform does not support acpi suspend/resume. */
2346     return (EOPNOTSUPP);
2347 #endif
2348
2349     /* If no pending sleep state, return an error. */
2350     ACPI_LOCK(acpi);
2351     sc = clone->acpi_sc;
2352     if (sc->acpi_next_sstate == 0) {
2353         ACPI_UNLOCK(acpi);
2354         return (ENXIO);
2355     }
2356
2357     /* Caller wants to abort suspend process. */
2358     if (error) {
2359         sc->acpi_next_sstate = 0;
2360         callout_stop(&sc->susp_force_to);
2361         device_printf(sc->acpi_dev,
2362             "listener on %s cancelled the pending suspend\n",
2363             devtoname(clone->cdev));
2364         ACPI_UNLOCK(acpi);
2365         return (0);
2366     }
2367
2368     /*
2369      * Mark this device as acking the suspend request.  Then, walk through
2370      * all devices, seeing if they agree yet.  We only count devices that
2371      * are writable since read-only devices couldn't ack the request.
2372      */
2373     clone->notify_status = APM_EV_ACKED;
2374     sleeping = TRUE;
2375     STAILQ_FOREACH(clone, &sc->apm_cdevs, entries) {
2376         if ((clone->flags & ACPI_EVF_WRITE) != 0 &&
2377             clone->notify_status != APM_EV_ACKED) {
2378             sleeping = FALSE;
2379             break;
2380         }
2381     }
2382
2383     /* If all devices have voted "yes", we will suspend now. */
2384     if (sleeping)
2385         callout_stop(&sc->susp_force_to);
2386     ACPI_UNLOCK(acpi);
2387     ret = 0;
2388     if (sleeping) {
2389         if (ACPI_FAILURE(acpi_EnterSleepState(sc, sc->acpi_next_sstate)))
2390                 ret = ENODEV;
2391     }
2392
2393     return (ret);
2394 }
2395
2396 static void
2397 acpi_sleep_enable(void *arg)
2398 {
2399     ((struct acpi_softc *)arg)->acpi_sleep_disabled = 0;
2400 }
2401
2402 enum acpi_sleep_state {
2403     ACPI_SS_NONE,
2404     ACPI_SS_GPE_SET,
2405     ACPI_SS_DEV_SUSPEND,
2406     ACPI_SS_SLP_PREP,
2407     ACPI_SS_SLEPT,
2408 };
2409
2410 /*
2411  * Enter the desired system sleep state.
2412  *
2413  * Currently we support S1-S5 but S4 is only S4BIOS
2414  */
2415 static ACPI_STATUS
2416 acpi_EnterSleepState(struct acpi_softc *sc, int state)
2417 {
2418     ACPI_STATUS status;
2419     UINT8       TypeA;
2420     UINT8       TypeB;
2421     enum acpi_sleep_state slp_state;
2422
2423     ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, state);
2424
2425     /* Re-entry once we're suspending is not allowed. */
2426     status = AE_OK;
2427     ACPI_LOCK(acpi);
2428     if (sc->acpi_sleep_disabled) {
2429         ACPI_UNLOCK(acpi);
2430         device_printf(sc->acpi_dev,
2431             "suspend request ignored (not ready yet)\n");
2432         return (AE_ERROR);
2433     }
2434     sc->acpi_sleep_disabled = 1;
2435     ACPI_UNLOCK(acpi);
2436
2437     /*
2438      * Be sure to hold Giant across DEVICE_SUSPEND/RESUME since non-MPSAFE
2439      * drivers need this.
2440      */
2441     //get_mplock();
2442     slp_state = ACPI_SS_NONE;
2443     switch (state) {
2444     case ACPI_STATE_S1:
2445     case ACPI_STATE_S2:
2446     case ACPI_STATE_S3:
2447     case ACPI_STATE_S4:
2448         status = AcpiGetSleepTypeData(state, &TypeA, &TypeB);
2449         if (status == AE_NOT_FOUND) {
2450             device_printf(sc->acpi_dev,
2451                           "Sleep state S%d not supported by BIOS\n", state);
2452             break;
2453         } else if (ACPI_FAILURE(status)) {
2454             device_printf(sc->acpi_dev, "AcpiGetSleepTypeData failed - %s\n",
2455                           AcpiFormatException(status));
2456             break;
2457         }
2458
2459         sc->acpi_sstate = state;
2460
2461         /* Enable any GPEs as appropriate and requested by the user. */
2462         acpi_wake_prep_walk(state);
2463         slp_state = ACPI_SS_GPE_SET;
2464
2465         /*
2466          * Inform all devices that we are going to sleep.  If at least one
2467          * device fails, DEVICE_SUSPEND() automatically resumes the tree.
2468          *
2469          * XXX Note that a better two-pass approach with a 'veto' pass
2470          * followed by a "real thing" pass would be better, but the current
2471          * bus interface does not provide for this.
2472          */
2473         if (DEVICE_SUSPEND(root_bus) != 0) {
2474             device_printf(sc->acpi_dev, "device_suspend failed\n");
2475             break;
2476         }
2477         slp_state = ACPI_SS_DEV_SUSPEND;
2478
2479         /* If testing device suspend only, back out of everything here. */
2480         if (acpi_susp_bounce)
2481             break;
2482
2483         status = AcpiEnterSleepStatePrep(state);
2484         if (ACPI_FAILURE(status)) {
2485             device_printf(sc->acpi_dev, "AcpiEnterSleepStatePrep failed - %s\n",
2486                           AcpiFormatException(status));
2487             break;
2488         }
2489         slp_state = ACPI_SS_SLP_PREP;
2490
2491         if (sc->acpi_sleep_delay > 0)
2492             DELAY(sc->acpi_sleep_delay * 1000000);
2493
2494         if (state != ACPI_STATE_S1) {
2495             acpi_sleep_machdep(sc, state);
2496
2497             /* Re-enable ACPI hardware on wakeup from sleep state 4. */
2498             if (state == ACPI_STATE_S4)
2499                 AcpiEnable();
2500         } else {
2501             ACPI_DISABLE_IRQS();
2502             status = AcpiEnterSleepState(state);
2503             if (ACPI_FAILURE(status)) {
2504                 device_printf(sc->acpi_dev, "AcpiEnterSleepState failed - %s\n",
2505                               AcpiFormatException(status));
2506                 break;
2507             }
2508         }
2509         slp_state = ACPI_SS_SLEPT;
2510         break;
2511     case ACPI_STATE_S5:
2512         /*
2513          * Shut down cleanly and power off.  This will call us back through the
2514          * shutdown handlers.
2515          */
2516         shutdown_nice(RB_POWEROFF);
2517         break;
2518     case ACPI_STATE_S0:
2519     default:
2520         status = AE_BAD_PARAMETER;
2521         break;
2522     }
2523
2524     /*
2525      * Back out state according to how far along we got in the suspend
2526      * process.  This handles both the error and success cases.
2527      */
2528     sc->acpi_next_sstate = 0;
2529     if (slp_state >= ACPI_SS_GPE_SET) {
2530         acpi_wake_prep_walk(state);
2531         sc->acpi_sstate = ACPI_STATE_S0;
2532     }
2533     if (slp_state >= ACPI_SS_SLP_PREP)
2534         AcpiLeaveSleepState(state);
2535     if (slp_state >= ACPI_SS_DEV_SUSPEND)
2536         DEVICE_RESUME(root_bus);
2537     if (slp_state >= ACPI_SS_SLEPT)
2538         acpi_enable_fixed_events(sc);
2539
2540     /* Allow another sleep request after a while. */
2541     /* XXX: needs timeout */
2542     if (state != ACPI_STATE_S5)
2543               acpi_sleep_enable(sc);
2544
2545     /* Run /etc/rc.resume after we are back. */
2546     acpi_UserNotify("Resume", ACPI_ROOT_OBJECT, state);
2547
2548     //rel_mplock();
2549     return_ACPI_STATUS (status);
2550 }
2551
2552 /* Enable or disable the device's GPE. */
2553 int
2554 acpi_wake_set_enable(device_t dev, int enable)
2555 {
2556     struct acpi_prw_data prw;
2557     ACPI_STATUS status;
2558     int flags;
2559
2560     /* Make sure the device supports waking the system and get the GPE. */
2561     if (acpi_parse_prw(acpi_get_handle(dev), &prw) != 0)
2562         return (ENXIO);
2563
2564     flags = acpi_get_flags(dev);
2565     if (enable) {
2566         status = AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit,
2567                                     ACPI_GPE_ENABLE);
2568         if (ACPI_FAILURE(status)) {
2569             device_printf(dev, "enable wake failed\n");
2570             return (ENXIO);
2571         }
2572         acpi_set_flags(dev, flags | ACPI_FLAG_WAKE_ENABLED);
2573     } else {
2574         status = AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit,
2575                                     ACPI_GPE_DISABLE);
2576         if (ACPI_FAILURE(status)) {
2577             device_printf(dev, "disable wake failed\n");
2578             return (ENXIO);
2579         }
2580         acpi_set_flags(dev, flags & ~ACPI_FLAG_WAKE_ENABLED);
2581     }
2582
2583     return (0);
2584 }
2585
2586 static int
2587 acpi_wake_sleep_prep(ACPI_HANDLE handle, int sstate)
2588 {
2589     struct acpi_prw_data prw;
2590     device_t dev;
2591
2592     /* Check that this is a wake-capable device and get its GPE. */
2593     if (acpi_parse_prw(handle, &prw) != 0)
2594         return (ENXIO);
2595     dev = acpi_get_device(handle);
2596
2597     /*
2598      * The destination sleep state must be less than (i.e., higher power)
2599      * or equal to the value specified by _PRW.  If this GPE cannot be
2600      * enabled for the next sleep state, then disable it.  If it can and
2601      * the user requested it be enabled, turn on any required power resources
2602      * and set _PSW.
2603      */
2604     if (sstate > prw.lowest_wake) {
2605         AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit, ACPI_GPE_DISABLE);
2606         if (bootverbose)
2607             device_printf(dev, "wake_prep disabled wake for %s (S%d)\n",
2608                 acpi_name(handle), sstate);
2609     } else if (dev && (acpi_get_flags(dev) & ACPI_FLAG_WAKE_ENABLED) != 0) {
2610         acpi_pwr_wake_enable(handle, 1);
2611         acpi_SetInteger(handle, "_PSW", 1);
2612         if (bootverbose)
2613             device_printf(dev, "wake_prep enabled for %s (S%d)\n",
2614                 acpi_name(handle), sstate);
2615     }
2616
2617     return (0);
2618 }
2619
2620 static int
2621 acpi_wake_run_prep(ACPI_HANDLE handle, int sstate)
2622 {
2623     struct acpi_prw_data prw;
2624     device_t dev;
2625
2626     /*
2627      * Check that this is a wake-capable device and get its GPE.  Return
2628      * now if the user didn't enable this device for wake.
2629      */
2630     if (acpi_parse_prw(handle, &prw) != 0)
2631         return (ENXIO);
2632     dev = acpi_get_device(handle);
2633     if (dev == NULL || (acpi_get_flags(dev) & ACPI_FLAG_WAKE_ENABLED) == 0)
2634         return (0);
2635
2636     /*
2637      * If this GPE couldn't be enabled for the previous sleep state, it was
2638      * disabled before going to sleep so re-enable it.  If it was enabled,
2639      * clear _PSW and turn off any power resources it used.
2640      */
2641     if (sstate > prw.lowest_wake) {
2642         AcpiSetGpeWakeMask(prw.gpe_handle, prw.gpe_bit, ACPI_GPE_ENABLE);
2643         if (bootverbose)
2644             device_printf(dev, "run_prep re-enabled %s\n", acpi_name(handle));
2645     } else {
2646         acpi_SetInteger(handle, "_PSW", 0);
2647         acpi_pwr_wake_enable(handle, 0);
2648         if (bootverbose)
2649             device_printf(dev, "run_prep cleaned up for %s\n",
2650                 acpi_name(handle));
2651     }
2652
2653     return (0);
2654 }
2655
2656 static ACPI_STATUS
2657 acpi_wake_prep(ACPI_HANDLE handle, UINT32 level, void *context, void **status)
2658 {
2659     int sstate;
2660
2661     /* If suspending, run the sleep prep function, otherwise wake. */
2662     sstate = *(int *)context;
2663     if (AcpiGbl_SystemAwakeAndRunning)
2664         acpi_wake_sleep_prep(handle, sstate);
2665     else
2666         acpi_wake_run_prep(handle, sstate);
2667     return (AE_OK);
2668 }
2669
2670 /* Walk the tree rooted at acpi0 to prep devices for suspend/resume. */
2671 static int
2672 acpi_wake_prep_walk(int sstate)
2673 {
2674     ACPI_HANDLE sb_handle;
2675
2676     if (ACPI_SUCCESS(AcpiGetHandle(ACPI_ROOT_OBJECT, "\\_SB_", &sb_handle))) {
2677         AcpiWalkNamespace(ACPI_TYPE_DEVICE, sb_handle, 100,
2678             acpi_wake_prep, NULL, &sstate, NULL);
2679     }
2680     return (0);
2681 }
2682
2683 /* Walk the tree rooted at acpi0 to attach per-device wake sysctls. */
2684 static int
2685 acpi_wake_sysctl_walk(device_t dev)
2686 {
2687 #ifdef notyet
2688     int error, i, numdevs;
2689     device_t *devlist;
2690     device_t child;
2691     ACPI_STATUS status;
2692
2693     error = device_get_children(dev, &devlist, &numdevs);
2694     if (error != 0 || numdevs == 0) {
2695         if (numdevs == 0)
2696             kfree(devlist, M_TEMP);
2697         return (error);
2698     }
2699     for (i = 0; i < numdevs; i++) {
2700         child = devlist[i];
2701         acpi_wake_sysctl_walk(child);
2702         if (!device_is_attached(child))
2703             continue;
2704         status = AcpiEvaluateObject(acpi_get_handle(child), "_PRW", NULL, NULL);
2705         if (ACPI_SUCCESS(status)) {
2706             SYSCTL_ADD_PROC(device_get_sysctl_ctx(child),
2707                 SYSCTL_CHILDREN(device_get_sysctl_tree(child)), OID_AUTO,
2708                 "wake", CTLTYPE_INT | CTLFLAG_RW, child, 0,
2709                 acpi_wake_set_sysctl, "I", "Device set to wake the system");
2710         }
2711     }
2712     kfree(devlist, M_TEMP);
2713 #endif
2714
2715     return (0);
2716 }
2717
2718 #ifdef notyet
2719 /* Enable or disable wake from userland. */
2720 static int
2721 acpi_wake_set_sysctl(SYSCTL_HANDLER_ARGS)
2722 {
2723     int enable, error;
2724     device_t dev;
2725
2726     dev = (device_t)arg1;
2727     enable = (acpi_get_flags(dev) & ACPI_FLAG_WAKE_ENABLED) ? 1 : 0;
2728
2729     error = sysctl_handle_int(oidp, &enable, 0, req);
2730     if (error != 0 || req->newptr == NULL)
2731         return (error);
2732     if (enable != 0 && enable != 1)
2733         return (EINVAL);
2734
2735     return (acpi_wake_set_enable(dev, enable));
2736 }
2737 #endif
2738
2739 /* Parse a device's _PRW into a structure. */
2740 int
2741 acpi_parse_prw(ACPI_HANDLE h, struct acpi_prw_data *prw)
2742 {
2743     ACPI_STATUS                 status;
2744     ACPI_BUFFER                 prw_buffer;
2745     ACPI_OBJECT                 *res, *res2;
2746     int                         error, i, power_count;
2747
2748     if (h == NULL || prw == NULL)
2749         return (EINVAL);
2750
2751     /*
2752      * The _PRW object (7.2.9) is only required for devices that have the
2753      * ability to wake the system from a sleeping state.
2754      */
2755     error = EINVAL;
2756     prw_buffer.Pointer = NULL;
2757     prw_buffer.Length = ACPI_ALLOCATE_BUFFER;
2758     status = AcpiEvaluateObject(h, "_PRW", NULL, &prw_buffer);
2759     if (ACPI_FAILURE(status))
2760         return (ENOENT);
2761     res = (ACPI_OBJECT *)prw_buffer.Pointer;
2762     if (res == NULL)
2763         return (ENOENT);
2764     if (!ACPI_PKG_VALID(res, 2))
2765         goto out;
2766
2767     /*
2768      * Element 1 of the _PRW object:
2769      * The lowest power system sleeping state that can be entered while still
2770      * providing wake functionality.  The sleeping state being entered must
2771      * be less than (i.e., higher power) or equal to this value.
2772      */
2773     if (acpi_PkgInt32(res, 1, &prw->lowest_wake) != 0)
2774         goto out;
2775
2776     /*
2777      * Element 0 of the _PRW object:
2778      */
2779     switch (res->Package.Elements[0].Type) {
2780     case ACPI_TYPE_INTEGER:
2781         /*
2782          * If the data type of this package element is numeric, then this
2783          * _PRW package element is the bit index in the GPEx_EN, in the
2784          * GPE blocks described in the FADT, of the enable bit that is
2785          * enabled for the wake event.
2786          */
2787         prw->gpe_handle = NULL;
2788         prw->gpe_bit = res->Package.Elements[0].Integer.Value;
2789         error = 0;
2790         break;
2791     case ACPI_TYPE_PACKAGE:
2792         /*
2793          * If the data type of this package element is a package, then this
2794          * _PRW package element is itself a package containing two
2795          * elements.  The first is an object reference to the GPE Block
2796          * device that contains the GPE that will be triggered by the wake
2797          * event.  The second element is numeric and it contains the bit
2798          * index in the GPEx_EN, in the GPE Block referenced by the
2799          * first element in the package, of the enable bit that is enabled for
2800          * the wake event.
2801          *
2802          * For example, if this field is a package then it is of the form:
2803          * Package() {\_SB.PCI0.ISA.GPE, 2}
2804          */
2805         res2 = &res->Package.Elements[0];
2806         if (!ACPI_PKG_VALID(res2, 2))
2807             goto out;
2808         prw->gpe_handle = acpi_GetReference(NULL, &res2->Package.Elements[0]);
2809         if (prw->gpe_handle == NULL)
2810             goto out;
2811         if (acpi_PkgInt32(res2, 1, &prw->gpe_bit) != 0)
2812             goto out;
2813         error = 0;
2814         break;
2815     default:
2816         goto out;
2817     }
2818
2819     /* Elements 2 to N of the _PRW object are power resources. */
2820     power_count = res->Package.Count - 2;
2821     if (power_count > ACPI_PRW_MAX_POWERRES) {
2822         kprintf("ACPI device %s has too many power resources\n", acpi_name(h));
2823         power_count = 0;
2824     }
2825     prw->power_res_count = power_count;
2826     for (i = 0; i < power_count; i++)
2827         prw->power_res[i] = res->Package.Elements[i];
2828
2829 out:
2830     if (prw_buffer.Pointer != NULL)
2831         AcpiOsFree(prw_buffer.Pointer);
2832     return (error);
2833 }
2834
2835 /*
2836  * ACPI Event Handlers
2837  */
2838
2839 /* System Event Handlers (registered by EVENTHANDLER_REGISTER) */
2840
2841 static void
2842 acpi_system_eventhandler_sleep(void *arg, int state)
2843 {
2844     struct acpi_softc *sc;
2845     int ret;
2846
2847     ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, state);
2848
2849     sc = arg;
2850
2851     /* Check if button action is disabled. */
2852     if (state == ACPI_S_STATES_MAX + 1)
2853         return;
2854
2855     /* Request that the system prepare to enter the given suspend state. */
2856     ret = acpi_ReqSleepState((struct acpi_softc *)arg, state);
2857     if (ret != 0)
2858         device_printf(sc->acpi_dev,
2859             "request to enter state S%d failed (err %d)\n", state, ret);
2860
2861     return_VOID;
2862 }
2863
2864 static void
2865 acpi_system_eventhandler_wakeup(void *arg, int state)
2866 {
2867
2868     ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__, state);
2869
2870     /* Currently, nothing to do for wakeup. */
2871
2872     return_VOID;
2873 }
2874
2875 /* 
2876  * ACPICA Event Handlers (FixedEvent, also called from button notify handler)
2877  */
2878 UINT32
2879 acpi_event_power_button_sleep(void *context)
2880 {
2881     struct acpi_softc   *sc = (struct acpi_softc *)context;
2882
2883     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
2884
2885     EVENTHANDLER_INVOKE(acpi_sleep_event, sc->acpi_power_button_sx);
2886
2887     return_VALUE (ACPI_INTERRUPT_HANDLED);
2888 }
2889
2890 UINT32
2891 acpi_event_power_button_wake(void *context)
2892 {
2893     struct acpi_softc   *sc = (struct acpi_softc *)context;
2894
2895     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
2896
2897     EVENTHANDLER_INVOKE(acpi_wakeup_event, sc->acpi_power_button_sx);
2898
2899     return_VALUE (ACPI_INTERRUPT_HANDLED);
2900 }
2901
2902 UINT32
2903 acpi_event_sleep_button_sleep(void *context)
2904 {
2905     struct acpi_softc   *sc = (struct acpi_softc *)context;
2906
2907     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
2908
2909     EVENTHANDLER_INVOKE(acpi_sleep_event, sc->acpi_sleep_button_sx);
2910
2911     return_VALUE (ACPI_INTERRUPT_HANDLED);
2912 }
2913
2914 UINT32
2915 acpi_event_sleep_button_wake(void *context)
2916 {
2917     struct acpi_softc   *sc = (struct acpi_softc *)context;
2918
2919     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
2920
2921     EVENTHANDLER_INVOKE(acpi_wakeup_event, sc->acpi_sleep_button_sx);
2922
2923     return_VALUE (ACPI_INTERRUPT_HANDLED);
2924 }
2925
2926 /*
2927  * XXX This static buffer is suboptimal.  There is no locking so only
2928  * use this for single-threaded callers.
2929  */
2930 char *
2931 acpi_name(ACPI_HANDLE handle)
2932 {
2933     ACPI_BUFFER buf;
2934     static char data[256];
2935
2936     buf.Length = sizeof(data);
2937     buf.Pointer = data;
2938
2939     if (handle && ACPI_SUCCESS(AcpiGetName(handle, ACPI_FULL_PATHNAME, &buf)))
2940         return (data);
2941     return ("(unknown)");
2942 }
2943
2944 /*
2945  * Debugging/bug-avoidance.  Avoid trying to fetch info on various
2946  * parts of the namespace.
2947  */
2948 int
2949 acpi_avoid(ACPI_HANDLE handle)
2950 {
2951     char        *cp, *env, *np;
2952     int         len;
2953
2954     np = acpi_name(handle);
2955     if (*np == '\\')
2956         np++;
2957     if ((env = kgetenv("debug.acpi.avoid")) == NULL)
2958         return (0);
2959
2960     /* Scan the avoid list checking for a match */
2961     cp = env;
2962     for (;;) {
2963         while (*cp != 0 && isspace(*cp))
2964             cp++;
2965         if (*cp == 0)
2966             break;
2967         len = 0;
2968         while (cp[len] != 0 && !isspace(cp[len]))
2969             len++;
2970         if (!strncmp(cp, np, len)) {
2971             kfreeenv(env);
2972             return(1);
2973         }
2974         cp += len;
2975     }
2976     kfreeenv(env);
2977
2978     return (0);
2979 }
2980
2981 /*
2982  * Debugging/bug-avoidance.  Disable ACPI subsystem components.
2983  */
2984 int
2985 acpi_disabled(char *subsys)
2986 {
2987     char        *cp, *env;
2988     int         len;
2989
2990     if ((env = kgetenv("debug.acpi.disabled")) == NULL)
2991         return (0);
2992     if (strcmp(env, "all") == 0) {
2993         kfreeenv(env);
2994         return (1);
2995     }
2996
2997     /* Scan the disable list, checking for a match. */
2998     cp = env;
2999     for (;;) {
3000         while (*cp != '\0' && isspace(*cp))
3001             cp++;
3002         if (*cp == '\0')
3003             break;
3004         len = 0;
3005         while (cp[len] != '\0' && !isspace(cp[len]))
3006             len++;
3007         if (strncmp(cp, subsys, len) == 0) {
3008             kfreeenv(env);
3009             return (1);
3010         }
3011         cp += len;
3012     }
3013     kfreeenv(env);
3014
3015     return (0);
3016 }
3017
3018 /*
3019  * Debugging/bug-avoidance.  Enable ACPI subsystem components.  Most 
3020  * components are enabled by default.  The ones that are not have to be 
3021  * enabled via debug.acpi.enabled.
3022  */
3023 int
3024 acpi_enabled(char *subsys)
3025 {
3026     char        *cp, *env;
3027     int         len;
3028
3029     if ((env = kgetenv("debug.acpi.enabled")) == NULL)
3030         return (0);
3031     if (strcmp(env, "all") == 0) {
3032         kfreeenv(env);
3033         return (1);
3034     }
3035
3036     /* Scan the enable list, checking for a match. */
3037     cp = env;
3038     for (;;) {
3039         while (*cp != '\0' && isspace(*cp))
3040             cp++;
3041         if (*cp == '\0')
3042             break;
3043         len = 0;
3044         while (cp[len] != '\0' && !isspace(cp[len]))
3045             len++;
3046         if (strncmp(cp, subsys, len) == 0) {
3047             kfreeenv(env);
3048             return (1);
3049         }
3050         cp += len;
3051     }
3052     kfreeenv(env);
3053
3054     return (0);
3055 }
3056
3057 /*
3058  * Control interface.
3059  *
3060  * We multiplex ioctls for all participating ACPI devices here.  Individual 
3061  * drivers wanting to be accessible via /dev/acpi should use the
3062  * register/deregister interface to make their handlers visible.
3063  */
3064 struct acpi_ioctl_hook
3065 {
3066     TAILQ_ENTRY(acpi_ioctl_hook) link;
3067     u_long                       cmd;
3068     acpi_ioctl_fn                fn;
3069     void                         *arg;
3070 };
3071
3072 static TAILQ_HEAD(,acpi_ioctl_hook)     acpi_ioctl_hooks;
3073 static int                              acpi_ioctl_hooks_initted;
3074
3075 int
3076 acpi_register_ioctl(u_long cmd, acpi_ioctl_fn fn, void *arg)
3077 {
3078     struct acpi_ioctl_hook      *hp;
3079
3080     if ((hp = kmalloc(sizeof(*hp), M_ACPIDEV, M_NOWAIT)) == NULL)
3081         return (ENOMEM);
3082     hp->cmd = cmd;
3083     hp->fn = fn;
3084     hp->arg = arg;
3085
3086     ACPI_LOCK(acpi);
3087     if (acpi_ioctl_hooks_initted == 0) {
3088         TAILQ_INIT(&acpi_ioctl_hooks);
3089         acpi_ioctl_hooks_initted = 1;
3090     }
3091     TAILQ_INSERT_TAIL(&acpi_ioctl_hooks, hp, link);
3092     ACPI_UNLOCK(acpi);
3093
3094     return (0);
3095 }
3096
3097 void
3098 acpi_deregister_ioctl(u_long cmd, acpi_ioctl_fn fn)
3099 {
3100     struct acpi_ioctl_hook      *hp;
3101
3102     ACPI_LOCK(acpi);
3103     TAILQ_FOREACH(hp, &acpi_ioctl_hooks, link)
3104         if (hp->cmd == cmd && hp->fn == fn)
3105             break;
3106
3107     if (hp != NULL) {
3108         TAILQ_REMOVE(&acpi_ioctl_hooks, hp, link);
3109         kfree(hp, M_ACPIDEV);
3110     }
3111     ACPI_UNLOCK(acpi);
3112 }
3113
3114 static int
3115 acpiopen(struct dev_open_args *ap)
3116 {
3117     return (0);
3118 }
3119
3120 static int
3121 acpiclose(struct dev_close_args *ap)
3122 {
3123     return (0);
3124 }
3125
3126 static int
3127 acpiioctl(struct dev_ioctl_args *ap)
3128 {
3129     struct acpi_softc           *sc;
3130     struct acpi_ioctl_hook      *hp;
3131     int                         error, state;
3132
3133     error = 0;
3134     hp = NULL;
3135     sc = ap->a_head.a_dev->si_drv1;
3136
3137     /*
3138      * Scan the list of registered ioctls, looking for handlers.
3139      */
3140     ACPI_LOCK(acpi);
3141     if (acpi_ioctl_hooks_initted)
3142         TAILQ_FOREACH(hp, &acpi_ioctl_hooks, link) {
3143             if (hp->cmd == ap->a_cmd)
3144                 break;
3145         }
3146     ACPI_UNLOCK(acpi);
3147     if (hp)
3148         return (hp->fn(ap->a_cmd, ap->a_data, hp->arg));
3149
3150     /*
3151      * Core ioctls are not permitted for non-writable user.
3152      * Currently, other ioctls just fetch information.
3153      * Not changing system behavior.
3154      */
3155     if ((ap->a_fflag & FWRITE) == 0)
3156         return (EPERM);
3157
3158     /* Core system ioctls. */
3159     switch (ap->a_cmd) {
3160     case ACPIIO_REQSLPSTATE:
3161         state = *(int *)ap->a_data;
3162         if (state != ACPI_STATE_S5)
3163             error = acpi_ReqSleepState(sc, state);
3164         else {
3165             device_printf(sc->acpi_dev,
3166                 "power off via acpi ioctl not supported\n");
3167             error = ENXIO;
3168         }
3169         break;
3170     case ACPIIO_ACKSLPSTATE:
3171         error = EOPNOTSUPP;
3172 #if 0 /* notyet */
3173         error = *(int *)ap->a_data;
3174         error = acpi_AckSleepState(sc->acpi_clone, error);
3175 #endif
3176         break;
3177     case ACPIIO_SETSLPSTATE:    /* DEPRECATED */
3178         error = EINVAL;
3179         state = *(int *)ap->a_data;
3180         if (state >= ACPI_STATE_S0 && state <= ACPI_S_STATES_MAX)
3181             if (ACPI_SUCCESS(acpi_SetSleepState(sc, state)))
3182                 error = 0;
3183         break;
3184     default:
3185         error = ENXIO;
3186         break;
3187     }
3188     return (error);
3189 }
3190
3191 static int
3192 acpi_supported_sleep_state_sysctl(SYSCTL_HANDLER_ARGS)
3193 {
3194     int error;
3195     struct sbuf sb;
3196     UINT8 state, TypeA, TypeB;
3197
3198     sbuf_new(&sb, NULL, 32, SBUF_AUTOEXTEND);
3199     for (state = ACPI_STATE_S1; state < ACPI_S_STATES_MAX + 1; state++)
3200         if (ACPI_SUCCESS(AcpiGetSleepTypeData(state, &TypeA, &TypeB)))
3201             sbuf_printf(&sb, "S%d ", state);
3202     sbuf_trim(&sb);
3203     sbuf_finish(&sb);
3204     error = sysctl_handle_string(oidp, sbuf_data(&sb), sbuf_len(&sb), req);
3205     sbuf_delete(&sb);
3206     return (error);
3207 }
3208
3209 static int
3210 acpi_sleep_state_sysctl(SYSCTL_HANDLER_ARGS)
3211 {
3212     char sleep_state[10];
3213     int error;
3214     u_int new_state, old_state;
3215
3216     old_state = *(u_int *)oidp->oid_arg1;
3217     if (old_state > ACPI_S_STATES_MAX + 1)
3218         strlcpy(sleep_state, "unknown", sizeof(sleep_state));
3219     else
3220         strlcpy(sleep_state, sleep_state_names[old_state], sizeof(sleep_state));
3221     error = sysctl_handle_string(oidp, sleep_state, sizeof(sleep_state), req);
3222     if (error == 0 && req->newptr != NULL) {
3223         new_state = ACPI_STATE_S0;
3224         for (; new_state <= ACPI_S_STATES_MAX + 1; new_state++)
3225             if (strcmp(sleep_state, sleep_state_names[new_state]) == 0)
3226                 break;
3227         if (new_state <= ACPI_S_STATES_MAX + 1) {
3228             if (new_state != old_state)
3229                 *(u_int *)oidp->oid_arg1 = new_state;
3230         } else
3231             error = EINVAL;
3232     }
3233
3234     return (error);
3235 }
3236
3237 /* Inform devctl(4) when we receive a Notify. */
3238 void
3239 acpi_UserNotify(const char *subsystem, ACPI_HANDLE h, uint8_t notify)
3240 {
3241     char                notify_buf[16];
3242     ACPI_BUFFER         handle_buf;
3243     ACPI_STATUS         status;
3244
3245     if (subsystem == NULL)
3246         return;
3247
3248     handle_buf.Pointer = NULL;
3249     handle_buf.Length = ACPI_ALLOCATE_BUFFER;
3250     status = AcpiNsHandleToPathname(h, &handle_buf);
3251     if (ACPI_FAILURE(status))
3252         return;
3253     ksnprintf(notify_buf, sizeof(notify_buf), "notify=0x%02x", notify);
3254     devctl_notify("ACPI", subsystem, handle_buf.Pointer, notify_buf);
3255     AcpiOsFree(handle_buf.Pointer);
3256 }
3257
3258 #ifdef ACPI_DEBUG
3259 /*
3260  * Support for parsing debug options from the kernel environment.
3261  *
3262  * Bits may be set in the AcpiDbgLayer and AcpiDbgLevel debug registers
3263  * by specifying the names of the bits in the debug.acpi.layer and
3264  * debug.acpi.level environment variables.  Bits may be unset by 
3265  * prefixing the bit name with !.
3266  */
3267 struct debugtag
3268 {
3269     char        *name;
3270     UINT32      value;
3271 };
3272
3273 static struct debugtag  dbg_layer[] = {
3274     {"ACPI_UTILITIES",          ACPI_UTILITIES},
3275     {"ACPI_HARDWARE",           ACPI_HARDWARE},
3276     {"ACPI_EVENTS",             ACPI_EVENTS},
3277     {"ACPI_TABLES",             ACPI_TABLES},
3278     {"ACPI_NAMESPACE",          ACPI_NAMESPACE},
3279     {"ACPI_PARSER",             ACPI_PARSER},
3280     {"ACPI_DISPATCHER",         ACPI_DISPATCHER},
3281     {"ACPI_EXECUTER",           ACPI_EXECUTER},
3282     {"ACPI_RESOURCES",          ACPI_RESOURCES},
3283     {"ACPI_CA_DEBUGGER",        ACPI_CA_DEBUGGER},
3284     {"ACPI_OS_SERVICES",        ACPI_OS_SERVICES},
3285     {"ACPI_CA_DISASSEMBLER",    ACPI_CA_DISASSEMBLER},
3286     {"ACPI_ALL_COMPONENTS",     ACPI_ALL_COMPONENTS},
3287
3288     {"ACPI_AC_ADAPTER",         ACPI_AC_ADAPTER},
3289     {"ACPI_BATTERY",            ACPI_BATTERY},
3290     {"ACPI_BUS",                ACPI_BUS},
3291     {"ACPI_BUTTON",             ACPI_BUTTON},
3292     {"ACPI_EC",                 ACPI_EC},
3293     {"ACPI_FAN",                ACPI_FAN},
3294     {"ACPI_POWERRES",           ACPI_POWERRES},
3295     {"ACPI_PROCESSOR",          ACPI_PROCESSOR},
3296     {"ACPI_THERMAL",            ACPI_THERMAL},
3297     {"ACPI_TIMER",              ACPI_TIMER},
3298     {"ACPI_ALL_DRIVERS",        ACPI_ALL_DRIVERS},
3299     {NULL, 0}
3300 };
3301
3302 static struct debugtag dbg_level[] = {
3303     {"ACPI_LV_INIT",            ACPI_LV_INIT},
3304     {"ACPI_LV_DEBUG_OBJECT",    ACPI_LV_DEBUG_OBJECT},
3305     {"ACPI_LV_INFO",            ACPI_LV_INFO},
3306     {"ACPI_LV_REPAIR",          ACPI_LV_REPAIR},
3307     {"ACPI_LV_ALL_EXCEPTIONS",  ACPI_LV_ALL_EXCEPTIONS},
3308
3309     /* Trace verbosity level 1 [Standard Trace Level] */
3310     {"ACPI_LV_INIT_NAMES",      ACPI_LV_INIT_NAMES},
3311     {"ACPI_LV_PARSE",           ACPI_LV_PARSE},
3312     {"ACPI_LV_LOAD",            ACPI_LV_LOAD},
3313     {"ACPI_LV_DISPATCH",        ACPI_LV_DISPATCH},
3314     {"ACPI_LV_EXEC",            ACPI_LV_EXEC},
3315     {"ACPI_LV_NAMES",           ACPI_LV_NAMES},
3316     {"ACPI_LV_OPREGION",        ACPI_LV_OPREGION},
3317     {"ACPI_LV_BFIELD",          ACPI_LV_BFIELD},
3318     {"ACPI_LV_TABLES",          ACPI_LV_TABLES},
3319     {"ACPI_LV_VALUES",          ACPI_LV_VALUES},
3320     {"ACPI_LV_OBJECTS",         ACPI_LV_OBJECTS},
3321     {"ACPI_LV_RESOURCES",       ACPI_LV_RESOURCES},
3322     {"ACPI_LV_USER_REQUESTS",   ACPI_LV_USER_REQUESTS},
3323     {"ACPI_LV_PACKAGE",         ACPI_LV_PACKAGE},
3324     {"ACPI_LV_VERBOSITY1",      ACPI_LV_VERBOSITY1},
3325
3326     /* Trace verbosity level 2 [Function tracing and memory allocation] */
3327     {"ACPI_LV_ALLOCATIONS",     ACPI_LV_ALLOCATIONS},
3328     {"ACPI_LV_FUNCTIONS",       ACPI_LV_FUNCTIONS},
3329     {"ACPI_LV_OPTIMIZATIONS",   ACPI_LV_OPTIMIZATIONS},
3330     {"ACPI_LV_VERBOSITY2",      ACPI_LV_VERBOSITY2},
3331     {"ACPI_LV_ALL",             ACPI_LV_ALL},
3332
3333     /* Trace verbosity level 3 [Threading, I/O, and Interrupts] */
3334     {"ACPI_LV_MUTEX",           ACPI_LV_MUTEX},
3335     {"ACPI_LV_THREADS",         ACPI_LV_THREADS},
3336     {"ACPI_LV_IO",              ACPI_LV_IO},
3337     {"ACPI_LV_INTERRUPTS",      ACPI_LV_INTERRUPTS},
3338     {"ACPI_LV_VERBOSITY3",      ACPI_LV_VERBOSITY3},
3339
3340     /* Exceptionally verbose output -- also used in the global "DebugLevel"  */
3341     {"ACPI_LV_AML_DISASSEMBLE", ACPI_LV_AML_DISASSEMBLE},
3342     {"ACPI_LV_VERBOSE_INFO",    ACPI_LV_VERBOSE_INFO},
3343     {"ACPI_LV_FULL_TABLES",     ACPI_LV_FULL_TABLES},
3344     {"ACPI_LV_EVENTS",          ACPI_LV_EVENTS},
3345     {"ACPI_LV_VERBOSE",         ACPI_LV_VERBOSE},
3346     {NULL, 0}
3347 };    
3348
3349 static void
3350 acpi_parse_debug(char *cp, struct debugtag *tag, UINT32 *flag)
3351 {
3352     char        *ep;
3353     int         i, l;
3354     int         set;
3355
3356     while (*cp) {
3357         if (isspace(*cp)) {
3358             cp++;
3359             continue;
3360         }
3361         ep = cp;
3362         while (*ep && !isspace(*ep))
3363             ep++;
3364         if (*cp == '!') {
3365             set = 0;
3366             cp++;
3367             if (cp == ep)
3368                 continue;
3369         } else {
3370             set = 1;
3371         }
3372         l = ep - cp;
3373         for (i = 0; tag[i].name != NULL; i++) {
3374             if (!strncmp(cp, tag[i].name, l)) {
3375                 if (set)
3376                     *flag |= tag[i].value;
3377                 else
3378                     *flag &= ~tag[i].value;
3379             }
3380         }
3381         cp = ep;
3382     }
3383 }
3384
3385 static void
3386 acpi_set_debugging(void *junk)
3387 {
3388     char        *layer, *level;
3389
3390     if (cold) {
3391         AcpiDbgLayer = 0;
3392         AcpiDbgLevel = 0;
3393     }
3394
3395     layer = kgetenv("debug.acpi.layer");
3396     level = kgetenv("debug.acpi.level");
3397     if (layer == NULL && level == NULL)
3398         return;
3399
3400     kprintf("ACPI set debug");
3401     if (layer != NULL) {
3402         if (strcmp("NONE", layer) != 0)
3403             kprintf(" layer '%s'", layer);
3404         acpi_parse_debug(layer, &dbg_layer[0], &AcpiDbgLayer);
3405         kfreeenv(layer);
3406     }
3407     if (level != NULL) {
3408         if (strcmp("NONE", level) != 0)
3409             kprintf(" level '%s'", level);
3410         acpi_parse_debug(level, &dbg_level[0], &AcpiDbgLevel);
3411         kfreeenv(level);
3412     }
3413     kprintf("\n");
3414 }
3415
3416 SYSINIT(acpi_debugging, SI_BOOT1_TUNABLES, SI_ORDER_ANY, acpi_set_debugging,
3417         NULL);
3418
3419 static int
3420 acpi_debug_sysctl(SYSCTL_HANDLER_ARGS)
3421 {
3422     int          error, *dbg;
3423     struct       debugtag *tag;
3424     struct       sbuf sb;
3425
3426     if (sbuf_new(&sb, NULL, 128, SBUF_AUTOEXTEND) == NULL)
3427         return (ENOMEM);
3428     if (strcmp(oidp->oid_arg1, "debug.acpi.layer") == 0) {
3429         tag = &dbg_layer[0];
3430         dbg = &AcpiDbgLayer;
3431     } else {
3432         tag = &dbg_level[0];
3433         dbg = &AcpiDbgLevel;
3434     }
3435
3436     /* Get old values if this is a get request. */
3437     ACPI_SERIAL_BEGIN(acpi);
3438     if (*dbg == 0) {
3439         sbuf_cpy(&sb, "NONE");
3440     } else if (req->newptr == NULL) {
3441         for (; tag->name != NULL; tag++) {
3442             if ((*dbg & tag->value) == tag->value)
3443                 sbuf_printf(&sb, "%s ", tag->name);
3444         }
3445     }
3446     sbuf_trim(&sb);
3447     sbuf_finish(&sb);
3448
3449     /* Copy out the old values to the user. */
3450     error = SYSCTL_OUT(req, sbuf_data(&sb), sbuf_len(&sb));
3451     sbuf_delete(&sb);
3452
3453     /* If the user is setting a string, parse it. */
3454     if (error == 0 && req->newptr != NULL) {
3455         *dbg = 0;
3456         ksetenv((char *)oidp->oid_arg1, (char *)req->newptr);
3457         acpi_set_debugging(NULL);
3458     }
3459     ACPI_SERIAL_END(acpi);
3460
3461     return (error);
3462 }
3463
3464 SYSCTL_PROC(_debug_acpi, OID_AUTO, layer, CTLFLAG_RW | CTLTYPE_STRING,
3465             "debug.acpi.layer", 0, acpi_debug_sysctl, "A", "");
3466 SYSCTL_PROC(_debug_acpi, OID_AUTO, level, CTLFLAG_RW | CTLTYPE_STRING,
3467             "debug.acpi.level", 0, acpi_debug_sysctl, "A", "");
3468 #endif /* ACPI_DEBUG */
3469
3470 static int
3471 acpi_debug_objects_sysctl(SYSCTL_HANDLER_ARGS)
3472 {
3473         int     error;
3474         int     old;
3475
3476         old = acpi_debug_objects;
3477         error = sysctl_handle_int(oidp, &acpi_debug_objects, 0, req);
3478         if (error != 0 || req->newptr == NULL)
3479                 return (error);
3480         if (old == acpi_debug_objects || (old && acpi_debug_objects))
3481                 return (0);
3482
3483         ACPI_SERIAL_BEGIN(acpi);
3484         AcpiGbl_EnableAmlDebugObject = acpi_debug_objects ? TRUE : FALSE;
3485         ACPI_SERIAL_END(acpi);
3486
3487         return (0);
3488 }
3489
3490
3491 static int
3492 acpi_parse_interfaces(char *str, struct acpi_interface *iface)
3493 {
3494         char *p;
3495         size_t len;
3496         int i, j;
3497
3498         p = str;
3499         while (isspace(*p) || *p == ',')
3500                 p++;
3501         len = strlen(p);
3502         if (len == 0)
3503                 return (0);
3504         p = kstrdup(p, M_TEMP);
3505         for (i = 0; i < len; i++)
3506                 if (p[i] == ',')
3507                         p[i] = '\0';
3508         i = j = 0;
3509         while (i < len)
3510                 if (isspace(p[i]) || p[i] == '\0')
3511                         i++;
3512                 else {
3513                         i += strlen(p + i) + 1;
3514                         j++;
3515                 }
3516         if (j == 0) {
3517                 kfree(p, M_TEMP);
3518                 return (0);
3519         }
3520         iface->data = kmalloc(sizeof(*iface->data) * j, M_TEMP, M_WAITOK);
3521         iface->num = j;
3522         i = j = 0;
3523         while (i < len)
3524                 if (isspace(p[i]) || p[i] == '\0')
3525                         i++;
3526                 else {
3527                         iface->data[j] = p + i;
3528                         i += strlen(p + i) + 1;
3529                         j++;
3530                 }
3531
3532         return (j);
3533 }
3534
3535 static void
3536 acpi_free_interfaces(struct acpi_interface *iface)
3537 {
3538         kfree(iface->data[0], M_TEMP);
3539         kfree(iface->data, M_TEMP);
3540 }
3541
3542 static void
3543 acpi_reset_interfaces(device_t dev)
3544 {
3545         struct acpi_interface list;
3546         ACPI_STATUS status;
3547         int i;
3548
3549         if (acpi_parse_interfaces(acpi_install_interface, &list) > 0) {
3550                 for (i = 0; i < list.num; i++) {
3551                         status = AcpiInstallInterface(list.data[i]);
3552                         if (ACPI_FAILURE(status))
3553                                 device_printf(dev,
3554                                     "failed to install _OSI(\"%s\"): %s\n",
3555                                     list.data[i], AcpiFormatException(status));
3556                         else if (bootverbose)
3557                                 device_printf(dev, "installed _OSI(\"%s\")\n",
3558                                     list.data[i]);
3559                 }
3560                 acpi_free_interfaces(&list);
3561         }
3562         if (acpi_parse_interfaces(acpi_remove_interface, &list) > 0) {
3563                 for (i = 0; i < list.num; i++) {
3564                         status = AcpiRemoveInterface(list.data[i]);
3565                         if (ACPI_FAILURE(status))
3566                                 device_printf(dev,
3567                                     "failed to remove _OSI(\"%s\"): %s\n",
3568                                     list.data[i], AcpiFormatException(status));
3569                         else if (bootverbose)
3570                                 device_printf(dev, "removed _OSI(\"%s\")\n",
3571                                     list.data[i]);
3572                 }
3573                 acpi_free_interfaces(&list);
3574         }
3575 }
3576
3577 static int
3578 acpi_pm_func(u_long cmd, void *arg, ...)
3579 {
3580         int     state, acpi_state;
3581         int     error;
3582         struct  acpi_softc *sc;
3583         va_list ap;
3584
3585         error = 0;
3586         switch (cmd) {
3587         case POWER_CMD_SUSPEND:
3588                 sc = (struct acpi_softc *)arg;
3589                 if (sc == NULL) {
3590                         error = EINVAL;
3591                         goto out;
3592                 }
3593
3594                 va_start(ap, arg);
3595                 state = va_arg(ap, int);
3596                 va_end(ap);
3597
3598                 switch (state) {
3599                 case POWER_SLEEP_STATE_STANDBY:
3600                         acpi_state = sc->acpi_standby_sx;
3601                         break;
3602                 case POWER_SLEEP_STATE_SUSPEND:
3603                         acpi_state = sc->acpi_suspend_sx;
3604                         break;
3605                 case POWER_SLEEP_STATE_HIBERNATE:
3606                         acpi_state = ACPI_STATE_S4;
3607                         break;
3608                 default:
3609                         error = EINVAL;
3610                         goto out;
3611                 }
3612
3613                 if (ACPI_FAILURE(acpi_EnterSleepState(sc, acpi_state)))
3614                         error = ENXIO;
3615                 break;
3616         default:
3617                 error = EINVAL;
3618                 goto out;
3619         }
3620
3621 out:
3622         return (error);
3623 }
3624
3625 static void
3626 acpi_pm_register(void *arg)
3627 {
3628     if (!cold || resource_disabled("acpi", 0))
3629         return;
3630
3631     power_pm_register(POWER_PM_TYPE_ACPI, acpi_pm_func, NULL);
3632 }
3633
3634 SYSINIT(power, SI_BOOT2_KLD, SI_ORDER_ANY, acpi_pm_register, 0);