Move /dev/apm related acpi code to acpi_apm.c which is only built on
authortobhe <tobhe@openbsd.org>
Sat, 8 Jul 2023 08:01:10 +0000 (08:01 +0000)
committertobhe <tobhe@openbsd.org>
Sat, 8 Jul 2023 08:01:10 +0000 (08:01 +0000)
amd64 and i386. This is the first step towards a machine independent
safe sleep API.

tested by yasuoka@ bluhm@
ok deraadt@ kettenis@

sys/arch/amd64/conf/files.amd64
sys/arch/i386/conf/files.i386
sys/dev/acpi/acpi.c
sys/dev/acpi/acpi_apm.c [new file with mode: 0644]

index b565f2e..a3452d9 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: files.amd64,v 1.108 2023/04/26 15:11:21 mlarkin Exp $
+#      $OpenBSD: files.amd64,v 1.109 2023/07/08 08:01:10 tobhe Exp $
 
 maxpartitions 16
 maxusers 2 16 128
@@ -237,6 +237,7 @@ attach      acpi at bios
 file   arch/amd64/amd64/acpi_machdep.c         acpi
 file   arch/amd64/amd64/acpi_wakecode.S        acpi & !small_kernel
 file   dev/acpi/acpi_x86.c                     acpi & suspend & !small_kernel
+file   dev/acpi/acpi_apm.c                     acpi
 
 device acpipci
 attach acpipci at acpi
index a4ae582..f94cb64 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: files.i386,v 1.249 2023/01/17 10:10:11 jsg Exp $
+#      $OpenBSD: files.i386,v 1.250 2023/07/08 08:01:10 tobhe Exp $
 #
 # new style config file for i386 architecture
 #
@@ -377,6 +377,7 @@ attach      acpi at bios
 file   arch/i386/i386/acpi_machdep.c           acpi
 file   arch/i386/i386/acpi_wakecode.S          acpi & !small_kernel
 file   dev/acpi/acpi_x86.c                     acpi & suspend & !small_kernel
+file   dev/acpi/acpi_apm.c                     acpi
 
 #
 # IPMI
index 11bdd85..ba6a3c4 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpi.c,v 1.424 2023/07/07 07:37:59 claudio Exp $ */
+/* $OpenBSD: acpi.c,v 1.425 2023/07/08 08:01:10 tobhe Exp $ */
 /*
  * Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com>
  * Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org>
 #include <sys/kthread.h>
 #include <sys/sched.h>
 
-#ifdef HIBERNATE
-#include <sys/hibernate.h>
-#endif
-
 #include <machine/conf.h>
 #include <machine/cpufunc.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"
 
@@ -3384,134 +3376,6 @@ acpi_apminfo(struct apm_power_info *pi)
        return 0;
 }
 
-int
-acpiopen(dev_t dev, int flag, int mode, struct proc *p)
-{
-       int error = 0;
-       struct acpi_softc *sc;
-       int s;
-
-       if (!acpi_cd.cd_ndevs || APMUNIT(dev) != 0 ||
-           !(sc = acpi_cd.cd_devs[APMUNIT(dev)]))
-               return (ENXIO);
-
-       s = splbio();
-       switch (APMDEV(dev)) {
-       case APMDEV_CTL:
-               if (!(flag & FWRITE)) {
-                       error = EINVAL;
-                       break;
-               }
-               if (sc->sc_flags & SCFLAG_OWRITE) {
-                       error = EBUSY;
-                       break;
-               }
-               sc->sc_flags |= SCFLAG_OWRITE;
-               break;
-       case APMDEV_NORMAL:
-               if (!(flag & FREAD) || (flag & FWRITE)) {
-                       error = EINVAL;
-                       break;
-               }
-               sc->sc_flags |= SCFLAG_OREAD;
-               break;
-       default:
-               error = ENXIO;
-               break;
-       }
-       splx(s);
-       return (error);
-}
-
-int
-acpiclose(dev_t dev, int flag, int mode, struct proc *p)
-{
-       int error = 0;
-       struct acpi_softc *sc;
-       int s;
-
-       if (!acpi_cd.cd_ndevs || APMUNIT(dev) != 0 ||
-           !(sc = acpi_cd.cd_devs[APMUNIT(dev)]))
-               return (ENXIO);
-
-       s = splbio();
-       switch (APMDEV(dev)) {
-       case APMDEV_CTL:
-               sc->sc_flags &= ~SCFLAG_OWRITE;
-               break;
-       case APMDEV_NORMAL:
-               sc->sc_flags &= ~SCFLAG_OREAD;
-               break;
-       default:
-               error = ENXIO;
-               break;
-       }
-       splx(s);
-       return (error);
-}
-
-int
-acpiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
-{
-       int error = 0;
-       struct acpi_softc *sc;
-       struct apm_power_info *pi = (struct apm_power_info *)data;
-       int s;
-
-       if (!acpi_cd.cd_ndevs || APMUNIT(dev) != 0 ||
-           !(sc = acpi_cd.cd_devs[APMUNIT(dev)]))
-               return (ENXIO);
-
-       s = splbio();
-       /* fake APM */
-       switch (cmd) {
-       case APM_IOC_SUSPEND:
-       case APM_IOC_STANDBY:
-               if ((flag & FWRITE) == 0) {
-                       error = EBADF;
-                       break;
-               }
-               acpi_addtask(sc, acpi_sleep_task, sc, SLEEP_SUSPEND);
-               acpi_wakeup(sc);
-               break;
-#ifdef HIBERNATE
-       case APM_IOC_HIBERNATE:
-               if ((error = suser(p)) != 0)
-                       break;
-               if ((flag & FWRITE) == 0) {
-                       error = EBADF;
-                       break;
-               }
-               if (get_hibernate_io_function(swdevt[0].sw_dev) == NULL) {
-                       error = EOPNOTSUPP;
-                       break;
-               }
-               acpi_addtask(sc, acpi_sleep_task, sc, SLEEP_HIBERNATE);
-               acpi_wakeup(sc);
-               break;
-#endif
-       case APM_IOC_GETPOWER:
-               error = acpi_apminfo(pi);
-               break;
-
-       default:
-               error = ENOTTY;
-       }
-
-       splx(s);
-       return (error);
-}
-
-void   acpi_filtdetach(struct knote *);
-int    acpi_filtread(struct knote *, long);
-
-const struct filterops acpiread_filtops = {
-       .f_flags        = FILTEROP_ISFD,
-       .f_attach       = NULL,
-       .f_detach       = acpi_filtdetach,
-       .f_event        = acpi_filtread,
-};
-
 int acpi_evindex;
 
 int
