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 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 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 * 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 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 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 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 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 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 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 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 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 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 * 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 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 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 308dab39c11SEmmanuel Vadot bsd_acpi_get_handle(device_t bsddev) 309dab39c11SEmmanuel Vadot { 310dab39c11SEmmanuel Vadot return (NULL); 311dab39c11SEmmanuel Vadot } 312dab39c11SEmmanuel Vadot 313dab39c11SEmmanuel Vadot bool 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 * 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 327dab39c11SEmmanuel Vadot register_acpi_notifier(struct notifier_block *nb) 328dab39c11SEmmanuel Vadot { 329dab39c11SEmmanuel Vadot return (0); 330dab39c11SEmmanuel Vadot } 331dab39c11SEmmanuel Vadot 332dab39c11SEmmanuel Vadot int 333dab39c11SEmmanuel Vadot unregister_acpi_notifier(struct notifier_block *nb) 334dab39c11SEmmanuel Vadot { 335dab39c11SEmmanuel Vadot return (0); 336dab39c11SEmmanuel Vadot } 337dab39c11SEmmanuel Vadot 338dab39c11SEmmanuel Vadot uint32_t 339dab39c11SEmmanuel Vadot acpi_target_system_state(void) 340dab39c11SEmmanuel Vadot { 341dab39c11SEmmanuel Vadot return (ACPI_STATE_S0); 342dab39c11SEmmanuel Vadot } 343dab39c11SEmmanuel Vadot 34404952a94SVladimir Kondratyev bool 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 * 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