I am planning to restructure the APM/sleep APIs to make it easier to suspend
from more places like as a suspend keyboard shortcut.

The acpiioctl handler is x86 specific code which is currently built on all
platforms but only hooked up on i386 and amd64.  It is also in the way of
my plans, so I'd prefer if we move it to acpi_x86.c where all the other
x86-only acpi code lives.

ok?

Index: dev/acpi//acpi.c
===================================================================
RCS file: /mount/openbsd/cvs/src/sys/dev/acpi/acpi.c,v
retrieving revision 1.421
diff -u -p -r1.421 acpi.c
--- dev/acpi//acpi.c    29 Jun 2023 20:58:08 -0000      1.421
+++ dev/acpi//acpi.c    5 Jul 2023 13:37:18 -0000
@@ -3439,58 +3439,6 @@ acpiclose(dev_t dev, int flag, int mode,
        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);
 
@@ -3571,12 +3519,6 @@ acpiopen(dev_t dev, int flag, int mode, 
 
 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);
 }
Index: dev/acpi//acpi_x86.c
===================================================================
RCS file: /mount/openbsd/cvs/src/sys/dev/acpi/acpi_x86.c,v
retrieving revision 1.15
diff -u -p -r1.15 acpi_x86.c
--- dev/acpi//acpi_x86.c        6 Mar 2022 15:12:00 -0000       1.15
+++ dev/acpi//acpi_x86.c        5 Jul 2023 14:33:40 -0000
@@ -17,15 +17,86 @@
  */
 
 #include <sys/param.h>
+#include <sys/fcntl.h>
 #include <sys/systm.h>
 #include <sys/device.h>
 
+#ifdef HIBERNATE
+#include <sys/hibernate.h>
+#endif
+
+#include <machine/conf.h>
+#include <machine/cpufunc.h>
+
 #include <dev/acpi/acpireg.h>
 #include <dev/acpi/acpivar.h>
 #include <dev/acpi/acpidev.h>
 #include <dev/acpi/dsdt.h>
 
 #include <machine/apmvar.h>
+#define APMUNIT(dev)   (minor(dev)&0xf0)
+
+#ifndef SMALL_KERNEL
+extern struct cfdriver acpi_cd;
+
+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);
+}
+#else /* SMALL_KERNEL */
+int
+acpiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
+{
+       return (ENXIO);
+}
+#endif /* SMALL_KERNEL */
 
 int
 sleep_showstate(void *v, int sleepmode)

Reply via email to