xref: /freebsd/sys/dev/acpica/acpivar.h (revision 030e556ff8a9dfa6fd7b5328e410eb806f4d07ed)
1 /*-
2  * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
3  * Copyright (c) 2000 Michael Smith <msmith@freebsd.org>
4  * Copyright (c) 2000 BSDi
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #ifndef _ACPIVAR_H_
30 #define _ACPIVAR_H_
31 
32 #ifdef _KERNEL
33 
34 #include "acpi_if.h"
35 #include "bus_if.h"
36 #include <sys/_eventhandler.h>
37 #ifdef INTRNG
38 #include <sys/intr.h>
39 #endif
40 #include <sys/ktr.h>
41 #include <sys/lock.h>
42 #include <sys/mutex.h>
43 #include <sys/power.h>
44 #include <sys/selinfo.h>
45 #include <sys/sx.h>
46 #include <sys/sysctl.h>
47 
48 #include <machine/bus.h>
49 #include <machine/resource.h>
50 
51 struct acpi_softc {
52     device_t		acpi_dev;
53     struct cdev		*acpi_dev_t;
54 
55     int			acpi_enabled;
56     enum power_stype	acpi_stype;
57     int			acpi_sleep_disabled;
58     sbintime_t		acpi_resume_sbt;	/* Uptime at last resume. */
59 
60     /* Supported sleep states and types. */
61     bool		acpi_supported_stypes[POWER_STYPE_COUNT];
62     bool		acpi_supported_sstates[ACPI_S_STATE_COUNT];
63 
64     struct sysctl_ctx_list acpi_sysctl_ctx;
65     struct sysctl_oid	*acpi_sysctl_tree;
66     enum power_stype	acpi_power_button_stype;
67     enum power_stype	acpi_sleep_button_stype;
68     enum power_stype	acpi_lid_switch_stype;
69 
70     int			acpi_standby_sx;
71     bool		acpi_s4bios_supported;
72 
73     int			acpi_sleep_delay;
74     int			acpi_do_disable;
75     int			acpi_verbose;
76     int			acpi_handle_reboot;
77 
78     vm_offset_t		acpi_wakeaddr;
79     vm_paddr_t		acpi_wakephys;
80 
81     enum power_stype	acpi_next_stype;	/* Next suspend sleep type. */
82     struct callout	susp_force_to;		/* Force suspend if no acks. */
83 
84     /* System Resources */
85     struct resource_list sysres_rl;
86 };
87 
88 struct acpi_device {
89     /* ACPI ivars */
90     ACPI_HANDLE			ad_handle;
91     void			*ad_private;
92     int				ad_flags;
93     int				ad_cls_class;
94     int				ad_domain;
95 
96     ACPI_BUFFER			dsd;	/* Device Specific Data */
97     const ACPI_OBJECT	*dsd_pkg;
98 
99     /* Resources */
100     struct resource_list	ad_rl;
101 };
102 
103 #ifdef INTRNG
104 struct intr_map_data_acpi {
105 	struct intr_map_data	hdr;
106 	u_int			irq;
107 	u_int			pol;
108 	u_int			trig;
109 };
110 
111 #endif
112 
113 #define ACPI_PRW_MAX_POWERRES	8
114 
115 struct acpi_prw_data {
116     ACPI_HANDLE		gpe_handle;
117     int			gpe_bit;
118     int			lowest_wake;
119     ACPI_OBJECT		power_res[ACPI_PRW_MAX_POWERRES];
120     int			power_res_count;
121 };
122 
123 /* Flags for each device defined in the AML namespace. */
124 #define ACPI_FLAG_WAKE_ENABLED	0x1
125 
126 /* Macros for extracting parts of a PCI address from an _ADR value. */
127 #define	ACPI_ADR_PCI_SLOT(adr)	(((adr) & 0xffff0000) >> 16)
128 #define	ACPI_ADR_PCI_FUNC(adr)	((adr) & 0xffff)
129 
130 /*
131  * Entry points to ACPI from above are global functions defined in this
132  * file, sysctls, and I/O on the control device.  Entry points from below
133  * are interrupts (the SCI), notifies, task queue threads, and the thermal
134  * zone polling thread.
135  *
136  * ACPI tables and global shared data are protected by a global lock
137  * (acpi_mutex).
138  *
139  * Each ACPI device can have its own driver-specific mutex for protecting
140  * shared access to local data.  The ACPI_LOCK macros handle mutexes.
141  *
142  * Drivers that need to serialize access to functions (e.g., to route
143  * interrupts, get/set control paths, etc.) should use the sx lock macros
144  * (ACPI_SERIAL).
145  *
146  * ACPI-CA handles its own locking and should not be called with locks held.
147  *
148  * The most complicated path is:
149  *     GPE -> EC runs _Qxx -> _Qxx reads EC space -> GPE
150  */
151 extern struct mtx			acpi_mutex;
152 #define ACPI_LOCK(sys)			mtx_lock(&sys##_mutex)
153 #define ACPI_UNLOCK(sys)		mtx_unlock(&sys##_mutex)
154 #define ACPI_LOCK_ASSERT(sys)		mtx_assert(&sys##_mutex, MA_OWNED);
155 #define ACPI_LOCK_DECL(sys, name)				\
156 	static struct mtx sys##_mutex;				\
157 	MTX_SYSINIT(sys##_mutex, &sys##_mutex, name, MTX_DEF)
158 #define ACPI_SERIAL_BEGIN(sys)		sx_xlock(&sys##_sxlock)
159 #define ACPI_SERIAL_END(sys)		sx_xunlock(&sys##_sxlock)
160 #define ACPI_SERIAL_ASSERT(sys)		sx_assert(&sys##_sxlock, SX_XLOCKED);
161 #define ACPI_SERIAL_DECL(sys, name)				\
162 	static struct sx sys##_sxlock;				\
163 	SX_SYSINIT(sys##_sxlock, &sys##_sxlock, name)
164 
165 /*
166  * ACPI CA does not define layers for non-ACPI CA drivers.
167  * We define some here within the range provided.
168  */
169 #define	ACPI_AC_ADAPTER		0x00010000
170 #define	ACPI_BATTERY		0x00020000
171 #define	ACPI_BUS		0x00040000
172 #define	ACPI_BUTTON		0x00080000
173 #define	ACPI_EC			0x00100000
174 #define	ACPI_FAN		0x00200000
175 #define	ACPI_POWERRES		0x00400000
176 #define	ACPI_PROCESSOR		0x00800000
177 #define	ACPI_THERMAL		0x01000000
178 #define	ACPI_TIMER		0x02000000
179 #define	ACPI_OEM		0x04000000
180 #define	ACPI_SPMC		0x08000000
181 
182 /*
183  * Constants for different interrupt models used with acpi_SetIntrModel().
184  */
185 #define	ACPI_INTR_PIC		0
186 #define	ACPI_INTR_APIC		1
187 #define	ACPI_INTR_SAPIC		2
188 
189 /*
190  * Various features and capabilities for the acpi_get_features() method.
191  * In particular, these are used for the ACPI 3.0 _PDC and _OSC methods.
192  * See the Intel document titled "Intel Processor Vendor-Specific ACPI",
193  * number 302223-007.
194  */
195 #define	ACPI_CAP_PERF_MSRS	(1 << 0)  /* Intel SpeedStep PERF_CTL MSRs */
196 #define	ACPI_CAP_C1_IO_HALT	(1 << 1)  /* Intel C1 "IO then halt" sequence */
197 #define	ACPI_CAP_THR_MSRS	(1 << 2)  /* Intel OnDemand throttling MSRs */
198 #define	ACPI_CAP_SMP_SAME	(1 << 3)  /* MP C1, Px, and Tx (all the same) */
199 #define	ACPI_CAP_SMP_SAME_C3	(1 << 4)  /* MP C2 and C3 (all the same) */
200 #define	ACPI_CAP_SMP_DIFF_PX	(1 << 5)  /* MP Px (different, using _PSD) */
201 #define	ACPI_CAP_SMP_DIFF_CX	(1 << 6)  /* MP Cx (different, using _CSD) */
202 #define	ACPI_CAP_SMP_DIFF_TX	(1 << 7)  /* MP Tx (different, using _TSD) */
203 #define	ACPI_CAP_SMP_C1_NATIVE	(1 << 8)  /* MP C1 support other than halt */
204 #define	ACPI_CAP_SMP_C3_NATIVE	(1 << 9)  /* MP C2 and C3 support */
205 #define	ACPI_CAP_PX_HW_COORD	(1 << 11) /* Intel P-state HW coordination */
206 #define	ACPI_CAP_INTR_CPPC	(1 << 12) /* Native Interrupt Handling for
207 	     Collaborative Processor Performance Control notifications */
208 #define	ACPI_CAP_HW_DUTY_C	(1 << 13) /* Hardware Duty Cycling */
209 
210 /*
211  * Quirk flags.
212  *
213  * ACPI_Q_BROKEN: Disables all ACPI support.
214  * ACPI_Q_TIMER: Disables support for the ACPI timer.
215  * ACPI_Q_MADT_IRQ0: Specifies that ISA IRQ 0 is wired up to pin 0 of the
216  *	first APIC and that the MADT should force that by ignoring the PC-AT
217  *	compatible flag and ignoring overrides that redirect IRQ 0 to pin 2.
218  * ACPI_Q_AEI_NOPULL: Specifies that _AEI objects incorrectly designate pins
219  *	as "PullUp" and they should be treated as "NoPull" instead.
220  * ACPI_Q_CLEAR_PME_ON_DETACH: Specifies that PCIM_PSTAT_(PME & ~PMEENABLE)
221  *	should be written to the power status register as part of ACPI Eject.
222  * ACPI_Q_DELAY_BEFORE_EJECT_RESCAN: Specifies that we need a short (10ms)
223  *	delay after _EJ0 returns before rescanning the PCI bus.
224  */
225 extern int	acpi_quirks;
226 #define ACPI_Q_OK		0
227 #define ACPI_Q_BROKEN		(1 << 0)
228 #define ACPI_Q_TIMER		(1 << 1)
229 #define ACPI_Q_MADT_IRQ0	(1 << 2)
230 #define ACPI_Q_AEI_NOPULL	(1 << 3)
231 #define ACPI_Q_CLEAR_PME_ON_DETACH	(1 << 4)
232 #define ACPI_Q_DELAY_BEFORE_EJECT_RESCAN	(1 << 5)
233 
234 #if defined(__amd64__) || defined(__i386__)
235 /*
236  * Certain Intel BIOSes have buggy AML that specify an IRQ that is
237  * edge-sensitive and active-lo.  Normally, edge-sensitive IRQs should
238  * be active-hi.  If this value is non-zero, edge-sensitive ISA IRQs
239  * are forced to be active-hi instead.  At least some AMD systems use
240  * active-lo edge-sensitive ISA IRQs, so this setting is only enabled
241  * by default on systems with Intel CPUs.
242  */
243 extern int	acpi_override_isa_irq_polarity;
244 #endif
245 
246 /*
247  * Plug and play information for device matching.  Matching table format
248  * is compatible with ids parameter of ACPI_ID_PROBE bus method.
249  *
250  * XXX: While ACPI_ID_PROBE matches against _HID and all _CIDs, current
251  *      acpi_pnpinfo() exports only _HID and first _CID.  That means second
252  *      and further _CIDs should be added to both acpi_pnpinfo() and
253  *      ACPICOMPAT_PNP_INFO if device matching against them is required.
254  */
255 #define	ACPICOMPAT_PNP_INFO(t, busname)					\
256 	MODULE_PNP_INFO("Z:_HID", busname, t##hid, t, nitems(t)-1);	\
257 	MODULE_PNP_INFO("Z:_CID", busname, t##cid, t, nitems(t)-1);
258 #define	ACPI_PNP_INFO(t)	ACPICOMPAT_PNP_INFO(t, acpi)
259 
260 /*
261  * Note that the low ivar values are reserved to provide
262  * interface compatibility with ISA drivers which can also
263  * attach to ACPI.
264  */
265 enum {
266 	ACPI_IVAR_PRIVATE = 20,
267 	ACPI_IVAR_DOMAIN,
268 	ACPI_IVAR_HANDLE = BUS_IVARS_ACPI,
269 	ACPI_IVAR_FLAGS
270 };
271 
272 /*
273  * ad_domain NUMA domain special value.
274  */
275 #define	ACPI_DEV_DOMAIN_UNKNOWN	(-1)
276 
277 __BUS_ACCESSOR_DEFAULT(acpi, handle, ACPI, HANDLE, ACPI_HANDLE, NULL)
278 __BUS_ACCESSOR(acpi, private, ACPI, PRIVATE, void *)
279 __BUS_ACCESSOR(acpi, flags, ACPI, FLAGS, int)
280 __BUS_ACCESSOR(acpi, domain, ACPI, DOMAIN, int)
281 
282 void acpi_fake_objhandler(ACPI_HANDLE h, void *data);
283 static __inline device_t
284 acpi_get_device(ACPI_HANDLE handle)
285 {
286     void *dev = NULL;
287     AcpiGetData(handle, acpi_fake_objhandler, &dev);
288     return ((device_t)dev);
289 }
290 
291 static __inline ACPI_OBJECT_TYPE
292 acpi_get_type(device_t dev)
293 {
294     ACPI_HANDLE		h;
295     ACPI_OBJECT_TYPE	t;
296 
297     if ((h = acpi_get_handle(dev)) == NULL)
298 	return (ACPI_TYPE_NOT_FOUND);
299     if (ACPI_FAILURE(AcpiGetType(h, &t)))
300 	return (ACPI_TYPE_NOT_FOUND);
301     return (t);
302 }
303 
304 /* Find the difference between two PM tick counts. */
305 static __inline uint32_t
306 acpi_TimerDelta(uint32_t end, uint32_t start)
307 {
308 
309 	if (end < start && (AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) == 0)
310 		end |= 0x01000000;
311 	return (end - start);
312 }
313 
314 #ifdef ACPI_DEBUGGER
315 void		acpi_EnterDebugger(void);
316 #endif
317 
318 #ifdef ACPI_DEBUG
319 #include <sys/cons.h>
320 #define STEP(x)		do {printf x, printf("\n"); cngetc();} while (0)
321 #else
322 #define STEP(x)
323 #endif
324 
325 #define ACPI_VPRINT(dev, acpi_sc, x...) do {			\
326     if (acpi_get_verbose(acpi_sc))				\
327 	device_printf(dev, x);					\
328 } while (0)
329 
330 /* Values for the first status word returned by _OSC. */
331 #define	ACPI_OSC_FAILURE	(1 << 1)
332 #define	ACPI_OSC_BAD_UUID	(1 << 2)
333 #define	ACPI_OSC_BAD_REVISION	(1 << 3)
334 #define	ACPI_OSC_CAPS_MASKED	(1 << 4)
335 
336 #define ACPI_DEVINFO_PRESENT(x, flags)					\
337 	(((x) & (flags)) == (flags))
338 #define ACPI_DEVICE_PRESENT(x)						\
339 	ACPI_DEVINFO_PRESENT(x, ACPI_STA_DEVICE_PRESENT |		\
340 	    ACPI_STA_DEVICE_FUNCTIONING)
341 #define ACPI_BATTERY_PRESENT(x)						\
342 	ACPI_DEVINFO_PRESENT(x, ACPI_STA_DEVICE_PRESENT |		\
343 	    ACPI_STA_DEVICE_FUNCTIONING | ACPI_STA_BATTERY_PRESENT)
344 
345 /* Callback function type for walking subtables within a table. */
346 typedef void acpi_subtable_handler(ACPI_SUBTABLE_HEADER *, void *);
347 
348 BOOLEAN		acpi_DeviceIsPresent(device_t dev);
349 BOOLEAN		acpi_BatteryIsPresent(device_t dev);
350 ACPI_STATUS	acpi_GetHandleInScope(ACPI_HANDLE parent, const char *path,
351 		    ACPI_HANDLE *result);
352 ACPI_STATUS	acpi_GetProperty(device_t dev, const char *propname,
353 		    const ACPI_OBJECT **value);
354 ACPI_BUFFER	*acpi_AllocBuffer(int size);
355 ACPI_STATUS	acpi_ConvertBufferToInteger(ACPI_BUFFER *bufp,
356 		    UINT32 *number);
357 ACPI_STATUS	acpi_GetInteger(ACPI_HANDLE handle, char *path,
358 		    UINT32 *number);
359 ACPI_STATUS	acpi_SetInteger(ACPI_HANDLE handle, char *path,
360 		    UINT32 number);
361 ACPI_STATUS	acpi_ForeachPackageObject(ACPI_OBJECT *obj,
362 		    void (*func)(ACPI_OBJECT *comp, void *arg), void *arg);
363 ACPI_STATUS	acpi_FindIndexedResource(ACPI_BUFFER *buf, int index,
364 		    ACPI_RESOURCE **resp);
365 ACPI_STATUS	acpi_AppendBufferResource(ACPI_BUFFER *buf,
366 		    ACPI_RESOURCE *res);
367 UINT64		acpi_DSMQuery(ACPI_HANDLE h, const uint8_t *uuid,
368 		    int revision);
369 ACPI_STATUS	acpi_EvaluateDSM(ACPI_HANDLE handle, const uint8_t *uuid,
370 		    int revision, UINT64 function, ACPI_OBJECT *package,
371 		    ACPI_BUFFER *out_buf);
372 ACPI_STATUS	acpi_EvaluateDSMTyped(ACPI_HANDLE handle,
373 		    const uint8_t *uuid, int revision, UINT64 function,
374 		    ACPI_OBJECT *package, ACPI_BUFFER *out_buf,
375 		    ACPI_OBJECT_TYPE type);
376 ACPI_STATUS	acpi_EvaluateOSC(ACPI_HANDLE handle, uint8_t *uuid,
377 		    int revision, int count, uint32_t *caps_in,
378 		    uint32_t *caps_out, bool query);
379 ACPI_STATUS	acpi_OverrideInterruptLevel(UINT32 InterruptNumber);
380 ACPI_STATUS	acpi_SetIntrModel(int model);
381 int		acpi_ReqSleepState(struct acpi_softc *sc, enum power_stype stype);
382 ACPI_STATUS	acpi_SetSleepState(struct acpi_softc *sc, int state);
383 int		acpi_wake_set_enable(device_t dev, int enable);
384 int		acpi_parse_prw(ACPI_HANDLE h, struct acpi_prw_data *prw);
385 ACPI_STATUS	acpi_Startup(void);
386 void		acpi_UserNotify(const char *subsystem, ACPI_HANDLE h,
387 		    uint8_t notify);
388 int		acpi_bus_alloc_gas(device_t dev, int *type, int rid,
389 		    ACPI_GENERIC_ADDRESS *gas, struct resource **res,
390 		    u_int flags);
391 void		acpi_walk_subtables(void *first, void *end,
392 		    acpi_subtable_handler *handler, void *arg);
393 BOOLEAN		acpi_has_hid(ACPI_HANDLE handle);
394 int		acpi_MatchHid(ACPI_HANDLE h, const char *hid);
395 #define ACPI_MATCHHID_NOMATCH 0
396 #define ACPI_MATCHHID_HID 1
397 #define ACPI_MATCHHID_CID 2
398 
399 static __inline bool
400 acpi_HasProperty(device_t dev, const char *propname)
401 {
402 
403 	return ACPI_SUCCESS(acpi_GetProperty(dev, propname, NULL));
404 }
405 
406 struct acpi_parse_resource_set {
407     void	(*set_init)(device_t dev, void *arg, void **context);
408     void	(*set_done)(device_t dev, void *context);
409     void	(*set_ioport)(device_t dev, void *context, uint64_t base,
410 		    uint64_t length);
411     void	(*set_iorange)(device_t dev, void *context, uint64_t low,
412 		    uint64_t high, uint64_t length, uint64_t align);
413     void	(*set_memory)(device_t dev, void *context, uint64_t base,
414 		    uint64_t length);
415     void	(*set_memoryrange)(device_t dev, void *context, uint64_t low,
416 		    uint64_t high, uint64_t length, uint64_t align);
417     void	(*set_irq)(device_t dev, void *context, uint8_t *irq,
418 		    int count, int trig, int pol);
419     void	(*set_ext_irq)(device_t dev, void *context, uint32_t *irq,
420 		    int count, int trig, int pol);
421     void	(*set_drq)(device_t dev, void *context, uint8_t *drq,
422 		    int count);
423     void	(*set_start_dependent)(device_t dev, void *context,
424 		    int preference);
425     void	(*set_end_dependent)(device_t dev, void *context);
426 };
427 
428 extern struct	acpi_parse_resource_set acpi_res_parse_set;
429 
430 int		acpi_identify(void);
431 void		acpi_config_intr(device_t dev, ACPI_RESOURCE *res);
432 #ifdef INTRNG
433 int		acpi_map_intr(device_t dev, u_int irq, ACPI_HANDLE handle);
434 #endif
435 ACPI_STATUS	acpi_lookup_irq_resource(device_t dev, int rid,
436 		    struct resource *res, ACPI_RESOURCE *acpi_res);
437 ACPI_STATUS	acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
438 		    struct acpi_parse_resource_set *set, void *arg);
439 
440 /* ACPI event handling */
441 UINT32		acpi_event_power_button_sleep(struct acpi_softc *sc);
442 UINT32		acpi_event_power_button_wake(struct acpi_softc *sc);
443 UINT32		acpi_event_sleep_button_sleep(struct acpi_softc *sc);
444 UINT32		acpi_event_sleep_button_wake(struct acpi_softc *sc);
445 
446 #define ACPI_EVENT_PRI_FIRST      0
447 #define ACPI_EVENT_PRI_DEFAULT    10000
448 #define ACPI_EVENT_PRI_LAST       20000
449 
450 typedef void (*acpi_event_handler_t)(void *, enum power_stype);
451 
452 EVENTHANDLER_DECLARE(acpi_sleep_event, acpi_event_handler_t);
453 EVENTHANDLER_DECLARE(acpi_wakeup_event, acpi_event_handler_t);
454 EVENTHANDLER_DECLARE(acpi_acad_event, acpi_event_handler_t);
455 EVENTHANDLER_DECLARE(acpi_video_event, acpi_event_handler_t);
456 EVENTHANDLER_DECLARE(acpi_post_dev_suspend, acpi_event_handler_t);
457 EVENTHANDLER_DECLARE(acpi_pre_dev_resume, acpi_event_handler_t);
458 
459 /* Lid state changes.  The int argument is 1 for open, 0 for closed. */
460 typedef void (*acpi_lid_event_handler_t)(void *, int);
461 
462 EVENTHANDLER_DECLARE(acpi_lid_event, acpi_lid_event_handler_t);
463 
464 void		acpi_invoke_sleep_eventhandler(const enum power_stype *stype);
465 void		acpi_invoke_wake_eventhandler(const enum power_stype *stype);
466 
467 /* Device power control. */
468 ACPI_STATUS	acpi_pwr_wake_enable(ACPI_HANDLE consumer, int enable);
469 ACPI_STATUS	acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state);
470 acpi_pwr_for_sleep_t	acpi_device_pwr_for_sleep;
471 int		acpi_set_powerstate(device_t child, int state);
472 
473 /* APM emulation */
474 void		acpi_apm_init(struct acpi_softc *);
475 
476 /* Misc. */
477 static __inline struct acpi_softc *
478 acpi_device_get_parent_softc(device_t child)
479 {
480     device_t	parent;
481 
482     parent = device_get_parent(child);
483     if (parent == NULL)
484 	return (NULL);
485     return (device_get_softc(parent));
486 }
487 
488 static __inline int
489 acpi_get_verbose(struct acpi_softc *sc)
490 {
491     if (sc)
492 	return (sc->acpi_verbose);
493     return (0);
494 }
495 
496 static __inline const char *
497 acpi_d_state_to_str(int state)
498 {
499     const char *strs[ACPI_D_STATE_COUNT] = {"D0", "D1", "D2", "D3hot",
500 	"D3cold"};
501 
502     if (state == ACPI_STATE_UNKNOWN)
503 	return ("unknown D-state");
504     MPASS(state >= ACPI_STATE_D0 && state <= ACPI_D_STATES_MAX);
505     return (strs[state]);
506 }
507 
508 char		*acpi_name(ACPI_HANDLE handle);
509 int		acpi_avoid(ACPI_HANDLE handle);
510 int		acpi_disabled(char *subsys);
511 int		acpi_get_acpi_device_path(device_t bus, device_t child,
512 		    const char *locator, struct sbuf *sb);
513 int		acpi_machdep_init(device_t dev);
514 void		acpi_install_wakeup_handler(struct acpi_softc *sc);
515 int		acpi_sleep_machdep(struct acpi_softc *sc, int state);
516 int		acpi_wakeup_machdep(struct acpi_softc *sc, int state,
517 		    int sleep_result, int intr_enabled);
518 int		acpi_table_quirks(int *quirks);
519 int		acpi_machdep_quirks(int *quirks);
520 int		acpi_pnpinfo(ACPI_HANDLE handle, struct sbuf *sb);
521 
522 uint32_t	hpet_get_uid(device_t dev);
523 
524 /* Battery Abstraction. */
525 struct acpi_battinfo;
526 
527 int		acpi_battery_register(device_t dev);
528 int		acpi_battery_remove(device_t dev);
529 int		acpi_battery_get_units(void);
530 int		acpi_battery_get_info_expire(void);
531 int		acpi_battery_bst_valid(struct acpi_bst *bst);
532 int		acpi_battery_bix_valid(struct acpi_bix *bix);
533 int		acpi_battery_get_battinfo(device_t dev,
534 		    struct acpi_battinfo *info);
535 
536 /* Embedded controller. */
537 void		acpi_ec_ecdt_probe(device_t);
538 
539 /* AC adapter interface. */
540 int		acpi_acad_get_acline(int *);
541 
542 /* Package manipulation convenience functions. */
543 #define ACPI_PKG_VALID(pkg, size)				\
544     ((pkg) != NULL && (pkg)->Type == ACPI_TYPE_PACKAGE &&	\
545      (pkg)->Package.Count >= (size))
546 #define	ACPI_PKG_VALID_EQ(pkg, size)				\
547     ((pkg) != NULL && (pkg)->Type == ACPI_TYPE_PACKAGE &&	\
548      (pkg)->Package.Count == (size))
549 int		acpi_PkgInt(ACPI_OBJECT *res, int idx, UINT64 *dst);
550 int		acpi_PkgInt32(ACPI_OBJECT *res, int idx, uint32_t *dst);
551 int		acpi_PkgInt16(ACPI_OBJECT *res, int idx, uint16_t *dst);
552 int		acpi_PkgStr(ACPI_OBJECT *res, int idx, void *dst, size_t size);
553 int		acpi_PkgGas(device_t dev, ACPI_OBJECT *res, int idx, int *type,
554 		    int rid, struct resource **dst, u_int flags);
555 int		acpi_PkgFFH_IntelCpu(ACPI_OBJECT *res, int idx, int *vendor,
556 		    int *class, uint64_t *address, int *accsize);
557 ACPI_HANDLE	acpi_GetReference(ACPI_HANDLE scope, ACPI_OBJECT *obj);
558 
559 /*
560  * Base level for BUS_ADD_CHILD.  Special devices are added at orders less
561  * than this, and normal devices at or above this level.  This keeps the
562  * probe order sorted so that things like sysresource are available before
563  * their children need them.
564  */
565 #define	ACPI_DEV_BASE_ORDER	100
566 
567 /* Default maximum number of tasks to enqueue. */
568 #ifndef ACPI_MAX_TASKS
569 #define	ACPI_MAX_TASKS		MAX(32, MAXCPU * 4)
570 #endif
571 
572 /* Default number of task queue threads to start. */
573 #ifndef ACPI_MAX_THREADS
574 #define ACPI_MAX_THREADS	3
575 #endif
576 
577 /* Use the device logging level for ktr(4). */
578 #define	KTR_ACPI		KTR_DEV
579 
580 SYSCTL_DECL(_debug_acpi);
581 
582 /*
583  * Parse and use proximity information in SRAT and SLIT.
584  */
585 int		acpi_pxm_init(int ncpus, vm_paddr_t maxphys);
586 void		acpi_pxm_parse_tables(void);
587 void		acpi_pxm_set_mem_locality(void);
588 void		acpi_pxm_set_cpu_locality(void);
589 int		acpi_pxm_get_cpu_locality(int apic_id);
590 int		acpi_pxm_parse(device_t dev);
591 int		acpi_get_cpus_for_domain(device_t dev, device_t child,
592 		    int domain, enum cpu_sets op, size_t setsize,
593 		    cpuset_t *cpuset);
594 
595 /*
596  * Map a PXM to a VM domain.
597  *
598  * Returns the VM domain ID if found, or -1 if not found / invalid.
599  */
600 int		acpi_map_pxm_to_vm_domainid(int pxm);
601 bus_get_cpus_t		acpi_get_cpus;
602 
603 /*
604  * Hook for ACPI sleep routine.
605  */
606 extern int (*acpi_prepare_sleep)(uint8_t state, uint32_t a, uint32_t b,
607     bool ext);
608 
609 static inline void
610 acpi_set_prepare_sleep(
611     int (*hook)(uint8_t state, uint32_t a, uint32_t b, bool ext))
612 {
613 	acpi_prepare_sleep = hook;
614 }
615 
616 #ifdef __aarch64__
617 /*
618  * ARM specific ACPI interfaces, relating to IORT table.
619  */
620 int	acpi_iort_map_pci_msi(u_int seg, u_int rid, u_int *xref, u_int *devid);
621 int	acpi_iort_map_pci_smmuv3(u_int seg, u_int rid, uint64_t *xref,
622 	    u_int *devid);
623 int	acpi_iort_its_lookup(u_int its_id, u_int *xref, int *pxm);
624 int	acpi_iort_map_named_msi(const char *devname, u_int rid, u_int *xref,
625 	    u_int *devid);
626 int	acpi_iort_map_named_smmuv3(const char *devname, u_int rid,
627 	    uint64_t *xref, u_int *devid);
628 int	acpi_iort_lookup_its_from_iwb(device_t dev, int *its_id);
629 device_t	acpi_iort_get_iwb_dev(int iwb_id);
630 int	acpi_iort_lookup_pci_id(device_t bus, device_t child, uintptr_t *devid);
631 int	acpi_iort_alloc_msi(device_t bus, device_t child, int *count);
632 #endif
633 #endif /* _KERNEL */
634 #endif /* !_ACPIVAR_H_ */
635