@@ -3525,77 +3389,4 @@ acpi_record_event(struct acpi_softc *sc, u_int type)
        return (0);
 }
 
-void
-acpi_filtdetach(struct knote *kn)
-{
-       struct acpi_softc *sc = kn->kn_hook;
-       int s;
-
-       s = splbio();
-       klist_remove_locked(&sc->sc_note, kn);
-       splx(s);
-}
-
-int
-acpi_filtread(struct knote *kn, long hint)
-{
-       /* XXX weird kqueue_scan() semantics */
-       if (hint && !kn->kn_data)
-               kn->kn_data = hint;
-       return (1);
-}
-
-int
-acpikqfilter(dev_t dev, struct knote *kn)
-{
-       struct acpi_softc *sc;
-       int s;
-
-       if (!acpi_cd.cd_ndevs || APMUNIT(dev) != 0 ||
-           !(sc = acpi_cd.cd_devs[APMUNIT(dev)]))
-               return (ENXIO);
-
-       switch (kn->kn_filter) {
-       case EVFILT_READ:
-               kn->kn_fop = &acpiread_filtops;
-               break;
-       default:
-               return (EINVAL);
-       }
-
-       kn->kn_hook = sc;
-
-       s = splbio();
-       klist_insert_locked(&sc->sc_note, kn);
-       splx(s);
-
-       return (0);
-}
-
-#else /* SMALL_KERNEL */
-
-int
-acpiopen(dev_t dev, int flag, int mode, struct proc *p)
-{
-       return (ENXIO);
-}
-
-int
-acpiclose(dev_t dev, int flag, int mode, struct proc *p)
-{
-       return (ENXIO);
-}
-
-int
-acpiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
-{
-       return (ENXIO);
-}
-
-int
-acpikqfilter(dev_t dev, struct knote *kn)
-{
-       return (EOPNOTSUPP);
-}
-
 #endif /* SMALL_KERNEL */
