Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F158775196
D55508.id177716.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D55508.id177716.diff
View Options
diff --git a/sys/dev/acpi_support/acpi_ibm.c b/sys/dev/acpi_support/acpi_ibm.c
--- a/sys/dev/acpi_support/acpi_ibm.c
+++ b/sys/dev/acpi_support/acpi_ibm.c
@@ -1453,7 +1453,7 @@
* instead of suspend-to-RAM.
*/
case IBM_EVENT_SUSPEND_TO_RAM:
- power_pm_suspend(POWER_TRANSITION_SUSPEND);
+ (void)power_pm_suspend(POWER_TRANSITION_SUSPEND);
break;
case IBM_EVENT_BLUETOOTH:
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -3987,10 +3987,10 @@
break;
case SUSP:
- power_pm_suspend(POWER_TRANSITION_SUSPEND);
+ (void)power_pm_suspend(POWER_TRANSITION_SUSPEND);
break;
case STBY:
- power_pm_suspend(POWER_TRANSITION_STANDBY);
+ (void)power_pm_suspend(POWER_TRANSITION_STANDBY);
break;
case DBG:
diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c
--- a/sys/dev/vt/vt_core.c
+++ b/sys/dev/vt/vt_core.c
@@ -804,11 +804,11 @@
return (1);
case SPCLKEY | STBY: /* XXX Not present in kbdcontrol parser. */
/* Put machine into Stand-By mode. */
- power_pm_suspend(POWER_TRANSITION_STANDBY);
+ (void)power_pm_suspend(POWER_TRANSITION_STANDBY);
return (1);
case SPCLKEY | SUSP: /* kbdmap(5) keyword `susp`. */
/* Suspend machine. */
- power_pm_suspend(POWER_TRANSITION_SUSPEND);
+ (void)power_pm_suspend(POWER_TRANSITION_SUSPEND);
return (1);
}
diff --git a/sys/kern/subr_power.c b/sys/kern/subr_power.c
--- a/sys/kern/subr_power.c
+++ b/sys/kern/subr_power.c
@@ -31,7 +31,10 @@
*/
#include <sys/param.h>
+#include <sys/conf.h>
#include <sys/eventhandler.h>
+#include <sys/fcntl.h>
+#include <sys/kernel.h>
#include <sys/power.h>
#include <sys/proc.h>
#include <sys/sbuf.h>
@@ -49,6 +52,51 @@
static bool power_pm_supported[POWER_STYPE_COUNT] = {0};
static struct task power_pm_task;
+static d_ioctl_t power_ioctl;
+
+static struct cdevsw power_cdevsw = {
+ .d_version = D_VERSION,
+ .d_ioctl = power_ioctl,
+ .d_name = "power",
+};
+
+static void
+power_init(void *unused)
+{
+ struct make_dev_args args;
+ struct cdev *dev;
+
+ make_dev_args_init(&args);
+ args.mda_devsw = &power_cdevsw;
+ args.mda_uid = UID_ROOT;
+ args.mda_gid = GID_OPERATOR;
+ args.mda_mode = 0660;
+ if (make_dev_s(&args, &dev, "power") != 0)
+ printf("Failed to create power device");
+}
+SYSINIT(powerdev, SI_SUB_PSEUDO, SI_ORDER_ANY, power_init, NULL);
+
+static int
+power_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
+ struct thread *td)
+{
+ int err = 0;
+ uint32_t trans;
+
+ if ((fflag & FWRITE) == 0)
+ return (EPERM);
+
+ switch (cmd) {
+ case PIOTRANSITION:
+ trans = *(uint32_t *)data;
+ err = power_pm_suspend((enum power_transition)trans);
+ break;
+ default:
+ err = EINVAL;
+ }
+ return (err);
+}
+
enum power_stype
power_name_to_stype(const char *name)
{
@@ -175,13 +223,13 @@
return (power_pm_type);
}
-void
+int
power_pm_suspend(enum power_transition trans)
{
enum power_stype stype;
if (power_pm_fn == NULL)
- return;
+ return (ENXIO);
switch (trans) {
case POWER_TRANSITION_STANDBY:
@@ -196,11 +244,13 @@
default:
printf("%s: unknown sleep state transition %d\n", __func__,
trans);
- return;
+ return (EINVAL);
}
power_pm_task.ta_context = (void *)(intptr_t)stype;
taskqueue_enqueue(taskqueue_thread, &power_pm_task);
+
+ return (0);
}
/*
diff --git a/sys/sys/power.h b/sys/sys/power.h
--- a/sys/sys/power.h
+++ b/sys/sys/power.h
@@ -3,7 +3,7 @@
*
* Copyright (c) 2001 Mitsuru IWASAKI
* All rights reserved.
- * Copyright (c) 2025 The FreeBSD Foundation
+ * Copyright (c) 2025-2026 The FreeBSD Foundation
*
* Portions of this software were developed by Aymeric Wibo
* <obiwac@freebsd.org> under sponsorship from the FreeBSD Foundation.
@@ -32,17 +32,9 @@
#ifndef _SYS_POWER_H_
#define _SYS_POWER_H_
-#ifdef _KERNEL
-#include <sys/_eventhandler.h>
#include <sys/types.h>
-
-/* Power management system type */
-#define POWER_PM_TYPE_ACPI 0x01
-#define POWER_PM_TYPE_NONE 0xff
-
-/* Commands for Power management function */
-#define POWER_CMD_SUSPEND 0x00
+#include <sys/ioccom.h>
/*
* Sleep state transition requests.
@@ -55,8 +47,25 @@
POWER_TRANSITION_STANDBY,
POWER_TRANSITION_SUSPEND,
POWER_TRANSITION_HIBERNATE,
+ POWER_TRANSITION_COUNT,
};
+/*
+ * Power ioctls.
+ */
+#define PIOTRANSITION _IOW('T', 1, uint32_t)
+
+#ifdef _KERNEL
+
+#include <sys/_eventhandler.h>
+
+/* Power management system type */
+#define POWER_PM_TYPE_ACPI 0x01
+#define POWER_PM_TYPE_NONE 0xff
+
+/* Commands for Power management function */
+#define POWER_CMD_SUSPEND 0x00
+
/*
* Sleep type.
*
@@ -97,7 +106,7 @@
void *_pm_arg,
bool _pm_supported[static POWER_STYPE_COUNT]);
extern u_int power_pm_get_type(void);
-extern void power_pm_suspend(enum power_transition _trans);
+extern int power_pm_suspend(enum power_transition _trans);
/*
* System power API.
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jun 6, 7:42 PM (5 h, 31 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33784324
Default Alt Text
D55508.id177716.diff (4 KB)
Attached To
Mode
D55508: power: Power device and ioctl for state transitions
Attached
Detach File
Event Timeline
Log In to Comment