From nobody Wed May 13 11:56:55 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gFsQ44qn3z6dHPk for ; Wed, 13 May 2026 11:57:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gFsQ44BxNz3ptD for ; Wed, 13 May 2026 11:57:00 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1778673420; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=nwmVawtIieAvC9ekV7+jYwunabZV2QtQenMOHU0irVI=; b=LwN7ojmRZL+OEQWWqhx/PdNWyDHC3ugOTnlZs/CHJNaGPFJWrJVs3SjlEUTORERkR6l8Yz ymlsht4JnlfvopGn1ove6Ze/yArBs5X4zoDjATObAN2i+uHKyYd5pxXZT1wzxrXGlhZo08 zDWJqBqIPziiAV7uvWz1onV1aA3HHIUJ0P8zaDuvhFjCvD81xZQz4JVg3bDljw+zU9Wb/O k1ZeODA/aDlrmMFfMDQ12jPuu0NuaXkbITozhaaNoN8Mmd05JfNEgZrV4MRm0VzA27Dup4 3ZhZAGchsVoAslutfA5Qey9Bw6ePc1JrICH62r1SfucFfyaV8V0T3e8c1d1BQQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1778673420; a=rsa-sha256; cv=none; b=j3paGVMNfJ2kl/pDujBIabNmgWCgHZSw/0J0IHVM7iezEJ5ZVdTNbL3CD0pu32Hs4jkjp4 9Osl/who6XAZxNOz99+Sgfak6+8b2Zs/cEuzUjjdDBhYof3BE1rCfQ2WSfljmM0Rm3yoI4 xN2fIZ7bsto758EeNrSUvXGOkJO8Q4SVqFdWNFwIzp9bnn038eikYjBGnFxxbsWPE1+PrB thEw9B3EfU3FJsvQ25PXVeWtUfC0Ou7I8oOoy5NXamfg4+OhcD4WlGJ/KB1Esx6MXMNtUz XaVTfxZXq4LqL8r1+xLt0suln7Q4Onbizf4ArP28I6RoWts5WrCaKbrqDd2JiQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1778673420; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=nwmVawtIieAvC9ekV7+jYwunabZV2QtQenMOHU0irVI=; b=fE3mSKGNalWiHfhtP5fhlA3QunAWssEO0XPZPGErMJhdeRMXhzwhcLk9sAgAy4EFnvxA7U pX1BXQlRUJITvlmdzMaOkGAuAcEQZMtNoUORjj/dQFFIAg2oT/Djnqmcii/HLJVgvPC3bK PmjoYn8K5AcotQcV+XsxKcqsJDVeGppg1XlkzJH7Botav6k94X2Zn3S2TZHs6ouf+swOfQ NfmsEuPn8cTx07hFLgybrGXwrxvNhAq+oqlzISfE5QYuIOz0FfqdP/025d6V2TmYBSBLQt yqIPevzjpyfRrg3XU17JVwEo+EaX54BVC1f/sqpvvTkcIC4Dzx+oUC2tanbUyA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gFsQ43bskzqRK for ; Wed, 13 May 2026 11:57:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 46877 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 13 May 2026 11:56:55 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Aymeric Wibo Subject: git: d649825e8348 - main - power: Power device and ioctl for state transitions List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: obiwac X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: d649825e83482f796f492f2000b20ce1b5db6f63 Auto-Submitted: auto-generated Date: Wed, 13 May 2026 11:56:55 +0000 Message-Id: <6a046707.46877.4d9fa1a9@gitrepo.freebsd.org> The branch main has been updated by obiwac: URL: https://cgit.FreeBSD.org/src/commit/?id=d649825e83482f796f492f2000b20ce1b5db6f63 commit d649825e83482f796f492f2000b20ce1b5db6f63 Author: Aymeric Wibo AuthorDate: 2026-05-10 09:04:32 +0000 Commit: Aymeric Wibo CommitDate: 2026-05-13 11:55:48 +0000 power: Power device and ioctl for state transitions Create new /dev/power node with super simple ioctl for initiating sleep state transitions. This is meant as a generic interface to replace the ACPI- and APM-specific interfaces. This allows for non-ACPI states to be entered, such as suspend-to-idle when setting kern.power.suspend=suspend_to_idle. Reviewed by: markj, olce Approved by: markj, olce Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D55508 --- sys/dev/acpi_support/acpi_ibm.c | 2 +- sys/dev/syscons/syscons.c | 4 +-- sys/dev/vt/vt_core.c | 4 +-- sys/kern/subr_power.c | 59 ++++++++++++++++++++++++++++++++++++++--- sys/sys/power.h | 31 ++++++++++++++-------- 5 files changed, 81 insertions(+), 19 deletions(-) diff --git a/sys/dev/acpi_support/acpi_ibm.c b/sys/dev/acpi_support/acpi_ibm.c index 2967832a0878..693d793532c1 100644 --- a/sys/dev/acpi_support/acpi_ibm.c +++ b/sys/dev/acpi_support/acpi_ibm.c @@ -1453,7 +1453,7 @@ acpi_ibm_eventhandler(struct acpi_ibm_softc *sc, int arg) * 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 index fe440b68f209..9167da23efd8 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -3987,10 +3987,10 @@ next_code: 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 index 641f6c014937..db54cb426844 100644 --- a/sys/dev/vt/vt_core.c +++ b/sys/dev/vt/vt_core.c @@ -804,11 +804,11 @@ vt_machine_kbdevent(struct vt_device *vd, int c) 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 index 47682a0ee75e..ffd91db83e96 100644 --- a/sys/kern/subr_power.c +++ b/sys/kern/subr_power.c @@ -31,7 +31,10 @@ */ #include +#include #include +#include +#include #include #include #include @@ -49,6 +52,54 @@ static void *power_pm_arg = NULL; 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; + /* Check for overflow */ + if ((enum power_transition)trans != trans) + return (EINVAL); + 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 +226,13 @@ power_pm_get_type(void) 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 +247,13 @@ power_pm_suspend(enum power_transition trans) 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 index e420717e1aa7..a1497d1a6524 100644 --- 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 * under sponsorship from the FreeBSD Foundation. @@ -32,17 +32,9 @@ #ifndef _SYS_POWER_H_ #define _SYS_POWER_H_ -#ifdef _KERNEL -#include #include - -/* 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 /* * Sleep state transition requests. @@ -55,8 +47,25 @@ enum power_transition { POWER_TRANSITION_STANDBY, POWER_TRANSITION_SUSPEND, POWER_TRANSITION_HIBERNATE, + POWER_TRANSITION_COUNT, }; +/* + * Power ioctls. + */ +#define PIOTRANSITION _IOW('T', 1, uint32_t) + +#ifdef _KERNEL + +#include + +/* 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 @@ extern int power_pm_register(u_int _pm_type, power_pm_fn_t _pm_fn, 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.