xref: /freebsd/sys/compat/linuxkpi/common/src/linux_acpi.c (revision 3e90716331cdbdee7465213d389a33f90dad11cf)
1dab39c11SEmmanuel Vadot /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3dab39c11SEmmanuel Vadot  *
4dab39c11SEmmanuel Vadot  * Copyright (c) 2018 Johannes Lundberg <johalun@FreeBSD.org>
5dab39c11SEmmanuel Vadot  * Copyright (c) 2020 Vladimir Kondratyev <wulf@FreeBSD.org>
6dab39c11SEmmanuel Vadot  *
7dab39c11SEmmanuel Vadot  * Redistribution and use in source and binary forms, with or without
8dab39c11SEmmanuel Vadot  * modification, are permitted provided that the following conditions are
9dab39c11SEmmanuel Vadot  * met:
10dab39c11SEmmanuel Vadot  * 1. Redistributions of source code must retain the above copyright
11dab39c11SEmmanuel Vadot  *    notice, this list of conditions and the following disclaimer.
12dab39c11SEmmanuel Vadot  * 2. Redistributions in binary form must reproduce the above copyright
13dab39c11SEmmanuel Vadot  *    notice, this list of conditions and the following disclaimer in
14dab39c11SEmmanuel Vadot  *    the documentation and/or other materials provided with the
15dab39c11SEmmanuel Vadot  *    distribution.
16dab39c11SEmmanuel Vadot  *
17dab39c11SEmmanuel Vadot  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18dab39c11SEmmanuel Vadot  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19dab39c11SEmmanuel Vadot  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20dab39c11SEmmanuel Vadot  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21dab39c11SEmmanuel Vadot  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22dab39c11SEmmanuel Vadot  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23dab39c11SEmmanuel Vadot  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24dab39c11SEmmanuel Vadot  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25dab39c11SEmmanuel Vadot  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26dab39c11SEmmanuel Vadot  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27dab39c11SEmmanuel Vadot  * SUCH DAMAGE.
28dab39c11SEmmanuel Vadot  */
29dab39c11SEmmanuel Vadot 
30dab39c11SEmmanuel Vadot #include "opt_acpi.h"
31dab39c11SEmmanuel Vadot 
32dab39c11SEmmanuel Vadot #include <sys/types.h>
33dab39c11SEmmanuel Vadot #include <sys/bus.h>
34dab39c11SEmmanuel Vadot #include <sys/eventhandler.h>
35dab39c11SEmmanuel Vadot #include <sys/kernel.h>
36dab39c11SEmmanuel Vadot 
37dab39c11SEmmanuel Vadot #include <contrib/dev/acpica/include/acpi.h>
38dab39c11SEmmanuel Vadot #include <dev/acpica/acpivar.h>
39dab39c11SEmmanuel Vadot 
40dab39c11SEmmanuel Vadot #include <linux/notifier.h>
41ccd31b46SJean-Sébastien Pédron #include <linux/suspend.h>
42dab39c11SEmmanuel Vadot 
43dab39c11SEmmanuel Vadot #include <acpi/acpi_bus.h>
44dab39c11SEmmanuel Vadot #include <acpi/video.h>
45dab39c11SEmmanuel Vadot 
46dab39c11SEmmanuel Vadot #define	ACPI_AC_CLASS	"ac_adapter"
47dab39c11SEmmanuel Vadot 
48dab39c11SEmmanuel Vadot ACPI_MODULE_NAME("linux_acpi")
49dab39c11SEmmanuel Vadot 
50dab39c11SEmmanuel Vadot enum {
51dab39c11SEmmanuel Vadot 	LINUX_ACPI_ACAD,
52dab39c11SEmmanuel Vadot 	LINUX_ACPI_VIDEO,
53dab39c11SEmmanuel Vadot 	LINUX_ACPI_TAGS			/* must be last */
54dab39c11SEmmanuel Vadot };
55dab39c11SEmmanuel Vadot _Static_assert(LINUX_ACPI_TAGS <= LINUX_NOTIFY_TAGS,
56dab39c11SEmmanuel Vadot     "Not enough space for tags in notifier_block structure");
57dab39c11SEmmanuel Vadot 
58dab39c11SEmmanuel Vadot #ifdef DEV_ACPI
59dab39c11SEmmanuel Vadot 
60ccd31b46SJean-Sébastien Pédron suspend_state_t pm_suspend_target_state = PM_SUSPEND_ON;
61ccd31b46SJean-Sébastien Pédron 
62dab39c11SEmmanuel Vadot static uint32_t linux_acpi_target_sleep_state = ACPI_STATE_S0;
63dab39c11SEmmanuel Vadot 
64dab39c11SEmmanuel Vadot static eventhandler_tag resume_tag;
65dab39c11SEmmanuel Vadot static eventhandler_tag suspend_tag;
66dab39c11SEmmanuel Vadot 
67dab39c11SEmmanuel Vadot ACPI_HANDLE
bsd_acpi_get_handle(device_t bsddev)68dab39c11SEmmanuel Vadot bsd_acpi_get_handle(device_t bsddev)
69dab39c11SEmmanuel Vadot {
70dab39c11SEmmanuel Vadot 	return (acpi_get_handle(bsddev));
71dab39c11SEmmanuel Vadot }
72dab39c11SEmmanuel Vadot 
73dab39c11SEmmanuel Vadot bool
acpi_check_dsm(ACPI_HANDLE handle,const char * uuid,int rev,uint64_t funcs)74dab39c11SEmmanuel Vadot acpi_check_dsm(ACPI_HANDLE handle, const char *uuid, int rev, uint64_t funcs)
75dab39c11SEmmanuel Vadot {
76dab39c11SEmmanuel Vadot 
77dab39c11SEmmanuel Vadot 	if (funcs == 0)
78dab39c11SEmmanuel Vadot 		return (false);
79dab39c11SEmmanuel Vadot 
80dab39c11SEmmanuel Vadot 	/*
81dab39c11SEmmanuel Vadot 	 * From ACPI 6.3 spec 9.1.1:
82dab39c11SEmmanuel Vadot 	 * Bit 0 indicates whether there is support for any functions other
83dab39c11SEmmanuel Vadot 	 * than function 0 for the specified UUID and Revision ID. If set to
84dab39c11SEmmanuel Vadot 	 * zero, no functions are supported (other than function zero) for the
85dab39c11SEmmanuel Vadot 	 * specified UUID and Revision ID.
86dab39c11SEmmanuel Vadot 	 */
87dab39c11SEmmanuel Vadot 	funcs |= 1 << 0;
88dab39c11SEmmanuel Vadot 
89dab39c11SEmmanuel Vadot 	return ((acpi_DSMQuery(handle, uuid, rev) & funcs) == funcs);
90dab39c11SEmmanuel Vadot }
91dab39c11SEmmanuel Vadot 
92dab39c11SEmmanuel Vadot ACPI_OBJECT *
acpi_evaluate_dsm_typed(ACPI_HANDLE handle,const char * uuid,int rev,int func,ACPI_OBJECT * argv4,ACPI_OBJECT_TYPE type)93dab39c11SEmmanuel Vadot acpi_evaluate_dsm_typed(ACPI_HANDLE handle, const char *uuid, int rev,
94dab39c11SEmmanuel Vadot     int func, ACPI_OBJECT *argv4, ACPI_OBJECT_TYPE type)
95dab39c11SEmmanuel Vadot {
96dab39c11SEmmanuel Vadot 	ACPI_BUFFER buf;
97dab39c11SEmmanuel Vadot 
98dab39c11SEmmanuel Vadot 	return (ACPI_SUCCESS(acpi_EvaluateDSMTyped(handle, uuid, rev, func,
99dab39c11SEmmanuel Vadot 	    argv4, &buf, type)) ? (ACPI_OBJECT *)buf.Pointer : NULL);
100dab39c11SEmmanuel Vadot }
101dab39c11SEmmanuel Vadot 
102dab39c11SEmmanuel Vadot static void
linux_handle_power_suspend_event(void * arg __unused)103dab39c11SEmmanuel Vadot linux_handle_power_suspend_event(void *arg __unused)
104dab39c11SEmmanuel Vadot {
105dab39c11SEmmanuel Vadot 	/*
106dab39c11SEmmanuel Vadot 	 * Only support S3 for now.
107dab39c11SEmmanuel Vadot 	 * acpi_sleep_event isn't always called so we use power_suspend_early
108dab39c11SEmmanuel Vadot 	 * instead which means we don't know what state we're switching to.
109dab39c11SEmmanuel Vadot 	 * TODO: Make acpi_sleep_event consistent
110dab39c11SEmmanuel Vadot 	 */
111dab39c11SEmmanuel Vadot 	linux_acpi_target_sleep_state = ACPI_STATE_S3;
1128ace984eSVladimir Kondratyev 	pm_suspend_target_state = PM_SUSPEND_MEM;
113dab39c11SEmmanuel Vadot }
114dab39c11SEmmanuel Vadot 
115dab39c11SEmmanuel Vadot static void
linux_handle_power_resume_event(void * arg __unused)116dab39c11SEmmanuel Vadot linux_handle_power_resume_event(void *arg __unused)
117dab39c11SEmmanuel Vadot {
118dab39c11SEmmanuel Vadot 	linux_acpi_target_sleep_state = ACPI_STATE_S0;
1198ace984eSVladimir Kondratyev 	pm_suspend_target_state = PM_SUSPEND_ON;
120dab39c11SEmmanuel Vadot }
121dab39c11SEmmanuel Vadot 
122dab39c11SEmmanuel Vadot static void
linux_handle_acpi_acad_event(void * arg,int data)123dab39c11SEmmanuel Vadot linux_handle_acpi_acad_event(void *arg, int data)
124dab39c11SEmmanuel Vadot {
125dab39c11SEmmanuel Vadot 	struct notifier_block *nb = arg;
126dab39c11SEmmanuel Vadot 	/*
127dab39c11SEmmanuel Vadot 	 * Event type information is lost ATM in FreeBSD ACPI event handler.
128dab39c11SEmmanuel Vadot 	 * Fortunately, drm-kmod do not distinct AC event types too, so we can
129dab39c11SEmmanuel Vadot 	 * use any type e.g. ACPI_NOTIFY_BUS_CHECK that suits notifier handler.
130dab39c11SEmmanuel Vadot 	 */
131dab39c11SEmmanuel Vadot 	struct acpi_bus_event abe = {
132dab39c11SEmmanuel Vadot 	    .device_class = ACPI_AC_CLASS,
133dab39c11SEmmanuel Vadot 	    .type = ACPI_NOTIFY_BUS_CHECK,
134dab39c11SEmmanuel Vadot 	    .data = data,
135dab39c11SEmmanuel Vadot 	};
136dab39c11SEmmanuel Vadot 
137dab39c11SEmmanuel Vadot 	nb->notifier_call(nb, 0, &abe);
138dab39c11SEmmanuel Vadot }
139dab39c11SEmmanuel Vadot 
140dab39c11SEmmanuel Vadot static void
linux_handle_acpi_video_event(void * arg,int type)141dab39c11SEmmanuel Vadot linux_handle_acpi_video_event(void *arg, int type)
142dab39c11SEmmanuel Vadot {
143dab39c11SEmmanuel Vadot 	struct notifier_block *nb = arg;
144dab39c11SEmmanuel Vadot 	struct acpi_bus_event abe = {
145dab39c11SEmmanuel Vadot 	    .device_class = ACPI_VIDEO_CLASS,
146dab39c11SEmmanuel Vadot 	    .type = type,
147dab39c11SEmmanuel Vadot 	    .data = 0,
148dab39c11SEmmanuel Vadot 	};
149dab39c11SEmmanuel Vadot 
150dab39c11SEmmanuel Vadot 	nb->notifier_call(nb, 0, &abe);
151dab39c11SEmmanuel Vadot }
152dab39c11SEmmanuel Vadot 
153dab39c11SEmmanuel Vadot int
register_acpi_notifier(struct notifier_block * nb)154dab39c11SEmmanuel Vadot register_acpi_notifier(struct notifier_block *nb)
155dab39c11SEmmanuel Vadot {
156dab39c11SEmmanuel Vadot 	nb->tags[LINUX_ACPI_ACAD] = EVENTHANDLER_REGISTER(acpi_acad_event,
157dab39c11SEmmanuel Vadot 	    linux_handle_acpi_acad_event, nb, EVENTHANDLER_PRI_FIRST);
158dab39c11SEmmanuel Vadot 	nb->tags[LINUX_ACPI_VIDEO] = EVENTHANDLER_REGISTER(acpi_video_event,
159dab39c11SEmmanuel Vadot 	    linux_handle_acpi_video_event, nb, EVENTHANDLER_PRI_FIRST);
160dab39c11SEmmanuel Vadot 
161dab39c11SEmmanuel Vadot 	return (0);
162dab39c11SEmmanuel Vadot }
163dab39c11SEmmanuel Vadot 
164dab39c11SEmmanuel Vadot int
unregister_acpi_notifier(struct notifier_block * nb)165dab39c11SEmmanuel Vadot unregister_acpi_notifier(struct notifier_block *nb)
166dab39c11SEmmanuel Vadot {
167dab39c11SEmmanuel Vadot 	EVENTHANDLER_DEREGISTER(acpi_acad_event, nb->tags[LINUX_ACPI_ACAD]);
168dab39c11SEmmanuel Vadot 	EVENTHANDLER_DEREGISTER(acpi_video_event, nb->tags[LINUX_ACPI_VIDEO]);
169dab39c11SEmmanuel Vadot 
170dab39c11SEmmanuel Vadot 	return (0);
171dab39c11SEmmanuel Vadot }
172dab39c11SEmmanuel Vadot 
173dab39c11SEmmanuel Vadot uint32_t
acpi_target_system_state(void)174dab39c11SEmmanuel Vadot acpi_target_system_state(void)
175dab39c11SEmmanuel Vadot {
176dab39c11SEmmanuel Vadot 	return (linux_acpi_target_sleep_state);
177dab39c11SEmmanuel Vadot }
178dab39c11SEmmanuel Vadot 
17904952a94SVladimir Kondratyev struct acpi_dev_present_ctx {
18004952a94SVladimir Kondratyev 	const char *hid;
18104952a94SVladimir Kondratyev 	const char *uid;
18204952a94SVladimir Kondratyev 	int64_t hrv;
183*3e907163SVladimir Kondratyev 	struct acpi_device *dev;
18404952a94SVladimir Kondratyev };
18504952a94SVladimir Kondratyev 
18604952a94SVladimir Kondratyev static ACPI_STATUS
acpi_dev_present_cb(ACPI_HANDLE handle,UINT32 level,void * context,void ** result)18704952a94SVladimir Kondratyev acpi_dev_present_cb(ACPI_HANDLE handle, UINT32 level, void *context,
18804952a94SVladimir Kondratyev     void **result)
18904952a94SVladimir Kondratyev {
19004952a94SVladimir Kondratyev 	ACPI_DEVICE_INFO *devinfo;
191*3e907163SVladimir Kondratyev 	struct acpi_device *dev;
19204952a94SVladimir Kondratyev 	struct acpi_dev_present_ctx *match = context;
19304952a94SVladimir Kondratyev 	bool present = false;
19404952a94SVladimir Kondratyev 	UINT32 sta, hrv;
19504952a94SVladimir Kondratyev 	int i;
19604952a94SVladimir Kondratyev 
19704952a94SVladimir Kondratyev 	if (handle == NULL)
19804952a94SVladimir Kondratyev 		return (AE_OK);
19904952a94SVladimir Kondratyev 
20004952a94SVladimir Kondratyev 	if (!ACPI_FAILURE(acpi_GetInteger(handle, "_STA", &sta)) &&
20104952a94SVladimir Kondratyev 	    !ACPI_DEVICE_PRESENT(sta))
20204952a94SVladimir Kondratyev 		return (AE_OK);
20304952a94SVladimir Kondratyev 
20404952a94SVladimir Kondratyev 	if (ACPI_FAILURE(AcpiGetObjectInfo(handle, &devinfo)))
20504952a94SVladimir Kondratyev 		return (AE_OK);
20604952a94SVladimir Kondratyev 
20704952a94SVladimir Kondratyev 	if ((devinfo->Valid & ACPI_VALID_HID) != 0 &&
20804952a94SVladimir Kondratyev 	    strcmp(match->hid, devinfo->HardwareId.String) == 0) {
20904952a94SVladimir Kondratyev 		present = true;
21004952a94SVladimir Kondratyev 	} else if ((devinfo->Valid & ACPI_VALID_CID) != 0) {
21104952a94SVladimir Kondratyev 		for (i = 0; i < devinfo->CompatibleIdList.Count; i++) {
21204952a94SVladimir Kondratyev 			if (strcmp(match->hid,
21304952a94SVladimir Kondratyev 			    devinfo->CompatibleIdList.Ids[i].String) == 0) {
21404952a94SVladimir Kondratyev 				present = true;
21504952a94SVladimir Kondratyev 				break;
21604952a94SVladimir Kondratyev 			}
21704952a94SVladimir Kondratyev 		}
21804952a94SVladimir Kondratyev 	}
21904952a94SVladimir Kondratyev 	if (present && match->uid != NULL &&
22004952a94SVladimir Kondratyev 	    ((devinfo->Valid & ACPI_VALID_UID) == 0 ||
22104952a94SVladimir Kondratyev 	      strcmp(match->uid, devinfo->UniqueId.String) != 0))
22204952a94SVladimir Kondratyev 		present = false;
22304952a94SVladimir Kondratyev 
22404952a94SVladimir Kondratyev 	AcpiOsFree(devinfo);
22504952a94SVladimir Kondratyev 	if (!present)
22604952a94SVladimir Kondratyev 		return (AE_OK);
22704952a94SVladimir Kondratyev 
22804952a94SVladimir Kondratyev 	if (match->hrv != -1) {
22904952a94SVladimir Kondratyev 		if (ACPI_FAILURE(acpi_GetInteger(handle, "_HRV", &hrv)))
23004952a94SVladimir Kondratyev 			return (AE_OK);
23104952a94SVladimir Kondratyev 		if (hrv != match->hrv)
23204952a94SVladimir Kondratyev 			return (AE_OK);
23304952a94SVladimir Kondratyev 	}
23404952a94SVladimir Kondratyev 
235*3e907163SVladimir Kondratyev 	dev = acpi_get_device(handle);
236*3e907163SVladimir Kondratyev 	if (dev == NULL)
237*3e907163SVladimir Kondratyev 		return (AE_OK);
238*3e907163SVladimir Kondratyev 	match->dev = dev;
239*3e907163SVladimir Kondratyev 
24004952a94SVladimir Kondratyev 	return (AE_ERROR);
24104952a94SVladimir Kondratyev }
24204952a94SVladimir Kondratyev 
24304952a94SVladimir Kondratyev bool
lkpi_acpi_dev_present(const char * hid,const char * uid,int64_t hrv)24404952a94SVladimir Kondratyev lkpi_acpi_dev_present(const char *hid, const char *uid, int64_t hrv)
24504952a94SVladimir Kondratyev {
24604952a94SVladimir Kondratyev 	struct acpi_dev_present_ctx match;
24704952a94SVladimir Kondratyev 	int rv;
24804952a94SVladimir Kondratyev 
24904952a94SVladimir Kondratyev 	match.hid = hid;
25004952a94SVladimir Kondratyev 	match.uid = uid;
25104952a94SVladimir Kondratyev 	match.hrv = hrv;
25204952a94SVladimir Kondratyev 
25304952a94SVladimir Kondratyev 	rv = AcpiWalkNamespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
25404952a94SVladimir Kondratyev 	    ACPI_UINT32_MAX, acpi_dev_present_cb, NULL, &match, NULL);
25504952a94SVladimir Kondratyev 
25604952a94SVladimir Kondratyev 	return (rv == AE_ERROR);
25704952a94SVladimir Kondratyev }
25804952a94SVladimir Kondratyev 
259*3e907163SVladimir Kondratyev struct acpi_device *
lkpi_acpi_dev_get_first_match_dev(const char * hid,const char * uid,int64_t hrv)260*3e907163SVladimir Kondratyev lkpi_acpi_dev_get_first_match_dev(const char *hid, const char *uid,
261*3e907163SVladimir Kondratyev     int64_t hrv)
262*3e907163SVladimir Kondratyev {
263*3e907163SVladimir Kondratyev 	struct acpi_dev_present_ctx match;
264*3e907163SVladimir Kondratyev 	int rv;
265*3e907163SVladimir Kondratyev 
266*3e907163SVladimir Kondratyev 	match.hid = hid;
267*3e907163SVladimir Kondratyev 	match.uid = uid;
268*3e907163SVladimir Kondratyev 	match.hrv = hrv;
269*3e907163SVladimir Kondratyev 	match.dev = NULL;
270*3e907163SVladimir Kondratyev 
271*3e907163SVladimir Kondratyev 	rv = AcpiWalkNamespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
272*3e907163SVladimir Kondratyev 	    ACPI_UINT32_MAX, acpi_dev_present_cb, NULL, &match, NULL);
273*3e907163SVladimir Kondratyev 
274*3e907163SVladimir Kondratyev 	return (rv == AE_ERROR ? match.dev : NULL);
275*3e907163SVladimir Kondratyev }
276*3e907163SVladimir Kondratyev 
277dab39c11SEmmanuel Vadot static void
linux_register_acpi_event_handlers(void * arg __unused)278dab39c11SEmmanuel Vadot linux_register_acpi_event_handlers(void *arg __unused)
279dab39c11SEmmanuel Vadot {
280dab39c11SEmmanuel Vadot 	/*
281dab39c11SEmmanuel Vadot 	 * XXX johalun: acpi_{sleep,wakeup}_event can't be trusted, use
282dab39c11SEmmanuel Vadot 	 * power_{suspend_early,resume} 'acpiconf -s 3' or 'zzz' will not
283dab39c11SEmmanuel Vadot 	 * generate acpi_sleep_event... Lid open or wake on button generates
284dab39c11SEmmanuel Vadot 	 * acpi_wakeup_event on one of my Dell laptops but not the other
285dab39c11SEmmanuel Vadot 	 * (but it does power on)... is this a general thing?
286dab39c11SEmmanuel Vadot 	 */
287dab39c11SEmmanuel Vadot 	resume_tag = EVENTHANDLER_REGISTER(power_resume,
288dab39c11SEmmanuel Vadot 	    linux_handle_power_resume_event, NULL, EVENTHANDLER_PRI_FIRST);
289dab39c11SEmmanuel Vadot 	suspend_tag = EVENTHANDLER_REGISTER(power_suspend_early,
290dab39c11SEmmanuel Vadot 	    linux_handle_power_suspend_event, NULL, EVENTHANDLER_PRI_FIRST);
291dab39c11SEmmanuel Vadot }
292dab39c11SEmmanuel Vadot 
293dab39c11SEmmanuel Vadot static void
linux_deregister_acpi_event_handlers(void * arg __unused)294dab39c11SEmmanuel Vadot linux_deregister_acpi_event_handlers(void *arg __unused)
295dab39c11SEmmanuel Vadot {
296dab39c11SEmmanuel Vadot 	EVENTHANDLER_DEREGISTER(power_resume, resume_tag);
297dab39c11SEmmanuel Vadot 	EVENTHANDLER_DEREGISTER(power_suspend_early, suspend_tag);
298dab39c11SEmmanuel Vadot }
299dab39c11SEmmanuel Vadot 
300dab39c11SEmmanuel Vadot SYSINIT(linux_acpi_events, SI_SUB_DRIVERS, SI_ORDER_ANY,
301dab39c11SEmmanuel Vadot     linux_register_acpi_event_handlers, NULL);
302dab39c11SEmmanuel Vadot SYSUNINIT(linux_acpi_events, SI_SUB_DRIVERS, SI_ORDER_ANY,
303dab39c11SEmmanuel Vadot     linux_deregister_acpi_event_handlers, NULL);
304dab39c11SEmmanuel Vadot 
305dab39c11SEmmanuel Vadot #else	/* !DEV_ACPI */
306dab39c11SEmmanuel Vadot 
307dab39c11SEmmanuel Vadot ACPI_HANDLE
bsd_acpi_get_handle(device_t bsddev)308dab39c11SEmmanuel Vadot bsd_acpi_get_handle(device_t bsddev)
309dab39c11SEmmanuel Vadot {
310dab39c11SEmmanuel Vadot 	return (NULL);
311dab39c11SEmmanuel Vadot }
312dab39c11SEmmanuel Vadot 
313dab39c11SEmmanuel Vadot bool
acpi_check_dsm(ACPI_HANDLE handle,const char * uuid,int rev,uint64_t funcs)314dab39c11SEmmanuel Vadot acpi_check_dsm(ACPI_HANDLE handle, const char *uuid, int rev, uint64_t funcs)
315dab39c11SEmmanuel Vadot {
316dab39c11SEmmanuel Vadot 	return (false);
317dab39c11SEmmanuel Vadot }
318dab39c11SEmmanuel Vadot 
319dab39c11SEmmanuel Vadot ACPI_OBJECT *
acpi_evaluate_dsm_typed(ACPI_HANDLE handle,const char * uuid,int rev,int func,ACPI_OBJECT * argv4,ACPI_OBJECT_TYPE type)320dab39c11SEmmanuel Vadot acpi_evaluate_dsm_typed(ACPI_HANDLE handle, const char *uuid, int rev,
321dab39c11SEmmanuel Vadot      int func, ACPI_OBJECT *argv4, ACPI_OBJECT_TYPE type)
322dab39c11SEmmanuel Vadot {
323dab39c11SEmmanuel Vadot 	return (NULL);
324dab39c11SEmmanuel Vadot }
325dab39c11SEmmanuel Vadot 
326dab39c11SEmmanuel Vadot int
register_acpi_notifier(struct notifier_block * nb)327dab39c11SEmmanuel Vadot register_acpi_notifier(struct notifier_block *nb)
328dab39c11SEmmanuel Vadot {
329dab39c11SEmmanuel Vadot 	return (0);
330dab39c11SEmmanuel Vadot }
331dab39c11SEmmanuel Vadot 
332dab39c11SEmmanuel Vadot int
unregister_acpi_notifier(struct notifier_block * nb)333dab39c11SEmmanuel Vadot unregister_acpi_notifier(struct notifier_block *nb)
334dab39c11SEmmanuel Vadot {
335dab39c11SEmmanuel Vadot 	return (0);
336dab39c11SEmmanuel Vadot }
337dab39c11SEmmanuel Vadot 
338dab39c11SEmmanuel Vadot uint32_t
acpi_target_system_state(void)339dab39c11SEmmanuel Vadot acpi_target_system_state(void)
340dab39c11SEmmanuel Vadot {
341dab39c11SEmmanuel Vadot 	return (ACPI_STATE_S0);
342dab39c11SEmmanuel Vadot }
343dab39c11SEmmanuel Vadot 
34404952a94SVladimir Kondratyev bool
lkpi_acpi_dev_present(const char * hid,const char * uid,int64_t hrv)34504952a94SVladimir Kondratyev lkpi_acpi_dev_present(const char *hid, const char *uid, int64_t hrv)
34604952a94SVladimir Kondratyev {
34704952a94SVladimir Kondratyev 	return (false);
34804952a94SVladimir Kondratyev }
34904952a94SVladimir Kondratyev 
350*3e907163SVladimir Kondratyev struct acpi_device *
lkpi_acpi_dev_get_first_match_dev(const char * hid,const char * uid,int64_t hrv)351*3e907163SVladimir Kondratyev lkpi_acpi_dev_get_first_match_dev(const char *hid, const char *uid,
352*3e907163SVladimir Kondratyev     int64_t hrv)
353*3e907163SVladimir Kondratyev {
354*3e907163SVladimir Kondratyev 	return (NULL);
355*3e907163SVladimir Kondratyev }
356*3e907163SVladimir Kondratyev 
357dab39c11SEmmanuel Vadot #endif	/* !DEV_ACPI */
358