diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2022-02-09 23:54:35 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2022-02-09 23:54:35 +0000 |
commit | dbb38f97fd82086fcd731a9c740693454021cb30 (patch) | |
tree | 8bb08ad9317c2930d71067dc44e55efc3922beb1 /sys/dev/acpi | |
parent | e4661c243eed698a67e670b093ab29308037bb03 (diff) |
Move x86-only stubs used by kern/subr_suspend.c into dev/acpi/acpi_x86.c
for sharing between i386 and amd64.
ok mlarkin kettenis
Diffstat (limited to 'sys/dev/acpi')
-rw-r--r-- | sys/dev/acpi/acpi.c | 82 | ||||
-rw-r--r-- | sys/dev/acpi/acpi_x86.c | 197 |
2 files changed, 198 insertions, 81 deletions
diff --git a/sys/dev/acpi/acpi.c b/sys/dev/acpi/acpi.c index ebcd047d397..8cd83651f1c 100644 --- a/sys/dev/acpi/acpi.c +++ b/sys/dev/acpi/acpi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpi.c,v 1.410 2022/02/08 17:25:12 deraadt Exp $ */ +/* $OpenBSD: acpi.c,v 1.411 2022/02/09 23:54:34 deraadt Exp $ */ /* * Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com> * Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org> @@ -3518,86 +3518,6 @@ acpikqfilter(dev_t dev, struct knote *kn) return (0); } -int -sleep_showstate(void *v, int sleepmode) -{ - struct acpi_softc *sc = v; - - switch (sleepmode) { - case SLEEP_SUSPEND: - sc->sc_state = ACPI_STATE_S3; - break; - case SLEEP_HIBERNATE: - sc->sc_state = ACPI_STATE_S4; - break; - default: - return (EOPNOTSUPP); - } - - if (sc->sc_sleeptype[sc->sc_state].slp_typa == -1 || - sc->sc_sleeptype[sc->sc_state].slp_typb == -1) { - printf("%s: state S%d unavailable\n", - sc->sc_dev.dv_xname, sc->sc_state); - return (EOPNOTSUPP); - } - - /* 1st suspend AML step: _TTS(tostate) */ - if (aml_node_setval(sc, sc->sc_tts, sc->sc_state) != 0) - return (EINVAL); - acpi_indicator(sc, ACPI_SST_WAKING); /* blink */ - return 0; -} - -int -sleep_setstate(void *v) -{ - struct acpi_softc *sc = v; - - /* 2nd suspend AML step: _PTS(tostate) */ - if (aml_node_setval(sc, sc->sc_pts, sc->sc_state) != 0) - return (EINVAL); - acpi_indicator(sc, ACPI_SST_WAKING); /* blink */ - return 0; -} - -void -gosleep(void *v) -{ - struct acpi_softc *sc = v; - - acpibtn_enable_psw(); /* enable _LID for wakeup */ - acpi_indicator(v, ACPI_SST_SLEEPING); - - /* 3rd suspend AML step: _GTS(tostate) */ - aml_node_setval(sc, sc->sc_gts, sc->sc_state); - - /* Clear fixed event status */ - acpi_write_pmreg(sc, ACPIREG_PM1_STS, 0, ACPI_PM1_ALL_STS); - - /* Enable wake GPEs */ - acpi_disable_allgpes(sc); - acpi_enable_wakegpes(sc, sc->sc_state); - - /* Sleep */ - acpi_sleep_cpu(sc, sc->sc_state); - sc->sc_state = ACPI_STATE_S0; - /* Resume */ - - acpi_resume_cpu(sc, sc->sc_state); -} - -int -sleep_resume(void *v) -{ - struct acpi_softc *sc = v; - - /* 3rd resume AML step: _TTS(runstate) */ - if (aml_node_setval(sc, sc->sc_tts, sc->sc_state) != 0) - return (EINVAL); - acpi_indicator(sc, ACPI_SST_WAKING); /* blink */ - return 0; -} - #else /* SMALL_KERNEL */ int diff --git a/sys/dev/acpi/acpi_x86.c b/sys/dev/acpi/acpi_x86.c new file mode 100644 index 00000000000..c7040d822bb --- /dev/null +++ b/sys/dev/acpi/acpi_x86.c @@ -0,0 +1,197 @@ +/* $OpenBSD: acpi_x86.c,v 1.1 2022/02/09 23:54:34 deraadt Exp $ */ +/* + * Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com> + * Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/buf.h> +#include <sys/device.h> +#include <sys/malloc.h> +#include <sys/pool.h> +#include <sys/fcntl.h> +#include <sys/ioccom.h> +#include <sys/event.h> +#include <sys/signalvar.h> +#include <sys/proc.h> +#include <sys/kthread.h> +#include <sys/sched.h> +#include <sys/reboot.h> +#include <sys/sysctl.h> +#include <sys/mount.h> +#include <sys/syscallargs.h> +#include <sys/sensors.h> +#include <sys/timetc.h> + +#ifdef HIBERNATE +#include <sys/hibernate.h> +#endif + +#include <machine/conf.h> +#include <machine/cpufunc.h> +#include <machine/bus.h> + +#include <dev/pci/pcivar.h> +#include <dev/acpi/acpireg.h> +#include <dev/acpi/acpivar.h> +#include <dev/acpi/amltypes.h> +#include <dev/acpi/acpidev.h> +#include <dev/acpi/dsdt.h> +#include <dev/wscons/wsdisplayvar.h> + +#include <dev/pci/pcidevs.h> +#include <dev/pci/ppbreg.h> + +#include <dev/pci/pciidevar.h> + +#include <machine/apmvar.h> +#define APMUNIT(dev) (minor(dev)&0xf0) +#define APMDEV(dev) (minor(dev)&0x0f) +#define APMDEV_NORMAL 0 +#define APMDEV_CTL 8 + +#include "wd.h" +#include "wsdisplay.h" +#include "softraid.h" + +int +sleep_showstate(void *v, int sleepmode) +{ + struct acpi_softc *sc = v; + + switch (sleepmode) { + case SLEEP_SUSPEND: + sc->sc_state = ACPI_STATE_S3; + break; + case SLEEP_HIBERNATE: + sc->sc_state = ACPI_STATE_S4; + break; + default: + return (EOPNOTSUPP); + } + + if (sc->sc_sleeptype[sc->sc_state].slp_typa == -1 || + sc->sc_sleeptype[sc->sc_state].slp_typb == -1) { + printf("%s: state S%d unavailable\n", + sc->sc_dev.dv_xname, sc->sc_state); + return (EOPNOTSUPP); + } + + /* 1st suspend AML step: _TTS(tostate) */ + if (aml_node_setval(sc, sc->sc_tts, sc->sc_state) != 0) + return (EINVAL); + acpi_indicator(sc, ACPI_SST_WAKING); /* blink */ + return 0; +} + +int +sleep_setstate(void *v) +{ + struct acpi_softc *sc = v; + + /* 2nd suspend AML step: _PTS(tostate) */ + if (aml_node_setval(sc, sc->sc_pts, sc->sc_state) != 0) + return (EINVAL); + acpi_indicator(sc, ACPI_SST_WAKING); /* blink */ + return 0; +} + +void +gosleep(void *v) +{ + struct acpi_softc *sc = v; + + acpibtn_enable_psw(); /* enable _LID for wakeup */ + acpi_indicator(v, ACPI_SST_SLEEPING); + + /* 3rd suspend AML step: _GTS(tostate) */ + aml_node_setval(sc, sc->sc_gts, sc->sc_state); + + /* Clear fixed event status */ + acpi_write_pmreg(sc, ACPIREG_PM1_STS, 0, ACPI_PM1_ALL_STS); + + /* Enable wake GPEs */ + acpi_disable_allgpes(sc); + acpi_enable_wakegpes(sc, sc->sc_state); + + /* Sleep */ + acpi_sleep_cpu(sc, sc->sc_state); + sc->sc_state = ACPI_STATE_S0; + /* Resume */ + + acpi_resume_cpu(sc, sc->sc_state); +} + +int +sleep_resume(void *v) +{ + struct acpi_softc *sc = v; + + /* 3rd resume AML step: _TTS(runstate) */ + if (aml_node_setval(sc, sc->sc_tts, sc->sc_state) != 0) + return (EINVAL); + acpi_indicator(sc, ACPI_SST_WAKING); /* blink */ + return 0; +} + +void +suspend_finish(void *v) +{ + struct acpi_softc *sc = v; + extern int lid_action; + + acpi_record_event(sc, APM_NORMAL_RESUME); + acpi_indicator(sc, ACPI_SST_WORKING); + + /* If we woke up but all the lids are closed, go back to sleep */ + if (acpibtn_numopenlids() == 0 && lid_action != 0) + acpi_addtask(sc, acpi_sleep_task, sc, sc->sc_state); +} + +void +disable_lid_wakeups(void *v) +{ + acpibtn_disable_psw(); /* disable _LID for wakeup */ + +} + +void +display_suspend(void *v) +{ +#if NWSDISPLAY > 0 + struct acpi_softc *sc = v; + + /* + * Temporarily release the lock to prevent the X server from + * blocking on setting the display brightness. + */ + rw_exit_write(&sc->sc_lck); + wsdisplay_suspend(); + rw_enter_write(&sc->sc_lck); +#endif /* NWSDISPLAY > 0 */ +} + +void +display_resume(void *v) +{ +#if NWSDISPLAY > 0 + struct acpi_softc *sc = v; + + rw_exit_write(&sc->sc_lck); + wsdisplay_resume(); + rw_enter_write(&sc->sc_lck); +#endif /* NWSDISPLAY > 0 */ +} |