The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/acpica/acpi.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 895c47443ae96be96156cf76c610f6cf


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.