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
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
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.
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
29 * $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.157 2004/06/05 09:56:04 njl Exp $
30 * $DragonFly: src/sys/dev/acpica5/acpi.c,v 1.25 2006/12/20 18:14:38 dillon Exp $
34 #include <sys/param.h>
35 #include <sys/kernel.h>
37 #include <sys/fcntl.h>
38 #include <sys/malloc.h>
41 #include <sys/device.h>
42 #include <sys/ioccom.h>
43 #include <sys/reboot.h>
44 #include <sys/sysctl.h>
45 #include <sys/ctype.h>
46 #include <sys/linker.h>
47 #include <sys/power.h>
51 #include <sys/thread2.h>
53 #include <machine/clock.h>
54 #include <machine/globaldata.h>
55 #include <bus/isa/isavar.h>
58 #include <dev/acpica5/acpivar.h>
59 #include <dev/acpica5/acpiio.h>
62 MALLOC_DEFINE(M_ACPIDEV
, "acpidev", "ACPI devices");
64 /* Hooks for the ACPI CA debugging infrastructure */
65 #define _COMPONENT ACPI_BUS
66 ACPI_MODULE_NAME("ACPI")
68 static d_open_t acpiopen
;
69 static d_close_t acpiclose
;
70 static d_ioctl_t acpiioctl
;
72 #define CDEV_MAJOR 152
73 static struct dev_ops acpi_ops
= {
74 { "acpi", CDEV_MAJOR
, 0 },
80 #if __FreeBSD_version >= 500000
81 struct mtx acpi_mutex
;
90 #define ACPI_OEM_REV_ANY 0
92 static struct acpi_quirks acpi_quirks_table
[] = {
94 /* Bad PCI routing table. Used on some SuperMicro boards. */
95 { "PTLTD ", 0x06040000, "pci_link" },
101 static int acpi_modevent(struct module
*mod
, int event
, void *junk
);
102 static int acpi_identify(driver_t
*driver
, device_t parent
);
103 static int acpi_probe(device_t dev
);
104 static int acpi_attach(device_t dev
);
105 static int acpi_shutdown(device_t dev
);
106 static void acpi_quirks_set(void);
107 static device_t
acpi_add_child(device_t bus
, device_t parent
, int order
,
108 const char *name
, int unit
);
109 static int acpi_print_child(device_t bus
, device_t child
);
110 static int acpi_read_ivar(device_t dev
, device_t child
, int index
,
112 static int acpi_write_ivar(device_t dev
, device_t child
, int index
,
114 static int acpi_set_resource(device_t dev
, device_t child
, int type
,
115 int rid
, u_long start
, u_long count
);
116 static int acpi_get_resource(device_t dev
, device_t child
, int type
,
117 int rid
, u_long
*startp
, u_long
*countp
);
118 static struct resource
*acpi_alloc_resource(device_t bus
, device_t child
,
119 int type
, int *rid
, u_long start
, u_long end
,
120 u_long count
, u_int flags
);
121 static int acpi_release_resource(device_t bus
, device_t child
, int type
,
122 int rid
, struct resource
*r
);
123 static uint32_t acpi_isa_get_logicalid(device_t dev
);
124 static int acpi_isa_get_compatid(device_t dev
, uint32_t *cids
, int count
);
125 static int acpi_isa_pnp_probe(device_t bus
, device_t child
,
126 struct isa_pnp_id
*ids
);
127 static void acpi_probe_children(device_t bus
);
128 static ACPI_STATUS
acpi_probe_child(ACPI_HANDLE handle
, UINT32 level
,
129 void *context
, void **status
);
130 static void acpi_shutdown_pre_sync(void *arg
, int howto
);
131 static void acpi_shutdown_final(void *arg
, int howto
);
132 static void acpi_shutdown_poweroff(void *arg
);
133 static void acpi_enable_fixed_events(struct acpi_softc
*sc
);
134 static int acpi_parse_prw(ACPI_HANDLE h
, struct acpi_prw_data
*prw
);
135 static ACPI_STATUS
acpi_wake_limit(ACPI_HANDLE h
, UINT32 level
, void *context
,
137 static int acpi_wake_limit_walk(int sstate
);
138 static int acpi_wake_sysctl_walk(device_t dev
);
140 static int acpi_wake_set_sysctl(SYSCTL_HANDLER_ARGS
);
142 static void acpi_system_eventhandler_sleep(void *arg
, int state
);
143 static void acpi_system_eventhandler_wakeup(void *arg
, int state
);
144 static int acpi_supported_sleep_state_sysctl(SYSCTL_HANDLER_ARGS
);
145 static int acpi_sleep_state_sysctl(SYSCTL_HANDLER_ARGS
);
146 static int acpi_pm_func(u_long cmd
, void *arg
, ...);
147 static int acpi_child_location_str_method(device_t acdev
, device_t child
,
148 char *buf
, size_t buflen
);
149 static int acpi_child_pnpinfo_str_method(device_t acdev
, device_t child
,
150 char *buf
, size_t buflen
);
152 static device_method_t acpi_methods
[] = {
153 /* Device interface */
154 DEVMETHOD(device_identify
, acpi_identify
),
155 DEVMETHOD(device_probe
, acpi_probe
),
156 DEVMETHOD(device_attach
, acpi_attach
),
157 DEVMETHOD(device_shutdown
, acpi_shutdown
),
158 DEVMETHOD(device_detach
, bus_generic_detach
),
159 DEVMETHOD(device_suspend
, bus_generic_suspend
),
160 DEVMETHOD(device_resume
, bus_generic_resume
),
163 DEVMETHOD(bus_add_child
, acpi_add_child
),
164 DEVMETHOD(bus_print_child
, acpi_print_child
),
165 DEVMETHOD(bus_read_ivar
, acpi_read_ivar
),
166 DEVMETHOD(bus_write_ivar
, acpi_write_ivar
),
167 DEVMETHOD(bus_set_resource
, acpi_set_resource
),
168 DEVMETHOD(bus_get_resource
, acpi_get_resource
),
169 DEVMETHOD(bus_alloc_resource
, acpi_alloc_resource
),
170 DEVMETHOD(bus_release_resource
, acpi_release_resource
),
171 DEVMETHOD(bus_child_pnpinfo_str
, acpi_child_pnpinfo_str_method
),
172 DEVMETHOD(bus_child_location_str
, acpi_child_location_str_method
),
173 DEVMETHOD(bus_driver_added
, bus_generic_driver_added
),
174 DEVMETHOD(bus_activate_resource
, bus_generic_activate_resource
),
175 DEVMETHOD(bus_deactivate_resource
, bus_generic_deactivate_resource
),
176 DEVMETHOD(bus_setup_intr
, bus_generic_setup_intr
),
177 DEVMETHOD(bus_teardown_intr
, bus_generic_teardown_intr
),
180 DEVMETHOD(isa_pnp_probe
, acpi_isa_pnp_probe
),
185 static driver_t acpi_driver
= {
188 sizeof(struct acpi_softc
),
191 static devclass_t acpi_devclass
;
192 DRIVER_MODULE(acpi
, nexus
, acpi_driver
, acpi_devclass
, acpi_modevent
, 0);
193 MODULE_VERSION(acpi
, 1);
195 static const char* sleep_state_names
[] = {
196 "S0", "S1", "S2", "S3", "S4", "S5", "NONE"};
198 SYSCTL_NODE(_debug
, OID_AUTO
, acpi
, CTLFLAG_RW
, NULL
, "ACPI debugging");
199 static char acpi_ca_version
[12];
200 SYSCTL_STRING(_debug_acpi
, OID_AUTO
, acpi_ca_version
, CTLFLAG_RD
,
201 acpi_ca_version
, 0, "Version of Intel ACPI-CA");
204 * Allow override of whether methods execute in parallel or not.
205 * Enable this for serial behavior, which fixes "AE_ALREADY_EXISTS"
206 * errors for AML that really can't handle parallel method execution.
207 * It is off by default since this breaks recursive methods and
208 * some IBMs use such code.
210 static int acpi_serialize_methods
;
211 TUNABLE_INT("hw.acpi.serialize_methods", &acpi_serialize_methods
);
214 * ACPI can only be loaded as a module by the loader; activating it after
215 * system bootstrap time is not useful, and can be fatal to the system.
216 * It also cannot be unloaded, since the entire system bus heirarchy hangs
220 acpi_modevent(struct module
*mod
, int event
, void *junk
)
225 printf("The ACPI driver cannot be loaded after boot.\n");
230 if (!cold
&& power_pm_get_type() == POWER_PM_TYPE_ACPI
)
240 * Perform early initialization.
248 static int error
, started
= 0;
250 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
253 return_VALUE (error
);
256 #if __FreeBSD_version >= 500000
257 /* Initialise the ACPI mutex */
258 mtx_init(&acpi_mutex
, "ACPI global lock", NULL
, MTX_DEF
);
262 * Set the globals from our tunables. This is needed because ACPI-CA
263 * uses UINT8 for some values and we have no tunable_byte.
265 AcpiGbl_AllMethodsSerialized
= (UINT8
)acpi_serialize_methods
;
267 /* Start up the ACPI CA subsystem. */
269 debugpoint
= kgetenv("debug.acpi.debugger");
271 if (!strcmp(debugpoint
, "init"))
272 acpi_EnterDebugger();
276 if (ACPI_FAILURE(error
= AcpiInitializeSubsystem())) {
277 printf("ACPI: initialisation failed: %s\n", AcpiFormatException(error
));
278 return_VALUE (error
);
281 debugpoint
= kgetenv("debug.acpi.debugger");
283 if (!strcmp(debugpoint
, "tables"))
284 acpi_EnterDebugger();
289 if (ACPI_FAILURE(error
= AcpiLoadTables())) {
290 printf("ACPI: table load failed: %s\n", AcpiFormatException(error
));
294 /* Set up any quirks we have for this XSDT. */
296 if (acpi_disabled("acpi"))
297 return_VALUE (AE_ERROR
);
299 return_VALUE (AE_OK
);
303 * Detect ACPI, perform early initialisation
306 acpi_identify(driver_t
*driver
, device_t parent
)
311 * No sense rescanning an ACPI 'bus'.
313 if (device_get_state(parent
) == DS_ATTACHED
)
316 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
321 /* Check that we haven't been disabled with a hint. */
322 if (resource_disabled("acpi", 0))
325 /* Make sure we're not being doubly invoked. */
326 if (device_find_child(parent
, "acpi", 0) != NULL
)
329 /* Initialize ACPI-CA. */
330 if (ACPI_FAILURE(acpi_Startup()))
333 ksnprintf(acpi_ca_version
, sizeof(acpi_ca_version
), "%#x", ACPI_CA_VERSION
);
335 /* Attach the actual ACPI device. */
336 if ((child
= BUS_ADD_CHILD(parent
, parent
, 0, "acpi", 0)) == NULL
) {
337 device_printf(parent
, "ACPI: could not attach\n");
344 * Fetch some descriptive data from ACPI to put in our attach message
347 acpi_probe(device_t dev
)
349 ACPI_TABLE_HEADER th
;
356 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
358 if (power_pm_get_type() != POWER_PM_TYPE_NONE
&&
359 power_pm_get_type() != POWER_PM_TYPE_ACPI
) {
361 device_printf(dev
, "Other PM system enabled.\n");
367 if (ACPI_FAILURE(status
= AcpiGetTableHeader(ACPI_TABLE_XSDT
, 1, &th
))) {
368 device_printf(dev
, "couldn't get XSDT header: %s\n",
369 AcpiFormatException(status
));
372 sbuf_new(&sb
, buf
, sizeof(buf
), SBUF_FIXEDLEN
);
373 sbuf_bcat(&sb
, th
.OemId
, 6);
376 sbuf_bcat(&sb
, th
.OemTableId
, 8);
379 device_set_desc_copy(dev
, sbuf_data(&sb
));
388 acpi_attach(device_t dev
)
390 struct acpi_softc
*sc
;
401 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
403 sc
= device_get_softc(dev
);
404 bzero(sc
, sizeof(*sc
));
406 callout_init(&sc
->acpi_sleep_timer
);
409 debugpoint
= kgetenv("debug.acpi.debugger");
411 if (!strcmp(debugpoint
, "spaces"))
412 acpi_EnterDebugger();
417 /* Install the default address space handlers. */
419 status
= AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT
,
420 ACPI_ADR_SPACE_SYSTEM_MEMORY
, ACPI_DEFAULT_HANDLER
, NULL
, NULL
);
421 if (ACPI_FAILURE(status
)) {
422 device_printf(dev
, "Could not initialise SystemMemory handler: %s\n",
423 AcpiFormatException(status
));
426 status
= AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT
,
427 ACPI_ADR_SPACE_SYSTEM_IO
, ACPI_DEFAULT_HANDLER
, NULL
, NULL
);
428 if (ACPI_FAILURE(status
)) {
429 device_printf(dev
, "Could not initialise SystemIO handler: %s\n",
430 AcpiFormatException(status
));
433 status
= AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT
,
434 ACPI_ADR_SPACE_PCI_CONFIG
, ACPI_DEFAULT_HANDLER
, NULL
, NULL
);
435 if (ACPI_FAILURE(status
)) {
436 device_printf(dev
, "could not initialise PciConfig handler: %s\n",
437 AcpiFormatException(status
));
442 * Bring ACPI fully online.
444 * Note that some systems (specifically, those with namespace evaluation
445 * issues that require the avoidance of parts of the namespace) must
446 * avoid running _INI and _STA on everything, as well as dodging the final
449 * For these devices, we set ACPI_NO_DEVICE_INIT and ACPI_NO_OBJECT_INIT).
450 * For avoiding portions of the namespace without totally disabling _INI
451 * and _STA, use "debug.acpi.avoid.paths".
453 * XXX We should arrange for the object init pass after we have attached
454 * all our child devices, but on many systems it works here.
457 debugpoint
= kgetenv("debug.acpi.debugger");
459 if (!strcmp(debugpoint
, "enable"))
460 acpi_EnterDebugger();
465 if (testenv("debug.acpi.avoid"))
466 flags
= ACPI_NO_DEVICE_INIT
| ACPI_NO_OBJECT_INIT
;
467 if (ACPI_FAILURE(status
= AcpiEnableSubsystem(flags
))) {
468 device_printf(dev
, "Could not enable ACPI: %s\n",
469 AcpiFormatException(status
));
474 * Call the ECDT probe function to provide EC functionality before
475 * the namespace has been evaluated.
477 acpi_ec_ecdt_probe(dev
);
479 if (ACPI_FAILURE(status
= AcpiInitializeObjects(flags
))) {
480 device_printf(dev
, "Could not initialize ACPI objects: %s\n",
481 AcpiFormatException(status
));
486 * Setup our sysctl tree.
488 * XXX: This doesn't check to make sure that none of these fail.
490 sysctl_ctx_init(&sc
->acpi_sysctl_ctx
);
491 sc
->acpi_sysctl_tree
= SYSCTL_ADD_NODE(&sc
->acpi_sysctl_ctx
,
492 SYSCTL_STATIC_CHILDREN(_hw
), OID_AUTO
,
493 device_get_name(dev
), CTLFLAG_RD
, 0, "");
494 SYSCTL_ADD_PROC(&sc
->acpi_sysctl_ctx
, SYSCTL_CHILDREN(sc
->acpi_sysctl_tree
),
495 OID_AUTO
, "supported_sleep_state", CTLTYPE_STRING
| CTLFLAG_RD
,
496 0, 0, acpi_supported_sleep_state_sysctl
, "A", "");
497 SYSCTL_ADD_PROC(&sc
->acpi_sysctl_ctx
, SYSCTL_CHILDREN(sc
->acpi_sysctl_tree
),
498 OID_AUTO
, "power_button_state", CTLTYPE_STRING
| CTLFLAG_RW
,
499 &sc
->acpi_power_button_sx
, 0, acpi_sleep_state_sysctl
, "A", "");
500 SYSCTL_ADD_PROC(&sc
->acpi_sysctl_ctx
, SYSCTL_CHILDREN(sc
->acpi_sysctl_tree
),
501 OID_AUTO
, "sleep_button_state", CTLTYPE_STRING
| CTLFLAG_RW
,
502 &sc
->acpi_sleep_button_sx
, 0, acpi_sleep_state_sysctl
, "A", "");
503 SYSCTL_ADD_PROC(&sc
->acpi_sysctl_ctx
, SYSCTL_CHILDREN(sc
->acpi_sysctl_tree
),
504 OID_AUTO
, "lid_switch_state", CTLTYPE_STRING
| CTLFLAG_RW
,
505 &sc
->acpi_lid_switch_sx
, 0, acpi_sleep_state_sysctl
, "A", "");
506 SYSCTL_ADD_PROC(&sc
->acpi_sysctl_ctx
, SYSCTL_CHILDREN(sc
->acpi_sysctl_tree
),
507 OID_AUTO
, "standby_state", CTLTYPE_STRING
| CTLFLAG_RW
,
508 &sc
->acpi_standby_sx
, 0, acpi_sleep_state_sysctl
, "A", "");
509 SYSCTL_ADD_PROC(&sc
->acpi_sysctl_ctx
, SYSCTL_CHILDREN(sc
->acpi_sysctl_tree
),
510 OID_AUTO
, "suspend_state", CTLTYPE_STRING
| CTLFLAG_RW
,
511 &sc
->acpi_suspend_sx
, 0, acpi_sleep_state_sysctl
, "A", "");
512 SYSCTL_ADD_INT(&sc
->acpi_sysctl_ctx
, SYSCTL_CHILDREN(sc
->acpi_sysctl_tree
),
513 OID_AUTO
, "sleep_delay", CTLFLAG_RD
| CTLFLAG_RW
,
514 &sc
->acpi_sleep_delay
, 0, "sleep delay");
515 SYSCTL_ADD_INT(&sc
->acpi_sysctl_ctx
, SYSCTL_CHILDREN(sc
->acpi_sysctl_tree
),
516 OID_AUTO
, "s4bios", CTLFLAG_RD
| CTLFLAG_RW
,
517 &sc
->acpi_s4bios
, 0, "S4BIOS mode");
518 SYSCTL_ADD_INT(&sc
->acpi_sysctl_ctx
, SYSCTL_CHILDREN(sc
->acpi_sysctl_tree
),
519 OID_AUTO
, "verbose", CTLFLAG_RD
| CTLFLAG_RW
,
520 &sc
->acpi_verbose
, 0, "verbose mode");
521 SYSCTL_ADD_INT(&sc
->acpi_sysctl_ctx
, SYSCTL_CHILDREN(sc
->acpi_sysctl_tree
),
522 OID_AUTO
, "disable_on_poweroff", CTLFLAG_RD
| CTLFLAG_RW
,
523 &sc
->acpi_disable_on_poweroff
, 0, "ACPI subsystem disable on poweroff");
526 * Default to 1 second before sleeping to give some machines time to
529 sc
->acpi_sleep_delay
= 1;
530 sc
->acpi_disable_on_poweroff
= 0;
532 sc
->acpi_verbose
= 1;
533 if ((env
= kgetenv("hw.acpi.verbose")) && strcmp(env
, "0")) {
534 sc
->acpi_verbose
= 1;
538 /* Only enable S4BIOS by default if the FACS says it is available. */
539 if (AcpiGbl_FACS
->S4Bios_f
!= 0)
543 * Dispatch the default sleep state to devices. The lid switch is set
544 * to NONE by default to avoid surprising users.
546 sc
->acpi_power_button_sx
= ACPI_STATE_S5
;
547 sc
->acpi_lid_switch_sx
= ACPI_S_STATES_MAX
+ 1;
548 sc
->acpi_standby_sx
= ACPI_STATE_S1
;
549 sc
->acpi_suspend_sx
= ACPI_STATE_S3
;
551 /* Pick the first valid sleep state for the sleep button default. */
552 sc
->acpi_sleep_button_sx
= ACPI_S_STATES_MAX
+ 1;
553 for (state
= ACPI_STATE_S1
; state
< ACPI_STATE_S5
; state
++)
554 if (ACPI_SUCCESS(AcpiGetSleepTypeData(state
, &TypeA
, &TypeB
))) {
555 sc
->acpi_sleep_button_sx
= state
;
559 acpi_enable_fixed_events(sc
);
562 * Scan the namespace and attach/initialise children.
565 debugpoint
= kgetenv("debug.acpi.debugger");
567 if (!strcmp(debugpoint
, "probe"))
568 acpi_EnterDebugger();
573 /* Register our shutdown handlers */
574 EVENTHANDLER_REGISTER(shutdown_pre_sync
, acpi_shutdown_pre_sync
, sc
,
576 EVENTHANDLER_REGISTER(shutdown_final
, acpi_shutdown_final
, sc
,
580 * Register our acpi event handlers.
581 * XXX should be configurable eg. via userland policy manager.
583 EVENTHANDLER_REGISTER(acpi_sleep_event
, acpi_system_eventhandler_sleep
,
584 sc
, ACPI_EVENT_PRI_LAST
);
585 EVENTHANDLER_REGISTER(acpi_wakeup_event
, acpi_system_eventhandler_wakeup
,
586 sc
, ACPI_EVENT_PRI_LAST
);
588 /* Flag our initial states. */
589 sc
->acpi_enabled
= 1;
590 sc
->acpi_sstate
= ACPI_STATE_S0
;
591 sc
->acpi_sleep_disabled
= 0;
593 /* Create the control device */
594 dev_ops_add(&acpi_ops
, 0, 0);
595 sc
->acpi_dev_t
= make_dev(&acpi_ops
, 0, UID_ROOT
, GID_WHEEL
, 0644,
597 sc
->acpi_dev_t
->si_drv1
= sc
;
600 debugpoint
= kgetenv("debug.acpi.debugger");
602 if (strcmp(debugpoint
, "running") == 0)
603 acpi_EnterDebugger();
608 if ((error
= acpi_task_thread_init()))
611 if ((error
= acpi_machdep_init(dev
)))
614 /* Register ACPI again to pass the correct argument of pm_func. */
615 power_pm_register(POWER_PM_TYPE_ACPI
, acpi_pm_func
, sc
);
617 if (!acpi_disabled("bus"))
618 acpi_probe_children(dev
);
624 return_VALUE (error
);
628 acpi_shutdown(device_t dev
)
630 /* Allow children to shutdown first. */
631 bus_generic_shutdown(dev
);
633 /* Disable all wake GPEs not appropriate for reboot/poweroff. */
634 acpi_wake_limit_walk(ACPI_STATE_S5
);
639 acpi_quirks_set(void)
641 XSDT_DESCRIPTOR
*xsdt
;
642 struct acpi_quirks
*quirk
;
647 * If the user loaded a custom table or disabled "quirks", leave
648 * the settings alone.
651 if ((env
= kgetenv("acpi_dsdt_load")) != NULL
) {
652 /* XXX No strcasecmp but this is good enough. */
653 if (*env
== 'Y' || *env
== 'y')
657 if ((env
= kgetenv("debug.acpi.disabled")) != NULL
) {
658 if (strstr("quirks", env
) != NULL
)
664 * Search through our quirk table and concatenate the disabled
665 * values with whatever we find.
668 for (quirk
= acpi_quirks_table
; quirk
->OemId
; quirk
++) {
669 if (!strncmp(xsdt
->OemId
, quirk
->OemId
, strlen(quirk
->OemId
)) &&
670 (xsdt
->OemRevision
== quirk
->OemRevision
||
671 quirk
->OemRevision
== ACPI_OEM_REV_ANY
)) {
672 len
+= strlen(quirk
->value
) + 2;
673 if ((tmp
= kmalloc(len
, M_TEMP
, M_NOWAIT
)) == NULL
)
675 ksprintf(tmp
, "%s %s", env
? env
: "", quirk
->value
);
677 setenv("debug.acpi.disabled", tmp
);
690 * Handle a new device being added
693 acpi_add_child(device_t bus
, device_t parent
, int order
,
694 const char *name
, int unit
)
696 struct acpi_device
*ad
;
699 ad
= kmalloc(sizeof(*ad
), M_ACPIDEV
, M_INTWAIT
| M_ZERO
);
701 resource_list_init(&ad
->ad_rl
);
703 child
= device_add_child_ordered(parent
, order
, name
, unit
);
705 device_set_ivars(child
, ad
);
710 acpi_print_child(device_t bus
, device_t child
)
712 struct acpi_device
*adev
= device_get_ivars(child
);
713 struct resource_list
*rl
= &adev
->ad_rl
;
716 retval
+= bus_print_child_header(bus
, child
);
717 retval
+= resource_list_print_type(rl
, "port", SYS_RES_IOPORT
, "%#lx");
718 retval
+= resource_list_print_type(rl
, "iomem", SYS_RES_MEMORY
, "%#lx");
719 retval
+= resource_list_print_type(rl
, "irq", SYS_RES_IRQ
, "%ld");
720 retval
+= resource_list_print_type(rl
, "drq", SYS_RES_DRQ
, "%ld");
721 retval
+= bus_print_child_footer(bus
, child
);
726 /* Location hint for devctl(8) */
728 acpi_child_location_str_method(device_t cbdev
, device_t child
, char *buf
,
731 struct acpi_device
*dinfo
= device_get_ivars(child
);
733 if (dinfo
->ad_handle
)
734 ksnprintf(buf
, buflen
, "path=%s", acpi_name(dinfo
->ad_handle
));
736 ksnprintf(buf
, buflen
, "magic=unknown");
740 /* PnP information for devctl(8) */
742 acpi_child_pnpinfo_str_method(device_t cbdev
, device_t child
, char *buf
,
745 ACPI_BUFFER adbuf
= {ACPI_ALLOCATE_BUFFER
, NULL
};
746 ACPI_DEVICE_INFO
*adinfo
;
747 struct acpi_device
*dinfo
= device_get_ivars(child
);
751 error
= AcpiGetObjectInfo(dinfo
->ad_handle
, &adbuf
);
752 adinfo
= (ACPI_DEVICE_INFO
*) adbuf
.Pointer
;
755 ksnprintf(buf
, buflen
, "Unknown");
757 ksnprintf(buf
, buflen
, "_HID=%s _UID=%lu",
758 (adinfo
->Valid
& ACPI_VALID_HID
) ?
759 adinfo
->HardwareId
.Value
: "UNKNOWN",
760 (adinfo
->Valid
& ACPI_VALID_UID
) ?
761 strtoul(adinfo
->UniqueId
.Value
, &end
, 10) : 0);
770 * Handle per-device ivars
773 acpi_read_ivar(device_t dev
, device_t child
, int index
, uintptr_t *result
)
775 struct acpi_device
*ad
;
777 if ((ad
= device_get_ivars(child
)) == NULL
) {
778 printf("device has no ivars\n");
782 /* ACPI and ISA compatibility ivars */
784 case ACPI_IVAR_HANDLE
:
785 *(ACPI_HANDLE
*)result
= ad
->ad_handle
;
787 case ACPI_IVAR_MAGIC
:
788 *(int *)result
= ad
->ad_magic
;
790 case ACPI_IVAR_PRIVATE
:
791 *(void **)result
= ad
->ad_private
;
793 case ISA_IVAR_VENDORID
:
794 case ISA_IVAR_SERIAL
:
795 case ISA_IVAR_COMPATID
:
798 case ISA_IVAR_LOGICALID
:
799 *(int *)result
= acpi_isa_get_logicalid(child
);
809 acpi_write_ivar(device_t dev
, device_t child
, int index
, uintptr_t value
)
811 struct acpi_device
*ad
;
813 if ((ad
= device_get_ivars(child
)) == NULL
) {
814 printf("device has no ivars\n");
819 case ACPI_IVAR_HANDLE
:
820 ad
->ad_handle
= (ACPI_HANDLE
)value
;
822 case ACPI_IVAR_MAGIC
:
823 ad
->ad_magic
= (int)value
;
825 case ACPI_IVAR_PRIVATE
:
826 ad
->ad_private
= (void *)value
;
829 panic("bad ivar write request (%d)", index
);
837 * Handle child resource allocation/removal
840 acpi_set_resource(device_t dev
, device_t child
, int type
, int rid
,
841 u_long start
, u_long count
)
843 struct acpi_device
*ad
= device_get_ivars(child
);
844 struct resource_list
*rl
= &ad
->ad_rl
;
846 resource_list_add(rl
, type
, rid
, start
, start
+ count
-1, count
);
852 acpi_get_resource(device_t dev
, device_t child
, int type
, int rid
,
853 u_long
*startp
, u_long
*countp
)
855 struct acpi_device
*ad
= device_get_ivars(child
);
856 struct resource_list
*rl
= &ad
->ad_rl
;
857 struct resource_list_entry
*rle
;
859 rle
= resource_list_find(rl
, type
, rid
);
864 *startp
= rle
->start
;
866 *countp
= rle
->count
;
871 static struct resource
*
872 acpi_alloc_resource(device_t bus
, device_t child
, int type
, int *rid
,
873 u_long start
, u_long end
, u_long count
, u_int flags
)
875 struct acpi_device
*ad
= device_get_ivars(child
);
876 struct resource_list
*rl
= &ad
->ad_rl
;
878 return (resource_list_alloc(rl
, bus
, child
, type
, rid
, start
, end
, count
,
883 acpi_release_resource(device_t bus
, device_t child
, int type
, int rid
, struct resource
*r
)
885 struct acpi_device
*ad
= device_get_ivars(child
);
886 struct resource_list
*rl
= &ad
->ad_rl
;
888 return (resource_list_release(rl
, bus
, child
, type
, rid
, r
));
891 /* Allocate an IO port or memory resource, given its GAS. */
893 acpi_bus_alloc_gas(device_t dev
, int *rid
, ACPI_GENERIC_ADDRESS
*gas
)
897 if (gas
== NULL
|| !ACPI_VALID_ADDRESS(gas
->Address
) ||
898 gas
->RegisterBitWidth
< 8)
901 switch (gas
->AddressSpaceId
) {
902 case ACPI_ADR_SPACE_SYSTEM_MEMORY
:
903 type
= SYS_RES_MEMORY
;
905 case ACPI_ADR_SPACE_SYSTEM_IO
:
906 type
= SYS_RES_IOPORT
;
912 bus_set_resource(dev
, type
, *rid
, gas
->Address
, gas
->RegisterBitWidth
/ 8);
913 return (bus_alloc_resource_any(dev
, type
, rid
, RF_ACTIVE
));
917 * Handle ISA-like devices probing for a PnP ID to match.
919 #define PNP_EISAID(s) \
920 ((((s[0] - '@') & 0x1f) << 2) \
921 | (((s[1] - '@') & 0x18) >> 3) \
922 | (((s[1] - '@') & 0x07) << 13) \
923 | (((s[2] - '@') & 0x1f) << 8) \
924 | (PNP_HEXTONUM(s[4]) << 16) \
925 | (PNP_HEXTONUM(s[3]) << 20) \
926 | (PNP_HEXTONUM(s[6]) << 24) \
927 | (PNP_HEXTONUM(s[5]) << 28))
930 acpi_isa_get_logicalid(device_t dev
)
932 ACPI_DEVICE_INFO
*devinfo
;
939 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
943 buf
.Length
= ACPI_ALLOCATE_BUFFER
;
947 /* Fetch and validate the HID. */
948 if ((h
= acpi_get_handle(dev
)) == NULL
)
950 error
= AcpiGetObjectInfo(h
, &buf
);
951 if (ACPI_FAILURE(error
))
953 devinfo
= (ACPI_DEVICE_INFO
*)buf
.Pointer
;
955 if ((devinfo
->Valid
& ACPI_VALID_HID
) != 0)
956 pnpid
= PNP_EISAID(devinfo
->HardwareId
.Value
);
959 if (buf
.Pointer
!= NULL
)
960 AcpiOsFree(buf
.Pointer
);
962 return_VALUE (pnpid
);
966 acpi_isa_get_compatid(device_t dev
, uint32_t *cids
, int count
)
968 ACPI_DEVICE_INFO
*devinfo
;
976 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
981 buf
.Length
= ACPI_ALLOCATE_BUFFER
;
985 /* Fetch and validate the CID */
986 if ((h
= acpi_get_handle(dev
)) == NULL
)
988 error
= AcpiGetObjectInfo(h
, &buf
);
989 if (ACPI_FAILURE(error
))
991 devinfo
= (ACPI_DEVICE_INFO
*)buf
.Pointer
;
992 if ((devinfo
->Valid
& ACPI_VALID_CID
) == 0)
995 if (devinfo
->CompatibilityId
.Count
< count
)
996 count
= devinfo
->CompatibilityId
.Count
;
997 for (i
= 0; i
< count
; i
++) {
998 if (strncmp(devinfo
->CompatibilityId
.Id
[i
].Value
, "PNP", 3) != 0)
1000 *pnpid
++ = PNP_EISAID(devinfo
->CompatibilityId
.Id
[i
].Value
);
1005 if (buf
.Pointer
!= NULL
)
1006 AcpiOsFree(buf
.Pointer
);
1008 return_VALUE (valid
);
1012 acpi_isa_pnp_probe(device_t bus
, device_t child
, struct isa_pnp_id
*ids
)
1014 int result
, cid_count
, i
;
1015 uint32_t lid
, cids
[8];
1017 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
1020 * ISA-style drivers attached to ACPI may persist and
1021 * probe manually if we return ENOENT. We never want
1022 * that to happen, so don't ever return it.
1026 /* Scan the supplied IDs for a match */
1027 lid
= acpi_isa_get_logicalid(child
);
1028 cid_count
= acpi_isa_get_compatid(child
, cids
, 8);
1029 while (ids
&& ids
->ip_id
) {
1030 if (lid
== ids
->ip_id
) {
1034 for (i
= 0; i
< cid_count
; i
++) {
1035 if (cids
[i
] == ids
->ip_id
) {
1044 return_VALUE (result
);
1048 * Scan relevant portions of the ACPI namespace and attach child devices.
1050 * Note that we only expect to find devices in the \_PR_, \_TZ_, \_SI_ and
1051 * \_SB_ scopes, and \_PR_ and \_TZ_ become obsolete in the ACPI 2.0 spec.
1054 acpi_probe_children(device_t bus
)
1058 static char *scopes
[] = {"\\_PR_", "\\_TZ_", "\\_SI", "\\_SB_", NULL
};
1061 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
1064 /* Create any static children by calling device identify methods. */
1065 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS
, "device identify routines\n"));
1066 bus_generic_probe(bus
);
1069 * Scan the namespace and insert placeholders for all the devices that
1072 * Note that we use AcpiWalkNamespace rather than AcpiGetDevices because
1073 * we want to create nodes for all devices, not just those that are
1074 * currently present. (This assumes that we don't want to create/remove
1075 * devices as they appear, which might be smarter.)
1077 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS
, "namespace scan\n"));
1078 for (i
= 0; scopes
[i
] != NULL
; i
++) {
1079 status
= AcpiGetHandle(ACPI_ROOT_OBJECT
, scopes
[i
], &parent
);
1080 if (ACPI_SUCCESS(status
)) {
1081 AcpiWalkNamespace(ACPI_TYPE_ANY
, parent
, 100, acpi_probe_child
,
1087 * Scan all of the child devices we have created and let them probe/attach.
1089 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS
, "first bus_generic_attach\n"));
1090 bus_generic_attach(bus
);
1093 * Some of these children may have attached others as part of their attach
1094 * process (eg. the root PCI bus driver), so rescan.
1096 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS
, "second bus_generic_attach\n"));
1097 bus_generic_attach(bus
);
1099 /* Attach wake sysctls. */
1100 acpi_wake_sysctl_walk(bus
);
1102 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS
, "done attaching children\n"));
1107 * Evaluate a child device and determine whether we might attach a device to
1111 acpi_probe_child(ACPI_HANDLE handle
, UINT32 level
, void *context
, void **status
)
1113 ACPI_OBJECT_TYPE type
;
1114 device_t child
, bus
= (device_t
)context
;
1116 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
1118 /* Skip this device if we think we'll have trouble with it. */
1119 if (acpi_avoid(handle
)) {
1120 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS
, "not scanning '%s'\n",
1121 acpi_name(handle
)));
1122 return_ACPI_STATUS (AE_OK
);
1125 if (ACPI_SUCCESS(AcpiGetType(handle
, &type
))) {
1127 case ACPI_TYPE_DEVICE
:
1128 case ACPI_TYPE_PROCESSOR
:
1129 case ACPI_TYPE_THERMAL
:
1130 case ACPI_TYPE_POWER
:
1131 if (acpi_disabled("children"))
1135 * Create a placeholder device for this node. Sort the placeholder
1136 * so that the probe/attach passes will run breadth-first.
1138 ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS
, "scanning '%s'\n",
1139 acpi_name(handle
)));
1140 child
= BUS_ADD_CHILD(bus
, bus
, level
* 10, NULL
, -1);
1143 acpi_set_handle(child
, handle
);
1145 /* Check if the device can generate wake events. */
1146 if (ACPI_SUCCESS(AcpiEvaluateObject(handle
, "_PRW", NULL
, NULL
)))
1147 device_set_flags(child
, ACPI_FLAG_WAKE_CAPABLE
);
1150 * Check that the device is present. If it's not present,
1151 * leave it disabled (so that we have a device_t attached to
1152 * the handle, but we don't probe it).
1154 if (type
== ACPI_TYPE_DEVICE
&& !acpi_DeviceIsPresent(child
)) {
1155 device_disable(child
);
1160 * Get the device's resource settings and attach them.
1161 * Note that if the device has _PRS but no _CRS, we need
1162 * to decide when it's appropriate to try to configure the
1163 * device. Ignore the return value here; it's OK for the
1164 * device not to have any resources.
1166 acpi_parse_resources(child
, handle
, &acpi_res_parse_set
, NULL
);
1168 /* If we're debugging, probe/attach now rather than later */
1169 ACPI_DEBUG_EXEC(device_probe_and_attach(child
));
1174 return_ACPI_STATUS (AE_OK
);
1178 acpi_shutdown_pre_sync(void *arg
, int howto
)
1180 struct acpi_softc
*sc
= arg
;
1185 * Disable all ACPI events before soft off, otherwise the system
1186 * will be turned on again on some laptops.
1188 * XXX this should probably be restricted to masking some events just
1189 * before powering down, since we may still need ACPI during the
1192 if (sc
->acpi_disable_on_poweroff
)
1197 acpi_shutdown_final(void *arg
, int howto
)
1203 * If powering off, run the actual shutdown code on each processor.
1204 * It will only perform the shutdown on the BSP. Some chipsets do
1205 * not power off the system correctly if called from an AP.
1207 if ((howto
& RB_POWEROFF
) != 0) {
1208 status
= AcpiEnterSleepStatePrep(ACPI_STATE_S5
);
1209 if (ACPI_FAILURE(status
)) {
1210 printf("AcpiEnterSleepStatePrep failed - %s\n",
1211 AcpiFormatException(status
));
1214 printf("Powering system off using ACPI\n");
1215 acpi_shutdown_poweroff(NULL
);
1217 printf("Shutting down ACPI\n");
1223 * Since this function may be called with locks held or in an unknown
1224 * context, it cannot allocate memory, acquire locks, sleep, etc.
1227 acpi_shutdown_poweroff(void *arg
)
1233 /* Only attempt to power off if this is the BSP (cpuid 0). */
1234 if (mdcpu
->mi
.gd_cpuid
!= 0)
1237 ACPI_DISABLE_IRQS();
1238 status
= AcpiEnterSleepState(ACPI_STATE_S5
);
1239 if (ACPI_FAILURE(status
)) {
1240 printf("ACPI power-off failed - %s\n", AcpiFormatException(status
));
1243 printf("ACPI power-off failed - timeout\n");
1248 acpi_enable_fixed_events(struct acpi_softc
*sc
)
1250 static int first_time
= 1;
1254 /* Enable and clear fixed events and install handlers. */
1255 if (AcpiGbl_FADT
!= NULL
&& AcpiGbl_FADT
->PwrButton
== 0) {
1256 AcpiClearEvent(ACPI_EVENT_POWER_BUTTON
);
1257 AcpiInstallFixedEventHandler(ACPI_EVENT_POWER_BUTTON
,
1258 acpi_event_power_button_sleep
, sc
);
1260 device_printf(sc
->acpi_dev
, "Power Button (fixed)\n");
1262 if (AcpiGbl_FADT
!= NULL
&& AcpiGbl_FADT
->SleepButton
== 0) {
1263 AcpiClearEvent(ACPI_EVENT_SLEEP_BUTTON
);
1264 AcpiInstallFixedEventHandler(ACPI_EVENT_SLEEP_BUTTON
,
1265 acpi_event_sleep_button_sleep
, sc
);
1267 device_printf(sc
->acpi_dev
, "Sleep Button (fixed)\n");
1274 * Returns true if the device is actually present and should
1275 * be attached to. This requires the present, enabled, UI-visible
1276 * and diagnostics-passed bits to be set.
1279 acpi_DeviceIsPresent(device_t dev
)
1281 ACPI_DEVICE_INFO
*devinfo
;
1290 if ((h
= acpi_get_handle(dev
)) == NULL
)
1293 buf
.Length
= ACPI_ALLOCATE_BUFFER
;
1294 error
= AcpiGetObjectInfo(h
, &buf
);
1295 if (ACPI_FAILURE(error
))
1297 devinfo
= (ACPI_DEVICE_INFO
*)buf
.Pointer
;
1299 /* If no _STA method, must be present */
1300 if ((devinfo
->Valid
& ACPI_VALID_STA
) == 0)
1303 /* Return true for 'present' and 'functioning' */
1304 if ((devinfo
->CurrentStatus
& 0x9) == 0x9)
1307 AcpiOsFree(buf
.Pointer
);
1312 * Returns true if the battery is actually present and inserted.
1315 acpi_BatteryIsPresent(device_t dev
)
1317 ACPI_DEVICE_INFO
*devinfo
;
1326 if ((h
= acpi_get_handle(dev
)) == NULL
)
1329 buf
.Length
= ACPI_ALLOCATE_BUFFER
;
1330 error
= AcpiGetObjectInfo(h
, &buf
);
1331 if (ACPI_FAILURE(error
))
1333 devinfo
= (ACPI_DEVICE_INFO
*)buf
.Pointer
;
1335 /* If no _STA method, must be present */
1336 if ((devinfo
->Valid
& ACPI_VALID_STA
) == 0)
1339 /* Return true for 'present' and 'functioning' */
1340 if ((devinfo
->CurrentStatus
& 0x19) == 0x19)
1343 AcpiOsFree(buf
.Pointer
);
1348 * Match a HID string against a device
1351 acpi_MatchHid(device_t dev
, char *hid
)
1353 ACPI_DEVICE_INFO
*devinfo
;
1364 if ((h
= acpi_get_handle(dev
)) == NULL
)
1367 buf
.Length
= ACPI_ALLOCATE_BUFFER
;
1368 error
= AcpiGetObjectInfo(h
, &buf
);
1369 if (ACPI_FAILURE(error
))
1371 devinfo
= (ACPI_DEVICE_INFO
*)buf
.Pointer
;
1373 if ((devinfo
->Valid
& ACPI_VALID_HID
) != 0 &&
1374 strcmp(hid
, devinfo
->HardwareId
.Value
) == 0)
1376 else if ((devinfo
->Valid
& ACPI_VALID_CID
) != 0) {
1377 for (i
= 0; i
< devinfo
->CompatibilityId
.Count
; i
++) {
1378 if (strcmp(hid
, devinfo
->CompatibilityId
.Id
[i
].Value
) == 0) {
1385 AcpiOsFree(buf
.Pointer
);
1390 * Return the handle of a named object within our scope, ie. that of (parent)
1391 * or one if its parents.
1394 acpi_GetHandleInScope(ACPI_HANDLE parent
, char *path
, ACPI_HANDLE
*result
)
1401 /* Walk back up the tree to the root */
1403 status
= AcpiGetHandle(parent
, path
, &r
);
1404 if (ACPI_SUCCESS(status
)) {
1408 if (status
!= AE_NOT_FOUND
)
1410 if (ACPI_FAILURE(AcpiGetParent(parent
, &r
)))
1411 return (AE_NOT_FOUND
);
1416 /* Find the difference between two PM tick counts. */
1418 acpi_TimerDelta(uint32_t end
, uint32_t start
)
1423 delta
= end
- start
;
1424 else if (AcpiGbl_FADT
->TmrValExt
== 0)
1425 delta
= ((0x00FFFFFF - start
) + end
+ 1) & 0x00FFFFFF;
1427 delta
= ((0xFFFFFFFF - start
) + end
+ 1);
1432 * Allocate a buffer with a preset data size.
1435 acpi_AllocBuffer(int size
)
1439 buf
= kmalloc(size
+ sizeof(*buf
), M_ACPIDEV
, M_INTWAIT
);
1441 buf
->Pointer
= (void *)(buf
+ 1);
1446 acpi_SetInteger(ACPI_HANDLE handle
, char *path
, UINT32 number
)
1449 ACPI_OBJECT_LIST args
;
1453 arg1
.Type
= ACPI_TYPE_INTEGER
;
1454 arg1
.Integer
.Value
= number
;
1456 args
.Pointer
= &arg1
;
1458 return (AcpiEvaluateObject(handle
, path
, &args
, NULL
));
1462 * Evaluate a path that should return an integer.
1465 acpi_GetInteger(ACPI_HANDLE handle
, char *path
, UINT32
*number
)
1474 handle
= ACPI_ROOT_OBJECT
;
1477 * Assume that what we've been pointed at is an Integer object, or
1478 * a method that will return an Integer.
1480 buf
.Pointer
= ¶m
;
1481 buf
.Length
= sizeof(param
);
1482 status
= AcpiEvaluateObject(handle
, path
, NULL
, &buf
);
1483 if (ACPI_SUCCESS(status
)) {
1484 if (param
.Type
== ACPI_TYPE_INTEGER
)
1485 *number
= param
.Integer
.Value
;
1491 * In some applications, a method that's expected to return an Integer
1492 * may instead return a Buffer (probably to simplify some internal
1493 * arithmetic). We'll try to fetch whatever it is, and if it's a Buffer,
1494 * convert it into an Integer as best we can.
1498 if (status
== AE_BUFFER_OVERFLOW
) {
1499 if ((buf
.Pointer
= AcpiOsAllocate(buf
.Length
)) == NULL
) {
1500 status
= AE_NO_MEMORY
;
1502 status
= AcpiEvaluateObject(handle
, path
, NULL
, &buf
);
1503 if (ACPI_SUCCESS(status
))
1504 status
= acpi_ConvertBufferToInteger(&buf
, number
);
1505 AcpiOsFree(buf
.Pointer
);
1512 acpi_ConvertBufferToInteger(ACPI_BUFFER
*bufp
, UINT32
*number
)
1518 p
= (ACPI_OBJECT
*)bufp
->Pointer
;
1519 if (p
->Type
== ACPI_TYPE_INTEGER
) {
1520 *number
= p
->Integer
.Value
;
1523 if (p
->Type
!= ACPI_TYPE_BUFFER
)
1525 if (p
->Buffer
.Length
> sizeof(int))
1526 return (AE_BAD_DATA
);
1529 val
= p
->Buffer
.Pointer
;
1530 for (i
= 0; i
< p
->Buffer
.Length
; i
++)
1531 *number
+= val
[i
] << (i
* 8);
1536 * Iterate over the elements of an a package object, calling the supplied
1537 * function for each element.
1539 * XXX possible enhancement might be to abort traversal on error.
1542 acpi_ForeachPackageObject(ACPI_OBJECT
*pkg
,
1543 void (*func
)(ACPI_OBJECT
*comp
, void *arg
), void *arg
)
1548 if (pkg
== NULL
|| pkg
->Type
!= ACPI_TYPE_PACKAGE
)
1549 return (AE_BAD_PARAMETER
);
1551 /* Iterate over components */
1553 comp
= pkg
->Package
.Elements
;
1554 for (; i
< pkg
->Package
.Count
; i
++, comp
++)
1561 * Find the (index)th resource object in a set.
1564 acpi_FindIndexedResource(ACPI_BUFFER
*buf
, int index
, ACPI_RESOURCE
**resp
)
1569 rp
= (ACPI_RESOURCE
*)buf
->Pointer
;
1573 if (rp
> (ACPI_RESOURCE
*)((u_int8_t
*)buf
->Pointer
+ buf
->Length
))
1574 return (AE_BAD_PARAMETER
);
1576 /* Check for terminator */
1577 if (rp
->Id
== ACPI_RSTYPE_END_TAG
|| rp
->Length
== 0)
1578 return (AE_NOT_FOUND
);
1579 rp
= ACPI_NEXT_RESOURCE(rp
);
1588 * Append an ACPI_RESOURCE to an ACPI_BUFFER.
1590 * Given a pointer to an ACPI_RESOURCE structure, expand the ACPI_BUFFER
1591 * provided to contain it. If the ACPI_BUFFER is empty, allocate a sensible
1592 * backing block. If the ACPI_RESOURCE is NULL, return an empty set of
1595 #define ACPI_INITIAL_RESOURCE_BUFFER_SIZE 512
1598 acpi_AppendBufferResource(ACPI_BUFFER
*buf
, ACPI_RESOURCE
*res
)
1603 /* Initialise the buffer if necessary. */
1604 if (buf
->Pointer
== NULL
) {
1605 buf
->Length
= ACPI_INITIAL_RESOURCE_BUFFER_SIZE
;
1606 if ((buf
->Pointer
= AcpiOsAllocate(buf
->Length
)) == NULL
)
1607 return (AE_NO_MEMORY
);
1608 rp
= (ACPI_RESOURCE
*)buf
->Pointer
;
1609 rp
->Id
= ACPI_RSTYPE_END_TAG
;
1616 * Scan the current buffer looking for the terminator.
1617 * This will either find the terminator or hit the end
1618 * of the buffer and return an error.
1620 rp
= (ACPI_RESOURCE
*)buf
->Pointer
;
1622 /* Range check, don't go outside the buffer */
1623 if (rp
>= (ACPI_RESOURCE
*)((u_int8_t
*)buf
->Pointer
+ buf
->Length
))
1624 return (AE_BAD_PARAMETER
);
1625 if (rp
->Id
== ACPI_RSTYPE_END_TAG
|| rp
->Length
== 0)
1627 rp
= ACPI_NEXT_RESOURCE(rp
);
1631 * Check the size of the buffer and expand if required.
1634 * size of existing resources before terminator +
1635 * size of new resource and header +
1636 * size of terminator.
1638 * Note that this loop should really only run once, unless
1639 * for some reason we are stuffing a *really* huge resource.
1641 while ((((u_int8_t
*)rp
- (u_int8_t
*)buf
->Pointer
) +
1642 res
->Length
+ ACPI_RESOURCE_LENGTH_NO_DATA
+
1643 ACPI_RESOURCE_LENGTH
) >= buf
->Length
) {
1644 if ((newp
= AcpiOsAllocate(buf
->Length
* 2)) == NULL
)
1645 return (AE_NO_MEMORY
);
1646 bcopy(buf
->Pointer
, newp
, buf
->Length
);
1647 rp
= (ACPI_RESOURCE
*)((u_int8_t
*)newp
+
1648 ((u_int8_t
*)rp
- (u_int8_t
*)buf
->Pointer
));
1649 AcpiOsFree(buf
->Pointer
);
1650 buf
->Pointer
= newp
;
1651 buf
->Length
+= buf
->Length
;
1654 /* Insert the new resource. */
1655 bcopy(res
, rp
, res
->Length
+ ACPI_RESOURCE_LENGTH_NO_DATA
);
1657 /* And add the terminator. */
1658 rp
= ACPI_NEXT_RESOURCE(rp
);
1659 rp
->Id
= ACPI_RSTYPE_END_TAG
;
1666 * Set interrupt model.
1669 acpi_SetIntrModel(int model
)
1671 return (acpi_SetInteger(ACPI_ROOT_OBJECT
, "_PIC", model
));
1674 #define ACPI_MINIMUM_AWAKETIME 5
1677 acpi_sleep_enable(void *arg
)
1679 ((struct acpi_softc
*)arg
)->acpi_sleep_disabled
= 0;
1683 * Set the system sleep state
1685 * Currently we support S1-S5 but S4 is only S4BIOS
1688 acpi_SetSleepState(struct acpi_softc
*sc
, int state
)
1690 ACPI_STATUS status
= AE_OK
;
1694 ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__
, state
);
1697 /* Avoid reentry if already attempting to suspend. */
1698 if (sc
->acpi_sstate
!= ACPI_STATE_S0
)
1699 return_ACPI_STATUS (AE_BAD_PARAMETER
);
1701 /* We recently woke up so don't suspend again for a while. */
1702 if (sc
->acpi_sleep_disabled
)
1703 return_ACPI_STATUS (AE_OK
);
1710 status
= AcpiGetSleepTypeData((UINT8
)state
, &TypeA
, &TypeB
);
1711 if (status
== AE_NOT_FOUND
) {
1712 device_printf(sc
->acpi_dev
,
1713 "Sleep state S%d not supported by BIOS\n", state
);
1715 } else if (ACPI_FAILURE(status
)) {
1716 device_printf(sc
->acpi_dev
, "AcpiGetSleepTypeData failed - %s\n",
1717 AcpiFormatException(status
));
1721 sc
->acpi_sstate
= state
;
1722 sc
->acpi_sleep_disabled
= 1;
1724 /* Disable all wake GPEs not appropriate for this state. */
1725 acpi_wake_limit_walk(state
);
1727 /* Inform all devices that we are going to sleep. */
1728 if (DEVICE_SUSPEND(root_bus
) != 0) {
1730 * Re-wake the system.
1732 * XXX note that a better two-pass approach with a 'veto' pass
1733 * followed by a "real thing" pass would be better, but the
1734 * current bus interface does not provide for this.
1736 DEVICE_RESUME(root_bus
);
1737 return_ACPI_STATUS (AE_ERROR
);
1740 status
= AcpiEnterSleepStatePrep(state
);
1741 if (ACPI_FAILURE(status
)) {
1742 device_printf(sc
->acpi_dev
, "AcpiEnterSleepStatePrep failed - %s\n",
1743 AcpiFormatException(status
));
1747 if (sc
->acpi_sleep_delay
> 0)
1748 DELAY(sc
->acpi_sleep_delay
* 1000000);
1750 if (state
!= ACPI_STATE_S1
) {
1751 acpi_sleep_machdep(sc
, state
);
1753 /* AcpiEnterSleepState() may be incomplete, unlock if locked. */
1754 if (AcpiGbl_MutexInfo
[ACPI_MTX_HARDWARE
].OwnerId
!=
1755 ACPI_MUTEX_NOT_ACQUIRED
) {
1757 AcpiUtReleaseMutex(ACPI_MTX_HARDWARE
);
1760 /* Re-enable ACPI hardware on wakeup from sleep state 4. */
1761 if (state
== ACPI_STATE_S4
)
1764 status
= AcpiEnterSleepState((UINT8
)state
);
1765 if (ACPI_FAILURE(status
)) {
1766 device_printf(sc
->acpi_dev
, "AcpiEnterSleepState failed - %s\n",
1767 AcpiFormatException(status
));
1771 AcpiLeaveSleepState((UINT8
)state
);
1772 DEVICE_RESUME(root_bus
);
1773 sc
->acpi_sstate
= ACPI_STATE_S0
;
1774 acpi_enable_fixed_events(sc
);
1778 * Shut down cleanly and power off. This will call us back through the
1779 * shutdown handlers.
1781 shutdown_nice(RB_POWEROFF
);
1785 status
= AE_BAD_PARAMETER
;
1789 /* Disable a second sleep request for a short period */
1790 if (sc
->acpi_sleep_disabled
)
1791 callout_reset(&sc
->acpi_sleep_timer
, hz
* ACPI_MINIMUM_AWAKETIME
,
1792 acpi_sleep_enable
, sc
);
1794 return_ACPI_STATUS (status
);
1797 /* Initialize a device's wake GPE. */
1799 acpi_wake_init(device_t dev
, int type
)
1801 struct acpi_prw_data prw
;
1803 /* Check that the device can wake the system. */
1804 if ((device_get_flags(dev
) & ACPI_FLAG_WAKE_CAPABLE
) == 0)
1807 /* Evaluate _PRW to find the GPE. */
1808 if (acpi_parse_prw(acpi_get_handle(dev
), &prw
) != 0)
1811 /* Set the requested type for the GPE (runtime, wake, or both). */
1812 if (ACPI_FAILURE(AcpiSetGpeType(prw
.gpe_handle
, prw
.gpe_bit
, type
))) {
1813 device_printf(dev
, "set GPE type failed\n");
1820 /* Enable or disable the device's wake GPE. */
1822 acpi_wake_set_enable(device_t dev
, int enable
)
1824 struct acpi_prw_data prw
;
1829 /* Make sure the device supports waking the system. */
1830 flags
= device_get_flags(dev
);
1831 handle
= acpi_get_handle(dev
);
1832 if ((flags
& ACPI_FLAG_WAKE_CAPABLE
) == 0 || handle
== NULL
)
1835 /* Evaluate _PRW to find the GPE. */
1836 if (acpi_parse_prw(handle
, &prw
) != 0)
1840 status
= AcpiEnableGpe(prw
.gpe_handle
, prw
.gpe_bit
, ACPI_NOT_ISR
);
1841 if (ACPI_FAILURE(status
)) {
1842 device_printf(dev
, "enable wake failed\n");
1845 device_set_flags(dev
, flags
| ACPI_FLAG_WAKE_ENABLED
);
1847 status
= AcpiDisableGpe(prw
.gpe_handle
, prw
.gpe_bit
, ACPI_NOT_ISR
);
1848 if (ACPI_FAILURE(status
)) {
1849 device_printf(dev
, "disable wake failed\n");
1852 device_set_flags(dev
, flags
& ~ACPI_FLAG_WAKE_ENABLED
);
1858 /* Configure a device's GPE appropriately for the new sleep state. */
1860 acpi_wake_sleep_prep(device_t dev
, int sstate
)
1862 struct acpi_prw_data prw
;
1866 /* Check that this is an ACPI device and get its GPE. */
1867 flags
= device_get_flags(dev
);
1868 handle
= acpi_get_handle(dev
);
1869 if ((flags
& ACPI_FLAG_WAKE_CAPABLE
) == 0 || handle
== NULL
)
1872 /* Evaluate _PRW to find the GPE. */
1873 if (acpi_parse_prw(handle
, &prw
) != 0)
1877 * TBD: All Power Resources referenced by elements 2 through N
1878 * of the _PRW object are put into the ON state.
1882 * If the user requested that this device wake the system and the next
1883 * sleep state is valid for this GPE, enable it and the device's wake
1884 * capability. The sleep state must be less than (i.e., higher power)
1885 * or equal to the value specified by _PRW. Return early, leaving
1886 * the appropriate power resources enabled.
1888 if ((flags
& ACPI_FLAG_WAKE_ENABLED
) != 0 &&
1889 sstate
<= prw
.lowest_wake
) {
1891 device_printf(dev
, "wake_prep enabled gpe %#x for state %d\n",
1892 prw
.gpe_bit
, sstate
);
1893 AcpiEnableGpe(prw
.gpe_handle
, prw
.gpe_bit
, ACPI_NOT_ISR
);
1894 acpi_SetInteger(handle
, "_PSW", 1);
1899 * If the device wake was disabled or this sleep state is too low for
1900 * this device, disable its wake capability and GPE.
1902 AcpiDisableGpe(prw
.gpe_handle
, prw
.gpe_bit
, ACPI_NOT_ISR
);
1903 acpi_SetInteger(handle
, "_PSW", 0);
1905 device_printf(dev
, "wake_prep disabled gpe %#x for state %d\n",
1906 prw
.gpe_bit
, sstate
);
1909 * TBD: All Power Resources referenced by elements 2 through N
1910 * of the _PRW object are put into the OFF state.
1916 /* Re-enable GPEs after wake. */
1918 acpi_wake_run_prep(device_t dev
)
1920 struct acpi_prw_data prw
;
1924 /* Check that this is an ACPI device and get its GPE. */
1925 flags
= device_get_flags(dev
);
1926 handle
= acpi_get_handle(dev
);
1927 if ((flags
& ACPI_FLAG_WAKE_CAPABLE
) == 0 || handle
== NULL
)
1930 /* Evaluate _PRW to find the GPE. */
1931 if (acpi_parse_prw(handle
, &prw
) != 0)
1935 * TBD: Be sure all Power Resources referenced by elements 2 through N
1936 * of the _PRW object are in the ON state.
1939 /* Disable wake capability and if the user requested, enable the GPE. */
1940 acpi_SetInteger(handle
, "_PSW", 0);
1941 if ((flags
& ACPI_FLAG_WAKE_ENABLED
) != 0)
1942 AcpiEnableGpe(prw
.gpe_handle
, prw
.gpe_bit
, ACPI_NOT_ISR
);
1947 acpi_wake_limit(ACPI_HANDLE h
, UINT32 level
, void *context
, void **status
)
1949 struct acpi_prw_data prw
;
1952 /* It's ok not to have _PRW if the device can't wake the system. */
1953 if (acpi_parse_prw(h
, &prw
) != 0)
1956 sstate
= (int *)context
;
1957 if (*sstate
> prw
.lowest_wake
)
1958 AcpiDisableGpe(prw
.gpe_handle
, prw
.gpe_bit
, ACPI_NOT_ISR
);
1963 /* Walk all system devices, disabling them if necessary for sstate. */
1965 acpi_wake_limit_walk(int sstate
)
1967 ACPI_HANDLE sb_handle
;
1969 if (ACPI_SUCCESS(AcpiGetHandle(ACPI_ROOT_OBJECT
, "\\_SB_", &sb_handle
)))
1970 AcpiWalkNamespace(ACPI_TYPE_ANY
, sb_handle
, 100,
1971 acpi_wake_limit
, &sstate
, NULL
);
1975 /* Walk the tree rooted at acpi0 to attach per-device wake sysctls. */
1977 acpi_wake_sysctl_walk(device_t dev
)
1979 int error
, i
, numdevs
;
1983 error
= device_get_children(dev
, &devlist
, &numdevs
);
1984 if (error
!= 0 || numdevs
== 0)
1986 for (i
= 0; i
< numdevs
; i
++) {
1988 if (!device_is_attached(child
))
1990 if (device_get_flags(child
) & ACPI_FLAG_WAKE_CAPABLE
) {
1992 SYSCTL_ADD_PROC(device_get_sysctl_ctx(child
),
1993 SYSCTL_CHILDREN(device_get_sysctl_tree(child
)), OID_AUTO
,
1994 "wake", CTLTYPE_INT
| CTLFLAG_RW
, child
, 0,
1995 acpi_wake_set_sysctl
, "I", "Device set to wake the system");
1996 #endif /* dfly_notyet */
1998 acpi_wake_sysctl_walk(child
);
2000 kfree(devlist
, M_TEMP
);
2006 /* Enable or disable wake from userland. */
2008 acpi_wake_set_sysctl(SYSCTL_HANDLER_ARGS
)
2013 dev
= (device_t
)arg1
;
2014 enable
= (device_get_flags(dev
) & ACPI_FLAG_WAKE_ENABLED
) ? 1 : 0;
2016 error
= sysctl_handle_int(oidp
, &enable
, 0, req
);
2017 if (error
!= 0 || req
->newptr
== NULL
)
2019 if (enable
!= 0 && enable
!= 1)
2022 return (acpi_wake_set_enable(dev
, enable
));
2024 #endif /* dfly_notyet */
2026 /* Parse a device's _PRW into a structure. */
2028 acpi_parse_prw(ACPI_HANDLE h
, struct acpi_prw_data
*prw
)
2031 ACPI_BUFFER prw_buffer
;
2032 ACPI_OBJECT
*res
, *res2
;
2035 if (h
== NULL
|| prw
== NULL
)
2039 * The _PRW object (7.2.9) is only required for devices that have the
2040 * ability to wake the system from a sleeping state.
2043 prw_buffer
.Pointer
= NULL
;
2044 prw_buffer
.Length
= ACPI_ALLOCATE_BUFFER
;
2045 status
= AcpiEvaluateObject(h
, "_PRW", NULL
, &prw_buffer
);
2046 if (ACPI_FAILURE(status
))
2048 res
= (ACPI_OBJECT
*)prw_buffer
.Pointer
;
2051 if (!ACPI_PKG_VALID(res
, 2))
2055 * Element 1 of the _PRW object:
2056 * The lowest power system sleeping state that can be entered while still
2057 * providing wake functionality. The sleeping state being entered must
2058 * be less than (i.e., higher power) or equal to this value.
2060 if (acpi_PkgInt32(res
, 1, &prw
->lowest_wake
) != 0)
2064 * Element 0 of the _PRW object:
2066 switch (res
->Package
.Elements
[0].Type
) {
2067 case ACPI_TYPE_INTEGER
:
2069 * If the data type of this package element is numeric, then this
2070 * _PRW package element is the bit index in the GPEx_EN, in the
2071 * GPE blocks described in the FADT, of the enable bit that is
2072 * enabled for the wake event.
2074 prw
->gpe_handle
= NULL
;
2075 prw
->gpe_bit
= res
->Package
.Elements
[0].Integer
.Value
;
2078 case ACPI_TYPE_PACKAGE
:
2080 * If the data type of this package element is a package, then this
2081 * _PRW package element is itself a package containing two
2082 * elements. The first is an object reference to the GPE Block
2083 * device that contains the GPE that will be triggered by the wake
2084 * event. The second element is numeric and it contains the bit
2085 * index in the GPEx_EN, in the GPE Block referenced by the
2086 * first element in the package, of the enable bit that is enabled for
2089 * For example, if this field is a package then it is of the form:
2090 * Package() {\_SB.PCI0.ISA.GPE, 2}
2092 res2
= &res
->Package
.Elements
[0];
2093 if (!ACPI_PKG_VALID(res2
, 2))
2095 prw
->gpe_handle
= acpi_GetReference(NULL
, &res2
->Package
.Elements
[0]);
2096 if (prw
->gpe_handle
== NULL
)
2098 if (acpi_PkgInt32(res2
, 1, &prw
->gpe_bit
) != 0)
2106 /* XXX No power resource handling yet. */
2107 prw
->power_res
= NULL
;
2110 if (prw_buffer
.Pointer
!= NULL
)
2111 AcpiOsFree(prw_buffer
.Pointer
);
2116 * Enable/Disable ACPI
2119 acpi_Enable(struct acpi_softc
*sc
)
2124 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
2127 flags
= ACPI_NO_ADDRESS_SPACE_INIT
| ACPI_NO_HARDWARE_INIT
|
2128 ACPI_NO_DEVICE_INIT
| ACPI_NO_OBJECT_INIT
;
2129 if (!sc
->acpi_enabled
)
2130 status
= AcpiEnableSubsystem(flags
);
2134 if (status
== AE_OK
)
2135 sc
->acpi_enabled
= 1;
2137 return_ACPI_STATUS (status
);
2141 acpi_Disable(struct acpi_softc
*sc
)
2145 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
2148 if (sc
->acpi_enabled
)
2149 status
= AcpiDisable();
2153 if (status
== AE_OK
)
2154 sc
->acpi_enabled
= 0;
2156 return_ACPI_STATUS (status
);
2160 * ACPI Event Handlers
2163 /* System Event Handlers (registered by EVENTHANDLER_REGISTER) */
2166 acpi_system_eventhandler_sleep(void *arg
, int state
)
2169 ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__
, state
);
2172 if (state
>= ACPI_STATE_S0
&& state
<= ACPI_S_STATES_MAX
)
2173 acpi_SetSleepState((struct acpi_softc
*)arg
, state
);
2179 acpi_system_eventhandler_wakeup(void *arg
, int state
)
2182 ACPI_FUNCTION_TRACE_U32((char *)(uintptr_t)__func__
, state
);
2184 /* Well, what to do? :-) */
2193 * ACPICA Event Handlers (FixedEvent, also called from button notify handler)
2196 acpi_event_power_button_sleep(void *context
)
2198 struct acpi_softc
*sc
= (struct acpi_softc
*)context
;
2200 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
2202 EVENTHANDLER_INVOKE(acpi_sleep_event
, sc
->acpi_power_button_sx
);
2204 return_VALUE (ACPI_INTERRUPT_HANDLED
);
2208 acpi_event_power_button_wake(void *context
)
2210 struct acpi_softc
*sc
= (struct acpi_softc
*)context
;
2212 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
2214 EVENTHANDLER_INVOKE(acpi_wakeup_event
, sc
->acpi_power_button_sx
);
2216 return_VALUE (ACPI_INTERRUPT_HANDLED
);
2220 acpi_event_sleep_button_sleep(void *context
)
2222 struct acpi_softc
*sc
= (struct acpi_softc
*)context
;
2224 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
2226 EVENTHANDLER_INVOKE(acpi_sleep_event
, sc
->acpi_sleep_button_sx
);
2228 return_VALUE (ACPI_INTERRUPT_HANDLED
);
2232 acpi_event_sleep_button_wake(void *context
)
2234 struct acpi_softc
*sc
= (struct acpi_softc
*)context
;
2236 ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__
);
2238 EVENTHANDLER_INVOKE(acpi_wakeup_event
, sc
->acpi_sleep_button_sx
);
2240 return_VALUE (ACPI_INTERRUPT_HANDLED
);
2244 * XXX This is kinda ugly, and should not be here.
2246 struct acpi_staticbuf
{
2252 acpi_name(ACPI_HANDLE handle
)
2254 static struct acpi_staticbuf buf
;
2258 buf
.buffer
.Length
= 512;
2259 buf
.buffer
.Pointer
= &buf
.data
[0];
2261 if (ACPI_SUCCESS(AcpiGetName(handle
, ACPI_FULL_PATHNAME
, &buf
.buffer
)))
2262 return (buf
.buffer
.Pointer
);
2264 return ("(unknown path)");
2268 * Debugging/bug-avoidance. Avoid trying to fetch info on various
2269 * parts of the namespace.
2272 acpi_avoid(ACPI_HANDLE handle
)
2274 char *cp
, *env
, *np
;
2277 np
= acpi_name(handle
);
2280 if ((env
= kgetenv("debug.acpi.avoid.paths")) == NULL
&&
2281 (env
= kgetenv("debug.acpi.avoid")) == NULL
)
2284 /* Scan the avoid list checking for a match */
2287 while ((*cp
!= 0) && isspace(*cp
))
2292 while ((cp
[len
] != 0) && !isspace(cp
[len
]))
2294 if (!strncmp(cp
, np
, len
)) {
2306 * Debugging/bug-avoidance. Disable ACPI subsystem components. Note that
2307 * some components may be disabled by default and can only be enabled
2308 * via acpi_enabled() (debug.acpi.enabled).
2311 acpi_disabled(char *subsys
)
2316 if ((env
= kgetenv("debug.acpi.disabled")) == NULL
)
2318 if (strcmp(env
, "all") == 0) {
2323 /* Scan the disable list, checking for a match. */
2326 while (*cp
!= '\0' && isspace(*cp
))
2331 while (cp
[len
] != '\0' && !isspace(cp
[len
]))
2333 if (strncmp(cp
, subsys
, len
) == 0) {
2345 * Debugging/bug-avoidance. Enable ACPI subsystem components. Most
2346 * components are enabled by default. The ones that are not have to be
2347 * enabled via debug.acpi.enabled.
2350 acpi_enabled(char *subsys
)
2355 if ((env
= kgetenv("debug.acpi.enabled")) == NULL
)
2357 if (strcmp(env
, "all") == 0) {
2362 /* Scan the enable list, checking for a match. */
2365 while (*cp
!= '\0' && isspace(*cp
))
2370 while (cp
[len
] != '\0' && !isspace(cp
[len
]))
2372 if (strncmp(cp
, subsys
, len
) == 0) {
2384 * Control interface.
2386 * We multiplex ioctls for all participating ACPI devices here. Individual
2387 * drivers wanting to be accessible via /dev/acpi should use the
2388 * register/deregister interface to make their handlers visible.
2390 struct acpi_ioctl_hook
2392 TAILQ_ENTRY(acpi_ioctl_hook
) link
;
2398 static TAILQ_HEAD(,acpi_ioctl_hook
) acpi_ioctl_hooks
;
2399 static int acpi_ioctl_hooks_initted
;
2402 * Register an ioctl handler.
2405 acpi_register_ioctl(u_long cmd
, acpi_ioctl_fn fn
, void *arg
)
2407 struct acpi_ioctl_hook
*hp
;
2409 hp
= kmalloc(sizeof(*hp
), M_ACPIDEV
, M_INTWAIT
);
2413 if (acpi_ioctl_hooks_initted
== 0) {
2414 TAILQ_INIT(&acpi_ioctl_hooks
);
2415 acpi_ioctl_hooks_initted
= 1;
2417 TAILQ_INSERT_TAIL(&acpi_ioctl_hooks
, hp
, link
);
2422 * Deregister an ioctl handler.
2425 acpi_deregister_ioctl(u_long cmd
, acpi_ioctl_fn fn
)
2427 struct acpi_ioctl_hook
*hp
;
2429 TAILQ_FOREACH(hp
, &acpi_ioctl_hooks
, link
)
2430 if ((hp
->cmd
== cmd
) && (hp
->fn
== fn
))
2434 TAILQ_REMOVE(&acpi_ioctl_hooks
, hp
, link
);
2435 kfree(hp
, M_ACPIDEV
);
2440 acpiopen(struct dev_open_args
*ap
)
2446 acpiclose(struct dev_close_args
*ap
)
2452 acpiioctl(struct dev_ioctl_args
*ap
)
2454 struct acpi_softc
*sc
;
2455 struct acpi_ioctl_hook
*hp
;
2456 int error
, xerror
, state
;
2462 sc
= ap
->a_head
.a_dev
->si_drv1
;
2465 * Scan the list of registered ioctls, looking for handlers.
2467 if (acpi_ioctl_hooks_initted
) {
2468 TAILQ_FOREACH(hp
, &acpi_ioctl_hooks
, link
) {
2469 if (hp
->cmd
== ap
->a_cmd
) {
2470 xerror
= hp
->fn(ap
->a_cmd
, ap
->a_data
, hp
->arg
);
2479 * Core ioctls are not permitted for non-writable user.
2480 * Currently, other ioctls just fetch information.
2481 * Not changing system behavior.
2483 if((ap
->a_fflag
& FWRITE
) == 0) {
2488 /* Core system ioctls. */
2489 switch (ap
->a_cmd
) {
2491 if (ACPI_FAILURE(acpi_Enable(sc
)))
2494 case ACPIIO_DISABLE
:
2495 if (ACPI_FAILURE(acpi_Disable(sc
)))
2498 case ACPIIO_SETSLPSTATE
:
2499 if (!sc
->acpi_enabled
) {
2503 state
= *(int *)ap
->a_data
;
2504 if (state
>= ACPI_STATE_S0
&& state
<= ACPI_S_STATES_MAX
) {
2505 if (ACPI_FAILURE(acpi_SetSleepState(sc
, state
)))
2523 acpi_supported_sleep_state_sysctl(SYSCTL_HANDLER_ARGS
)
2525 char sleep_state
[4];
2528 UINT8 state
, TypeA
, TypeB
;
2531 for (state
= ACPI_STATE_S1
; state
< ACPI_S_STATES_MAX
+ 1; state
++) {
2532 if (ACPI_SUCCESS(AcpiGetSleepTypeData(state
, &TypeA
, &TypeB
))) {
2533 ksprintf(sleep_state
, "S%d ", state
);
2534 strcat(buf
, sleep_state
);
2537 error
= sysctl_handle_string(oidp
, buf
, sizeof(buf
), req
);
2542 acpi_sleep_state_sysctl(SYSCTL_HANDLER_ARGS
)
2544 char sleep_state
[10];
2546 u_int new_state
, old_state
;
2548 old_state
= *(u_int
*)oidp
->oid_arg1
;
2549 if (old_state
> ACPI_S_STATES_MAX
+ 1) {
2550 strcpy(sleep_state
, "unknown");
2552 bzero(sleep_state
, sizeof(sleep_state
));
2553 strncpy(sleep_state
, sleep_state_names
[old_state
],
2554 sizeof(sleep_state_names
[old_state
]));
2556 error
= sysctl_handle_string(oidp
, sleep_state
, sizeof(sleep_state
), req
);
2557 if (error
== 0 && req
->newptr
!= NULL
) {
2558 new_state
= ACPI_STATE_S0
;
2559 for (; new_state
<= ACPI_S_STATES_MAX
+ 1; new_state
++) {
2560 if (strncmp(sleep_state
, sleep_state_names
[new_state
],
2561 sizeof(sleep_state
)) == 0)
2564 if (new_state
<= ACPI_S_STATES_MAX
+ 1) {
2565 if (new_state
!= old_state
)
2566 *(u_int
*)oidp
->oid_arg1
= new_state
;
2575 /* Inform devctl(4) when we receive a Notify. */
2577 acpi_UserNotify(const char *subsystem
, ACPI_HANDLE h
, uint8_t notify
)
2579 char notify_buf
[16];
2580 ACPI_BUFFER handle_buf
;
2583 if (subsystem
== NULL
)
2586 handle_buf
.Pointer
= NULL
;
2587 handle_buf
.Length
= ACPI_ALLOCATE_BUFFER
;
2588 status
= AcpiNsHandleToPathname(h
, &handle_buf
);
2589 if (ACPI_FAILURE(status
))
2591 ksnprintf(notify_buf
, sizeof(notify_buf
), "notify=0x%02x", notify
);
2593 devctl_notify("ACPI", subsystem
, handle_buf
.Pointer
, notify_buf
);
2595 AcpiOsFree(handle_buf
.Pointer
);
2600 * Support for parsing debug options from the kernel environment.
2602 * Bits may be set in the AcpiDbgLayer and AcpiDbgLevel debug registers
2603 * by specifying the names of the bits in the debug.acpi.layer and
2604 * debug.acpi.level environment variables. Bits may be unset by
2605 * prefixing the bit name with !.
2613 static struct debugtag dbg_layer
[] = {
2614 {"ACPI_UTILITIES", ACPI_UTILITIES
},
2615 {"ACPI_HARDWARE", ACPI_HARDWARE
},
2616 {"ACPI_EVENTS", ACPI_EVENTS
},
2617 {"ACPI_TABLES", ACPI_TABLES
},
2618 {"ACPI_NAMESPACE", ACPI_NAMESPACE
},
2619 {"ACPI_PARSER", ACPI_PARSER
},
2620 {"ACPI_DISPATCHER", ACPI_DISPATCHER
},
2621 {"ACPI_EXECUTER", ACPI_EXECUTER
},
2622 {"ACPI_RESOURCES", ACPI_RESOURCES
},
2623 {"ACPI_CA_DEBUGGER", ACPI_CA_DEBUGGER
},
2624 {"ACPI_OS_SERVICES", ACPI_OS_SERVICES
},
2625 {"ACPI_CA_DISASSEMBLER", ACPI_CA_DISASSEMBLER
},
2626 {"ACPI_ALL_COMPONENTS", ACPI_ALL_COMPONENTS
},
2628 {"ACPI_AC_ADAPTER", ACPI_AC_ADAPTER
},
2629 {"ACPI_BATTERY", ACPI_BATTERY
},
2630 {"ACPI_BUS", ACPI_BUS
},
2631 {"ACPI_BUTTON", ACPI_BUTTON
},
2632 {"ACPI_EC", ACPI_EC
},
2633 {"ACPI_FAN", ACPI_FAN
},
2634 {"ACPI_POWERRES", ACPI_POWERRES
},
2635 {"ACPI_PROCESSOR", ACPI_PROCESSOR
},
2636 {"ACPI_THERMAL", ACPI_THERMAL
},
2637 {"ACPI_TIMER", ACPI_TIMER
},
2638 {"ACPI_ALL_DRIVERS", ACPI_ALL_DRIVERS
},
2642 static struct debugtag dbg_level
[] = {
2643 {"ACPI_LV_ERROR", ACPI_LV_ERROR
},
2644 {"ACPI_LV_WARN", ACPI_LV_WARN
},
2645 {"ACPI_LV_INIT", ACPI_LV_INIT
},
2646 {"ACPI_LV_DEBUG_OBJECT", ACPI_LV_DEBUG_OBJECT
},
2647 {"ACPI_LV_INFO", ACPI_LV_INFO
},
2648 {"ACPI_LV_ALL_EXCEPTIONS", ACPI_LV_ALL_EXCEPTIONS
},
2650 /* Trace verbosity level 1 [Standard Trace Level] */
2651 {"ACPI_LV_INIT_NAMES", ACPI_LV_INIT_NAMES
},
2652 {"ACPI_LV_PARSE", ACPI_LV_PARSE
},
2653 {"ACPI_LV_LOAD", ACPI_LV_LOAD
},
2654 {"ACPI_LV_DISPATCH", ACPI_LV_DISPATCH
},
2655 {"ACPI_LV_EXEC", ACPI_LV_EXEC
},
2656 {"ACPI_LV_NAMES", ACPI_LV_NAMES
},
2657 {"ACPI_LV_OPREGION", ACPI_LV_OPREGION
},
2658 {"ACPI_LV_BFIELD", ACPI_LV_BFIELD
},
2659 {"ACPI_LV_TABLES", ACPI_LV_TABLES
},
2660 {"ACPI_LV_VALUES", ACPI_LV_VALUES
},
2661 {"ACPI_LV_OBJECTS", ACPI_LV_OBJECTS
},
2662 {"ACPI_LV_RESOURCES", ACPI_LV_RESOURCES
},
2663 {"ACPI_LV_USER_REQUESTS", ACPI_LV_USER_REQUESTS
},
2664 {"ACPI_LV_PACKAGE", ACPI_LV_PACKAGE
},
2665 {"ACPI_LV_VERBOSITY1", ACPI_LV_VERBOSITY1
},
2667 /* Trace verbosity level 2 [Function tracing and memory allocation] */
2668 {"ACPI_LV_ALLOCATIONS", ACPI_LV_ALLOCATIONS
},
2669 {"ACPI_LV_FUNCTIONS", ACPI_LV_FUNCTIONS
},
2670 {"ACPI_LV_OPTIMIZATIONS", ACPI_LV_OPTIMIZATIONS
},
2671 {"ACPI_LV_VERBOSITY2", ACPI_LV_VERBOSITY2
},
2672 {"ACPI_LV_ALL", ACPI_LV_ALL
},
2674 /* Trace verbosity level 3 [Threading, I/O, and Interrupts] */
2675 {"ACPI_LV_MUTEX", ACPI_LV_MUTEX
},
2676 {"ACPI_LV_THREADS", ACPI_LV_THREADS
},
2677 {"ACPI_LV_IO", ACPI_LV_IO
},
2678 {"ACPI_LV_INTERRUPTS", ACPI_LV_INTERRUPTS
},
2679 {"ACPI_LV_VERBOSITY3", ACPI_LV_VERBOSITY3
},
2681 /* Exceptionally verbose output -- also used in the global "DebugLevel" */
2682 {"ACPI_LV_AML_DISASSEMBLE", ACPI_LV_AML_DISASSEMBLE
},
2683 {"ACPI_LV_VERBOSE_INFO", ACPI_LV_VERBOSE_INFO
},
2684 {"ACPI_LV_FULL_TABLES", ACPI_LV_FULL_TABLES
},
2685 {"ACPI_LV_EVENTS", ACPI_LV_EVENTS
},
2686 {"ACPI_LV_VERBOSE", ACPI_LV_VERBOSE
},
2691 acpi_parse_debug(char *cp
, struct debugtag
*tag
, UINT32
*flag
)
2703 while (*ep
&& !isspace(*ep
))
2714 for (i
= 0; tag
[i
].name
!= NULL
; i
++) {
2715 if (!strncmp(cp
, tag
[i
].name
, l
)) {
2717 *flag
|= tag
[i
].value
;
2719 *flag
&= ~tag
[i
].value
;
2727 acpi_set_debugging(void *junk
)
2729 char *layer
, *level
;
2736 layer
= kgetenv("debug.acpi.layer");
2737 level
= kgetenv("debug.acpi.level");
2738 if (layer
== NULL
&& level
== NULL
)
2741 printf("ACPI set debug");
2742 if (layer
!= NULL
) {
2743 if (strcmp("NONE", layer
) != 0)
2744 printf(" layer '%s'", layer
);
2745 acpi_parse_debug(layer
, &dbg_layer
[0], &AcpiDbgLayer
);
2748 if (level
!= NULL
) {
2749 if (strcmp("NONE", level
) != 0)
2750 printf(" level '%s'", level
);
2751 acpi_parse_debug(level
, &dbg_level
[0], &AcpiDbgLevel
);
2756 SYSINIT(acpi_debugging
, SI_SUB_TUNABLES
, SI_ORDER_ANY
, acpi_set_debugging
,
2760 acpi_debug_sysctl(SYSCTL_HANDLER_ARGS
)
2763 struct debugtag
*tag
;
2766 if (sbuf_new(&sb
, NULL
, 128, SBUF_AUTOEXTEND
) == NULL
)
2768 if (strcmp(oidp
->oid_arg1
, "debug.acpi.layer") == 0) {
2769 tag
= &dbg_layer
[0];
2770 dbg
= &AcpiDbgLayer
;
2772 tag
= &dbg_level
[0];
2773 dbg
= &AcpiDbgLevel
;
2776 /* Get old values if this is a get request. */
2778 sbuf_cpy(&sb
, "NONE");
2779 } else if (req
->newptr
== NULL
) {
2780 for (; tag
->name
!= NULL
; tag
++) {
2781 if ((*dbg
& tag
->value
) == tag
->value
)
2782 sbuf_printf(&sb
, "%s ", tag
->name
);
2788 /* Copy out the old values to the user. */
2789 error
= SYSCTL_OUT(req
, sbuf_data(&sb
), sbuf_len(&sb
));
2792 /* If the user is setting a string, parse it. */
2793 if (error
== 0 && req
->newptr
!= NULL
) {
2795 /* XXX setenv((char *)oidp->oid_arg1, (char *)req->newptr); */
2796 acpi_set_debugging(NULL
);
2801 SYSCTL_PROC(_debug_acpi
, OID_AUTO
, layer
, CTLFLAG_RW
| CTLTYPE_STRING
,
2802 "debug.acpi.layer", 0, acpi_debug_sysctl
, "A", "");
2803 SYSCTL_PROC(_debug_acpi
, OID_AUTO
, level
, CTLFLAG_RW
| CTLTYPE_STRING
,
2804 "debug.acpi.level", 0, acpi_debug_sysctl
, "A", "");
2808 acpi_pm_func(u_long cmd
, void *arg
, ...)
2810 int state
, acpi_state
;
2812 struct acpi_softc
*sc
;
2817 case POWER_CMD_SUSPEND
:
2818 sc
= (struct acpi_softc
*)arg
;
2825 state
= va_arg(ap
, int);
2829 case POWER_SLEEP_STATE_STANDBY
:
2830 acpi_state
= sc
->acpi_standby_sx
;
2832 case POWER_SLEEP_STATE_SUSPEND
:
2833 acpi_state
= sc
->acpi_suspend_sx
;
2835 case POWER_SLEEP_STATE_HIBERNATE
:
2836 acpi_state
= ACPI_STATE_S4
;
2843 acpi_SetSleepState(sc
, acpi_state
);
2855 acpi_pm_register(void *arg
)
2857 if (!cold
|| resource_disabled("acpi", 0))
2860 power_pm_register(POWER_PM_TYPE_ACPI
, acpi_pm_func
, NULL
);
2863 SYSINIT(power
, SI_SUB_KLD
, SI_ORDER_ANY
, acpi_pm_register
, 0);