diff --git a/sys/dev/acpi/acpi_apm.c b/sys/dev/acpi/acpi_apm.c
new file mode 100644 (file)
index 0000000..37d5d3e
--- /dev/null
@@ -0,0 +1,228 @@
+/* $OpenBSD: acpi_apm.c,v 1.1 2023/07/08 08:01:10 tobhe 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/fcntl.h>
+
+#include <dev/acpi/acpireg.h>
+#include <dev/acpi/acpivar.h>
+#include <dev/acpi/acpidev.h>
+#include <dev/acpi/dsdt.h>
+
+#include <machine/conf.h>
+#include <machine/cpufunc.h>
+
+#ifdef HIBERNATE
+#include <sys/hibernate.h>
+#endif
+
+#include <machine/apmvar.h>
+#define APMUNIT(dev)   (minor(dev)&0xf0)
+#define APMDEV(dev)    (minor(dev)&0x0f)
+#define APMDEV_NORMAL  0
+#define APMDEV_CTL     8
+
+#ifndef SMALL_KERNEL
+
+int
+acpiopen(dev_t dev, int flag, int mode, struct proc *p)
+{
+       int error = 0;
+       struct acpi_softc *sc = acpi_softc;
+       int s;
+
+       s = splbio();
+       switch (APMDEV(dev)) {
+       case APMDEV_CTL:
+               if (!(flag & FWRITE)) {
+                       error = EINVAL;
+                       break;
+               }
+               if (sc->sc_flags & SCFLAG_OWRITE) {
+                       error = EBUSY;
+                       break;
+               }
+               sc->sc_flags |= SCFLAG_OWRITE;
+               break;
+       case APMDEV_NORMAL:
+               if (!(flag & FREAD) || (flag & FWRITE)) {
+                       error = EINVAL;
+                       break;
+               }
+               sc->sc_flags |= SCFLAG_OREAD;
+               break;
+       default:
+               error = ENXIO;
+               break;
+       }
+       splx(s);
+       return (error);
+}
+
+int
+acpiclose(dev_t dev, int flag, int mode, struct proc *p)
+{
+       int error = 0;
+       struct acpi_softc *sc = acpi_softc;
+       int s;
+
+       s = splbio();
+       switch (APMDEV(dev)) {
+       case APMDEV_CTL:
+               sc->sc_flags &= ~SCFLAG_OWRITE;
+               break;
+       case APMDEV_NORMAL:
+               sc->sc_flags &= ~SCFLAG_OREAD;
+               break;
+       default:
+               error = ENXIO;
+               break;
+       }
+       splx(s);
+       return (error);
+}
+
+int
+acpiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
+{
+       int error = 0;
+       struct acpi_softc *sc = acpi_softc;
+       struct apm_power_info *pi = (struct apm_power_info *)data;
+       int s;
+
+       s = splbio();
+       /* fake APM */
+       switch (cmd) {
+       case APM_IOC_SUSPEND:
+       case APM_IOC_STANDBY:
+               if ((flag & FWRITE) == 0) {
+                       error = EBADF;
+                       break;
+               }
+               acpi_addtask(sc, acpi_sleep_task, sc, SLEEP_SUSPEND);
+               acpi_wakeup(sc);
+               break;
+#ifdef HIBERNATE
+       case APM_IOC_HIBERNATE:
+               if ((error = suser(p)) != 0)
+                       break;
+               if ((flag & FWRITE) == 0) {
+                       error = EBADF;
+                       break;
+               }
+               if (get_hibernate_io_function(swdevt[0].sw_dev) == NULL) {
+                       error = EOPNOTSUPP;
+                       break;
+               }
+               acpi_addtask(sc, acpi_sleep_task, sc, SLEEP_HIBERNATE);
+               acpi_wakeup(sc);
+               break;
+#endif
+       case APM_IOC_GETPOWER:
+               error = acpi_apminfo(pi);
+               break;
+
+       default:
+               error = ENOTTY;
+       }
+
+       splx(s);
+       return (error);
+}
+
+void   acpi_filtdetach(struct knote *);
+int    acpi_filtread(struct knote *, long);
+
+const struct filterops acpiread_filtops = {
+       .f_flags        = FILTEROP_ISFD,
+       .f_attach       = NULL,
+       .f_detach       = acpi_filtdetach,
+       .f_event        = acpi_filtread,
+};
+
+int
+acpikqfilter(dev_t dev, struct knote *kn)
+{
+       struct acpi_softc *sc = acpi_softc;
+       int s;
+
+       switch (kn->kn_filter) {
+       case EVFILT_READ:
+               kn->kn_fop = &acpiread_filtops;
+               break;
+       default:
+               return (EINVAL);
+       }
+
+       kn->kn_hook = sc;
+
+       s = splbio();
+       klist_insert_locked(&sc->sc_note, kn);
+       splx(s);
+
+       return (0);
+}
+
+void
+acpi_filtdetach(struct knote *kn)
+{
+       struct acpi_softc *sc = kn->kn_hook;
+       int s;
+
+       s = splbio();
+       klist_remove_locked(&sc->sc_note, kn);
+       splx(s);
+}
+
+int
+acpi_filtread(struct knote *kn, long hint)
+{
+       /* XXX weird kqueue_scan() semantics */
+       if (hint && !kn->kn_data)
+               kn->kn_data = hint;
+       return (1);
+}
+
+#else /* SMALL_KERNEL */
+
+int
+acpiopen(dev_t dev, int flag, int mode, struct proc *p)
+{
+       return (ENXIO);
+}
+
+int
+acpiclose(dev_t dev, int flag, int mode, struct proc *p)
+{
+       return (ENXIO);
+}
+
+int
+acpiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
+{
+       return (ENXIO);
+}
+
+int
+acpikqfilter(dev_t dev, struct knote *kn)
+{
+       return (EOPNOTSUPP);
+}
+
+#endif /* SMALL_KERNEL */