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/selinfo.h>
44#include <sys/sx.h>
45#include <sys/sysctl.h>
46
47#include <machine/bus.h>
48#include <machine/resource.h>
49
50struct apm_clone_data;
51struct acpi_softc {
52    device_t		acpi_dev;
53    struct cdev		*acpi_dev_t;
54
55    int			acpi_enabled;
56    int			acpi_sstate;
57    int			acpi_sleep_disabled;
58
59    struct sysctl_ctx_list acpi_sysctl_ctx;
60    struct sysctl_oid	*acpi_sysctl_tree;
61    int			acpi_power_button_sx;
62    int			acpi_sleep_button_sx;
63    int			acpi_lid_switch_sx;
64
65    int			acpi_standby_sx;
66    int			acpi_suspend_sx;
67
68    int			acpi_sleep_delay;
69    int			acpi_s4bios;
70    int			acpi_do_disable;
71    int			acpi_verbose;
72    int			acpi_handle_reboot;
73
74    vm_offset_t		acpi_wakeaddr;
75    vm_paddr_t		acpi_wakephys;
76
77    int			acpi_next_sstate;	/* Next suspend Sx state. */
78    struct apm_clone_data *acpi_clone;		/* Pseudo-dev for devd(8). */
79    STAILQ_HEAD(,apm_clone_data) apm_cdevs;	/* All apm/apmctl/acpi cdevs. */
80    struct callout	susp_force_to;		/* Force suspend if no acks. */
81
82    /* System Resources */
83    struct resource_list sysres_rl;
84};
85
86struct acpi_device {
87    /* ACPI ivars */
88    ACPI_HANDLE			ad_handle;
89    void			*ad_private;
90    int				ad_flags;
91    int				ad_cls_class;
92
93    ACPI_BUFFER			dsd;	/* Device Specific Data */
94    const ACPI_OBJECT	*dsd_pkg;
95
96    /* Resources */
97    struct resource_list	ad_rl;
98};
99
100#ifdef INTRNG
101struct intr_map_data_acpi {
102	struct intr_map_data	hdr;
103	u_int			irq;
104	u_int			pol;
105	u_int			trig;
106};
107
108#endif
109
110/* Track device (/dev/{apm,apmctl} and /dev/acpi) notification status. */
111struct apm_clone_data {
112    STAILQ_ENTRY(apm_clone_data) entries;
113    struct cdev 	*cdev;
114    int			flags;
115#define	ACPI_EVF_NONE	0	/* /dev/apm semantics */
116#define	ACPI_EVF_DEVD	1	/* /dev/acpi is handled via devd(8) */
117#define	ACPI_EVF_WRITE	2	/* Device instance is opened writable. */
118    int			notify_status;
119#define	APM_EV_NONE	0	/* Device not yet aware of pending sleep. */
120#define	APM_EV_NOTIFIED	1	/* Device saw next sleep state. */
121#define	APM_EV_ACKED	2	/* Device agreed sleep can occur. */
122    struct acpi_softc	*acpi_sc;
123    struct selinfo	sel_read;
124};
125
126#define ACPI_PRW_MAX_POWERRES	8
127
128struct acpi_prw_data {
129    ACPI_HANDLE		gpe_handle;
130    int			gpe_bit;
131    int			lowest_wake;
132    ACPI_OBJECT		power_res[ACPI_PRW_MAX_POWERRES];
133    int			power_res_count;
134};
135
136/* Flags for each device defined in the AML namespace. */
137#define ACPI_FLAG_WAKE_ENABLED	0x1
138
139/* Macros for extracting parts of a PCI address from an _ADR value. */
140#define	ACPI_ADR_PCI_SLOT(adr)	(((adr) & 0xffff0000) >> 16)
141#define	ACPI_ADR_PCI_FUNC(adr)	((adr) & 0xffff)
142
143/*
144 * Entry points to ACPI from above are global functions defined in this
145 * file, sysctls, and I/O on the control device.  Entry points from below
146 * are interrupts (the SCI), notifies, task queue threads, and the thermal
147 * zone polling thread.
148 *
149 * ACPI tables and global shared data are protected by a global lock
150 * (acpi_mutex).
151 *
152 * Each ACPI device can have its own driver-specific mutex for protecting
153 * shared access to local data.  The ACPI_LOCK macros handle mutexes.
154 *
155 * Drivers that need to serialize access to functions (e.g., to route
156 * interrupts, get/set control paths, etc.) should use the sx lock macros
157 * (ACPI_SERIAL).
158 *
159 * ACPI-CA handles its own locking and should not be called with locks held.
160 *
161 * The most complicated path is:
162 *     GPE -> EC runs _Qxx -> _Qxx reads EC space -> GPE
163 */
164extern struct mtx			acpi_mutex;
165#define ACPI_LOCK(sys)			mtx_lock(&sys##_mutex)
166#define ACPI_UNLOCK(sys)		mtx_unlock(&sys##_mutex)
167#define ACPI_LOCK_ASSERT(sys)		mtx_assert(&sys##_mutex, MA_OWNED);
168#define ACPI_LOCK_DECL(sys, name)				\
169	static struct mtx sys##_mutex;				\
170	MTX_SYSINIT(sys##_mutex, &sys##_mutex, name, MTX_DEF)
171#define ACPI_SERIAL_BEGIN(sys)		sx_xlock(&sys##_sxlock)
172#define ACPI_SERIAL_END(sys)		sx_xunlock(&sys##_sxlock)
173#define ACPI_SERIAL_ASSERT(sys)		sx_assert(&sys##_sxlock, SX_XLOCKED);
174#define ACPI_SERIAL_DECL(sys, name)				\
175	static struct sx sys##_sxlock;				\
176	SX_SYSINIT(sys##_sxlock, &sys##_sxlock, name)
177
178/*
179 * ACPI CA does not define layers for non-ACPI CA drivers.
180 * We define some here within the range provided.
181 */
182#define	ACPI_AC_ADAPTER		0x00010000
183#define	ACPI_BATTERY		0x00020000
184#define	ACPI_BUS		0x00040000
185#define	ACPI_BUTTON		0x00080000
186#define	ACPI_EC			0x00100000
187#define	ACPI_FAN		0x00200000
188#define	ACPI_POWERRES		0x00400000
189#define	ACPI_PROCESSOR		0x00800000
190#define	ACPI_THERMAL		0x01000000
191#define	ACPI_TIMER		0x02000000
192#define	ACPI_OEM		0x04000000
193
194/*
195 * Constants for different interrupt models used with acpi_SetIntrModel().
196 */
197#define	ACPI_INTR_PIC		0
198#define	ACPI_INTR_APIC		1
199#define	ACPI_INTR_SAPIC		2
200
201/*
202 * Various features and capabilities for the acpi_get_features() method.
203 * In particular, these are used for the ACPI 3.0 _PDC and _OSC methods.
204 * See the Intel document titled "Intel Processor Vendor-Specific ACPI",
205 * number 302223-007.
206 */
207#define	ACPI_CAP_PERF_MSRS	(1 << 0)  /* Intel SpeedStep PERF_CTL MSRs */
208#define	ACPI_CAP_C1_IO_HALT	(1 << 1)  /* Intel C1 "IO then halt" sequence */
209#define	ACPI_CAP_THR_MSRS	(1 << 2)  /* Intel OnDemand throttling MSRs */
210#define	ACPI_CAP_SMP_SAME	(1 << 3)  /* MP C1, Px, and Tx (all the same) */
211#define	ACPI_CAP_SMP_SAME_C3	(1 << 4)  /* MP C2 and C3 (all the same) */
212#define	ACPI_CAP_SMP_DIFF_PX	(1 << 5)  /* MP Px (different, using _PSD) */
213#define	ACPI_CAP_SMP_DIFF_CX	(1 << 6)  /* MP Cx (different, using _CSD) */
214#define	ACPI_CAP_SMP_DIFF_TX	(1 << 7)  /* MP Tx (different, using _TSD) */
215#define	ACPI_CAP_SMP_C1_NATIVE	(1 << 8)  /* MP C1 support other than halt */
216#define	ACPI_CAP_SMP_C3_NATIVE	(1 << 9)  /* MP C2 and C3 support */
217#define	ACPI_CAP_PX_HW_COORD	(1 << 11) /* Intel P-state HW coordination */
218#define	ACPI_CAP_INTR_CPPC	(1 << 12) /* Native Interrupt Handling for
219	     Collaborative Processor Performance Control notifications */
220#define	ACPI_CAP_HW_DUTY_C	(1 << 13) /* Hardware Duty Cycling */
221
222/*
223 * Quirk flags.
224 *
225 * ACPI_Q_BROKEN: Disables all ACPI support.
226 * ACPI_Q_TIMER: Disables support for the ACPI timer.
227 * ACPI_Q_MADT_IRQ0: Specifies that ISA IRQ 0 is wired up to pin 0 of the
228 *	first APIC and that the MADT should force that by ignoring the PC-AT
229 *	compatible flag and ignoring overrides that redirect IRQ 0 to pin 2.
230 */
231extern int	acpi_quirks;
232#define ACPI_Q_OK		0
233#define ACPI_Q_BROKEN		(1 << 0)
234#define ACPI_Q_TIMER		(1 << 1)
235#define ACPI_Q_MADT_IRQ0	(1 << 2)
236
237/*
238 * Plug and play information for device matching.  Matching table format
239 * is compatible with ids parameter of ACPI_ID_PROBE bus method.
240 *
241 * XXX: While ACPI_ID_PROBE matches against _HID and all _CIDs, current
242 *      acpi_pnpinfo() exports only _HID and first _CID.  That means second
243 *      and further _CIDs should be added to both acpi_pnpinfo() and
244 *      ACPICOMPAT_PNP_INFO if device matching against them is required.
245 */
246#define	ACPICOMPAT_PNP_INFO(t, busname)					\
247	MODULE_PNP_INFO("Z:_HID", busname, t##hid, t, nitems(t)-1);	\
248	MODULE_PNP_INFO("Z:_CID", busname, t##cid, t, nitems(t)-1);
249#define	ACPI_PNP_INFO(t)	ACPICOMPAT_PNP_INFO(t, acpi)
250
251/*
252 * Note that the low ivar values are reserved to provide
253 * interface compatibility with ISA drivers which can also
254 * attach to ACPI.
255 */
256#define ACPI_IVAR_HANDLE	0x100
257#define ACPI_IVAR_UNUSED	0x101	/* Unused/reserved. */
258#define ACPI_IVAR_PRIVATE	0x102
259#define ACPI_IVAR_FLAGS		0x103
260
261/*
262 * Accessor functions for our ivars.  Default value for BUS_READ_IVAR is
263 * (type) 0.  The <sys/bus.h> accessor functions don't check return values.
264 */
265#define __ACPI_BUS_ACCESSOR(varp, var, ivarp, ivar, type)	\
266								\
267static __inline type varp ## _get_ ## var(device_t dev)		\
268{								\
269    uintptr_t v = 0;						\
270    BUS_READ_IVAR(device_get_parent(dev), dev,			\
271	ivarp ## _IVAR_ ## ivar, &v);				\
272    return ((type) v);						\
273}								\
274								\
275static __inline void varp ## _set_ ## var(device_t dev, type t)	\
276{								\
277    uintptr_t v = (uintptr_t) t;				\
278    BUS_WRITE_IVAR(device_get_parent(dev), dev,			\
279	ivarp ## _IVAR_ ## ivar, v);				\
280}
281
282__ACPI_BUS_ACCESSOR(acpi, handle, ACPI, HANDLE, ACPI_HANDLE)
283__ACPI_BUS_ACCESSOR(acpi, private, ACPI, PRIVATE, void *)
284__ACPI_BUS_ACCESSOR(acpi, flags, ACPI, FLAGS, int)
285
286void acpi_fake_objhandler(ACPI_HANDLE h, void *data);
287static __inline device_t
288acpi_get_device(ACPI_HANDLE handle)
289{
290    void *dev = NULL;
291    AcpiGetData(handle, acpi_fake_objhandler, &dev);
292    return ((device_t)dev);
293}
294
295static __inline ACPI_OBJECT_TYPE
296acpi_get_type(device_t dev)
297{
298    ACPI_HANDLE		h;
299    ACPI_OBJECT_TYPE	t;
300
301    if ((h = acpi_get_handle(dev)) == NULL)
302	return (ACPI_TYPE_NOT_FOUND);
303    if (ACPI_FAILURE(AcpiGetType(h, &t)))
304	return (ACPI_TYPE_NOT_FOUND);
305    return (t);
306}
307
308/* Find the difference between two PM tick counts. */
309static __inline uint32_t
310acpi_TimerDelta(uint32_t end, uint32_t start)
311{
312
313	if (end < start && (AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) == 0)
314		end |= 0x01000000;
315	return (end - start);
316}
317
318#ifdef ACPI_DEBUGGER
319void		acpi_EnterDebugger(void);
320#endif
321
322#ifdef ACPI_DEBUG
323#include <sys/cons.h>
324#define STEP(x)		do {printf x, printf("\n"); cngetc();} while (0)
325#else
326#define STEP(x)
327#endif
328
329#define ACPI_VPRINT(dev, acpi_sc, x...) do {			\
330    if (acpi_get_verbose(acpi_sc))				\
331	device_printf(dev, x);					\
332} while (0)
333
334/* Values for the first status word returned by _OSC. */
335#define	ACPI_OSC_FAILURE	(1 << 1)
336#define	ACPI_OSC_BAD_UUID	(1 << 2)
337#define	ACPI_OSC_BAD_REVISION	(1 << 3)
338#define	ACPI_OSC_CAPS_MASKED	(1 << 4)
339
340#define ACPI_DEVINFO_PRESENT(x, flags)					\
341	(((x) & (flags)) == (flags))
342#define ACPI_DEVICE_PRESENT(x)						\
343	ACPI_DEVINFO_PRESENT(x, ACPI_STA_DEVICE_PRESENT |		\
344	    ACPI_STA_DEVICE_FUNCTIONING)
345#define ACPI_BATTERY_PRESENT(x)						\
346	ACPI_DEVINFO_PRESENT(x, ACPI_STA_DEVICE_PRESENT |		\
347	    ACPI_STA_DEVICE_FUNCTIONING | ACPI_STA_BATTERY_PRESENT)
348
349/* Callback function type for walking subtables within a table. */
350typedef void acpi_subtable_handler(ACPI_SUBTABLE_HEADER *, void *);
351
352BOOLEAN		acpi_DeviceIsPresent(device_t dev);
353BOOLEAN		acpi_BatteryIsPresent(device_t dev);
354ACPI_STATUS	acpi_GetHandleInScope(ACPI_HANDLE parent, char *path,
355		    ACPI_HANDLE *result);
356ACPI_STATUS	acpi_GetProperty(device_t dev, ACPI_STRING propname,
357		    const ACPI_OBJECT **value);
358ACPI_BUFFER	*acpi_AllocBuffer(int size);
359ACPI_STATUS	acpi_ConvertBufferToInteger(ACPI_BUFFER *bufp,
360		    UINT32 *number);
361ACPI_STATUS	acpi_GetInteger(ACPI_HANDLE handle, char *path,
362		    UINT32 *number);
363ACPI_STATUS	acpi_SetInteger(ACPI_HANDLE handle, char *path,
364		    UINT32 number);
365ACPI_STATUS	acpi_ForeachPackageObject(ACPI_OBJECT *obj,
366		    void (*func)(ACPI_OBJECT *comp, void *arg), void *arg);
367ACPI_STATUS	acpi_FindIndexedResource(ACPI_BUFFER *buf, int index,
368		    ACPI_RESOURCE **resp);
369ACPI_STATUS	acpi_AppendBufferResource(ACPI_BUFFER *buf,
370		    ACPI_RESOURCE *res);
371UINT64		acpi_DSMQuery(ACPI_HANDLE h, const uint8_t *uuid,
372		    int revision);
373ACPI_STATUS	acpi_EvaluateDSM(ACPI_HANDLE handle, const uint8_t *uuid,
374		    int revision, UINT64 function, ACPI_OBJECT *package,
375		    ACPI_BUFFER *out_buf);
376ACPI_STATUS	acpi_EvaluateDSMTyped(ACPI_HANDLE handle,
377		    const uint8_t *uuid, int revision, UINT64 function,
378		    ACPI_OBJECT *package, ACPI_BUFFER *out_buf,
379		    ACPI_OBJECT_TYPE type);
380ACPI_STATUS	acpi_EvaluateOSC(ACPI_HANDLE handle, uint8_t *uuid,
381		    int revision, int count, uint32_t *caps_in,
382		    uint32_t *caps_out, bool query);
383ACPI_STATUS	acpi_OverrideInterruptLevel(UINT32 InterruptNumber);
384ACPI_STATUS	acpi_SetIntrModel(int model);
385int		acpi_ReqSleepState(struct acpi_softc *sc, int state);
386int		acpi_AckSleepState(struct apm_clone_data *clone, int error);
387ACPI_STATUS	acpi_SetSleepState(struct acpi_softc *sc, int state);
388int		acpi_wake_set_enable(device_t dev, int enable);
389int		acpi_parse_prw(ACPI_HANDLE h, struct acpi_prw_data *prw);
390ACPI_STATUS	acpi_Startup(void);
391void		acpi_UserNotify(const char *subsystem, ACPI_HANDLE h,
392		    uint8_t notify);
393int		acpi_bus_alloc_gas(device_t dev, int *type, int *rid,
394		    ACPI_GENERIC_ADDRESS *gas, struct resource **res,
395		    u_int flags);
396void		acpi_walk_subtables(void *first, void *end,
397		    acpi_subtable_handler *handler, void *arg);
398BOOLEAN		acpi_has_hid(ACPI_HANDLE handle);
399int		acpi_MatchHid(ACPI_HANDLE h, const char *hid);
400#define ACPI_MATCHHID_NOMATCH 0
401#define ACPI_MATCHHID_HID 1
402#define ACPI_MATCHHID_CID 2
403
404static __inline bool
405acpi_HasProperty(device_t dev, ACPI_STRING propname)
406{
407
408	return ACPI_SUCCESS(acpi_GetProperty(dev, propname, NULL));
409}
410
411struct acpi_parse_resource_set {
412    void	(*set_init)(device_t dev, void *arg, void **context);
413    void	(*set_done)(device_t dev, void *context);
414    void	(*set_ioport)(device_t dev, void *context, uint64_t base,
415		    uint64_t length);
416    void	(*set_iorange)(device_t dev, void *context, uint64_t low,
417		    uint64_t high, uint64_t length, uint64_t align);
418    void	(*set_memory)(device_t dev, void *context, uint64_t base,
419		    uint64_t length);
420    void	(*set_memoryrange)(device_t dev, void *context, uint64_t low,
421		    uint64_t high, uint64_t length, uint64_t align);
422    void	(*set_irq)(device_t dev, void *context, uint8_t *irq,
423		    int count, int trig, int pol);
424    void	(*set_ext_irq)(device_t dev, void *context, uint32_t *irq,
425		    int count, int trig, int pol);
426    void	(*set_drq)(device_t dev, void *context, uint8_t *drq,
427		    int count);
428    void	(*set_start_dependent)(device_t dev, void *context,
429		    int preference);
430    void	(*set_end_dependent)(device_t dev, void *context);
431};
432
433extern struct	acpi_parse_resource_set acpi_res_parse_set;
434
435int		acpi_identify(void);
436void		acpi_config_intr(device_t dev, ACPI_RESOURCE *res);
437#ifdef INTRNG
438int		acpi_map_intr(device_t dev, u_int irq, ACPI_HANDLE handle);
439#endif
440ACPI_STATUS	acpi_lookup_irq_resource(device_t dev, int rid,
441		    struct resource *res, ACPI_RESOURCE *acpi_res);
442ACPI_STATUS	acpi_parse_resources(device_t dev, ACPI_HANDLE handle,
443		    struct acpi_parse_resource_set *set, void *arg);
444
445/* ACPI event handling */
446UINT32		acpi_event_power_button_sleep(void *context);
447UINT32		acpi_event_power_button_wake(void *context);
448UINT32		acpi_event_sleep_button_sleep(void *context);
449UINT32		acpi_event_sleep_button_wake(void *context);
450
451#define ACPI_EVENT_PRI_FIRST      0
452#define ACPI_EVENT_PRI_DEFAULT    10000
453#define ACPI_EVENT_PRI_LAST       20000
454
455typedef void (*acpi_event_handler_t)(void *, int);
456
457EVENTHANDLER_DECLARE(acpi_sleep_event, acpi_event_handler_t);
458EVENTHANDLER_DECLARE(acpi_wakeup_event, acpi_event_handler_t);
459EVENTHANDLER_DECLARE(acpi_acad_event, acpi_event_handler_t);
460EVENTHANDLER_DECLARE(acpi_video_event, acpi_event_handler_t);
461
462/* Device power control. */
463ACPI_STATUS	acpi_pwr_wake_enable(ACPI_HANDLE consumer, int enable);
464ACPI_STATUS	acpi_pwr_switch_consumer(ACPI_HANDLE consumer, int state);
465acpi_pwr_for_sleep_t	acpi_device_pwr_for_sleep;
466int		acpi_set_powerstate(device_t child, int state);
467
468/* APM emulation */
469void		acpi_apm_init(struct acpi_softc *);
470
471/* Misc. */
472static __inline struct acpi_softc *
473acpi_device_get_parent_softc(device_t child)
474{
475    device_t	parent;
476
477    parent = device_get_parent(child);
478    if (parent == NULL)
479	return (NULL);
480    return (device_get_softc(parent));
481}
482
483static __inline int
484acpi_get_verbose(struct acpi_softc *sc)
485{
486    if (sc)
487	return (sc->acpi_verbose);
488    return (0);
489}
490
491char		*acpi_name(ACPI_HANDLE handle);
492int		acpi_avoid(ACPI_HANDLE handle);
493int		acpi_disabled(char *subsys);
494int		acpi_get_acpi_device_path(device_t bus, device_t child,
495		    const char *locator, struct sbuf *sb);
496int		acpi_machdep_init(device_t dev);
497void		acpi_install_wakeup_handler(struct acpi_softc *sc);
498int		acpi_sleep_machdep(struct acpi_softc *sc, int state);
499int		acpi_wakeup_machdep(struct acpi_softc *sc, int state,
500		    int sleep_result, int intr_enabled);
501int		acpi_table_quirks(int *quirks);
502int		acpi_machdep_quirks(int *quirks);
503int		acpi_pnpinfo(ACPI_HANDLE handle, struct sbuf *sb);
504
505uint32_t	hpet_get_uid(device_t dev);
506
507/* Battery Abstraction. */
508struct acpi_battinfo;
509
510int		acpi_battery_register(device_t dev);
511int		acpi_battery_remove(device_t dev);
512int		acpi_battery_get_units(void);
513int		acpi_battery_get_info_expire(void);
514int		acpi_battery_bst_valid(struct acpi_bst *bst);
515int		acpi_battery_bix_valid(struct acpi_bix *bix);
516int		acpi_battery_get_battinfo(device_t dev,
517		    struct acpi_battinfo *info);
518
519/* Embedded controller. */
520void		acpi_ec_ecdt_probe(device_t);
521
522/* AC adapter interface. */
523int		acpi_acad_get_acline(int *);
524
525/* Package manipulation convenience functions. */
526#define ACPI_PKG_VALID(pkg, size)				\
527    ((pkg) != NULL && (pkg)->Type == ACPI_TYPE_PACKAGE &&	\
528     (pkg)->Package.Count >= (size))
529#define	ACPI_PKG_VALID_EQ(pkg, size)				\
530    ((pkg) != NULL && (pkg)->Type == ACPI_TYPE_PACKAGE &&	\
531     (pkg)->Package.Count == (size))
532int		acpi_PkgInt(ACPI_OBJECT *res, int idx, UINT64 *dst);
533int		acpi_PkgInt32(ACPI_OBJECT *res, int idx, uint32_t *dst);
534int		acpi_PkgInt16(ACPI_OBJECT *res, int idx, uint16_t *dst);
535int		acpi_PkgStr(ACPI_OBJECT *res, int idx, void *dst, size_t size);
536int		acpi_PkgGas(device_t dev, ACPI_OBJECT *res, int idx, int *type,
537		    int *rid, struct resource **dst, u_int flags);
538int		acpi_PkgFFH_IntelCpu(ACPI_OBJECT *res, int idx, int *vendor,
539		    int *class, uint64_t *address, int *accsize);
540ACPI_HANDLE	acpi_GetReference(ACPI_HANDLE scope, ACPI_OBJECT *obj);
541
542/*
543 * Base level for BUS_ADD_CHILD.  Special devices are added at orders less
544 * than this, and normal devices at or above this level.  This keeps the
545 * probe order sorted so that things like sysresource are available before
546 * their children need them.
547 */
548#define	ACPI_DEV_BASE_ORDER	100
549
550/* Default maximum number of tasks to enqueue. */
551#ifndef ACPI_MAX_TASKS
552#define	ACPI_MAX_TASKS		MAX(32, MAXCPU * 4)
553#endif
554
555/* Default number of task queue threads to start. */
556#ifndef ACPI_MAX_THREADS
557#define ACPI_MAX_THREADS	3
558#endif
559
560/* Use the device logging level for ktr(4). */
561#define	KTR_ACPI		KTR_DEV
562
563SYSCTL_DECL(_debug_acpi);
564
565/*
566 * Parse and use proximity information in SRAT and SLIT.
567 */
568int		acpi_pxm_init(int ncpus, vm_paddr_t maxphys);
569void		acpi_pxm_parse_tables(void);
570void		acpi_pxm_set_mem_locality(void);
571void		acpi_pxm_set_cpu_locality(void);
572int		acpi_pxm_get_cpu_locality(int apic_id);
573
574/*
575 * Map a PXM to a VM domain.
576 *
577 * Returns the VM domain ID if found, or -1 if not found / invalid.
578 */
579int		acpi_map_pxm_to_vm_domainid(int pxm);
580bus_get_cpus_t		acpi_get_cpus;
581bus_get_domain_t	acpi_get_domain;
582
583#ifdef __aarch64__
584/*
585 * ARM specific ACPI interfaces, relating to IORT table.
586 */
587int	acpi_iort_map_pci_msi(u_int seg, u_int rid, u_int *xref, u_int *devid);
588int	acpi_iort_map_pci_smmuv3(u_int seg, u_int rid, u_int *xref, u_int *devid);
589int	acpi_iort_its_lookup(u_int its_id, u_int *xref, int *pxm);
590int	acpi_iort_map_named_msi(const char *devname, u_int rid, u_int *xref,
591	    u_int *devid);
592int	acpi_iort_map_named_smmuv3(const char *devname, u_int rid, u_int *xref,
593	    u_int *devid);
594#endif
595#endif /* _KERNEL */
596#endif /* !_ACPIVAR_H_ */
597