From nobody Mon Jan 26 00:52:30 2026 X-Original-To: dev-commits-src-branches@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 4dzqkk6J0bz6PMn8 for ; Mon, 26 Jan 2026 00:52:30 +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" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dzqkk57jSz3SGP for ; Mon, 26 Jan 2026 00:52:30 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1769388750; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=hYCXXkQ7aY12dqN7OMy7vwd4iTlNHltDRLQTJ6PX7pU=; b=V895dYMauWwU6VAh/hALiPQGIHWC4iUDo1XMNGp70SApCZoMNHlVDhlaJ4mHLkMCkV2dCn G68/q2djgWPz1U5daM2q3UHy/9HGhlv3AzEoQrD5KEjQ0MPLOMl81wEmf23EoHGlJD7io2 0wvgTTRESaCfFCwhZbjhs/UQSUuerxv4X9XM0ieEUetT4TtHJ8lGFZST3XCvtvWLKn9v6d ili2xvaMhCOSRmFhfyQuh8qWwk7bI1JeQUQX9CjAwApu32dfr+NnZa3Gr3ys4PKesrN3BM uJrYd1tFcklcO92/f+1F6SE2/7Xa20Sz5qKfCrQjgGKbBBq9Cyt2atI+XJ8RwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1769388750; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=hYCXXkQ7aY12dqN7OMy7vwd4iTlNHltDRLQTJ6PX7pU=; b=bj1m3wfu7CHgcsyqo1XgzEXbTwO7Ho0YynjnF1FiaaZxjwmiN5mpKpDB9asaUP+yDk2Le8 ZxBEU71edagceiNLdELkMFFotnLA3PySV9O0bOY8plIvIW2rYAg9pCL48yfAgdqmx+Oiu1 sTNkL5UzMTrY0MGIl8IoX4AUoq2Sqiyi6spmQctu4gKBQS1l9rPIBcOgzIVZddnROs2D1v k5hb5Vicc3mDAqEziUeskN09VADyRx3dLupKdwNLHGx/F8XyW+7OnGdwJQe34ynbIrkfQ1 xU+Tu242b84UQzP4Gu67AVIkVIftVRWzSCGwWd4vuuPstRu1GYQZtDfcTAAzAQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1769388750; a=rsa-sha256; cv=none; b=InwU8EQlvGzA4H3Xb6iB+P/m2MO+uLWd5qhOxwFOkMTDtfxbfcpIgXZ9YCwtRScF/+zVC8 K5AbgkkfP2Lor0ijmysBdd+0910dPMuNtJLlPoAmb9eZ06ba/yQ40un30mWmCol16kyJM4 yJGx5X69JoWCWx0xX6E7F6fZ+HoBJbfAPTosbrQzrgNbJRnY2rw6Imk65Y/WRgCR2r19TI JLo6OhYm60/Op7a1jXLQfqX+c6J4eD2FPOJ4MleSKzPEYsrFtT+uin10RSaLbYb02lMZds vZNWKWft4eekLN+AX5Mj6B24blQ+Cn3c+1pct58Z3+eQikHjoIfvJGtPRIJKKw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4dzqkk4gmlzyXG for ; Mon, 26 Jan 2026 00:52:30 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 9012 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 26 Jan 2026 00:52:30 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Cc: Abdelkader Boudih From: Mark Johnston Subject: git: a11b4f757e97 - stable/15 - asmc: add per-fan manual mode control via sysctl List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: a11b4f757e97397e9d61c7236dd6dd5b6e4be8a7 Auto-Submitted: auto-generated Date: Mon, 26 Jan 2026 00:52:30 +0000 Message-Id: <6976bace.9012.147a92a4@gitrepo.freebsd.org> The branch stable/15 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=a11b4f757e97397e9d61c7236dd6dd5b6e4be8a7 commit a11b4f757e97397e9d61c7236dd6dd5b6e4be8a7 Author: Abdelkader Boudih AuthorDate: 2026-01-05 18:03:23 +0000 Commit: Mark Johnston CommitDate: 2026-01-26 00:51:44 +0000 asmc: add per-fan manual mode control via sysctl Add per-fan manual mode control via dev.asmc.0.fan.N.manual sysctl. Apple SMCs support manual fan control via the FS! SMC key, a 16-bit bitmask where each bit controls one fan (0=auto, 1=manual). This change adds a new sysctl per fan: dev.asmc.0.fan.N.manual (0=auto, 1=manual) When set to manual mode (1), the fan runs at the speed set via dev.asmc.0.fan.N.targetspeed instead of automatic thermal control. When set to auto mode (0), the SMC controls fan speed automatically. The FS! key was already defined in asmcvar.h but not accessible. This exposes it for debugging, testing, and advanced fan control. Implementation uses read-modify-write to allow independent control of each fan without affecting others. Reviewed by: adrian, markj MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D54437 (cherry picked from commit 1ecac45cfc5f0886907c34ec0da2c1b32618665d) --- sys/dev/asmc/asmc.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/sys/dev/asmc/asmc.c b/sys/dev/asmc/asmc.c index d99c1d56e67c..5a1074abde83 100644 --- a/sys/dev/asmc/asmc.c +++ b/sys/dev/asmc/asmc.c @@ -97,6 +97,7 @@ static int asmc_mb_sysctl_fansafespeed(SYSCTL_HANDLER_ARGS); static int asmc_mb_sysctl_fanminspeed(SYSCTL_HANDLER_ARGS); static int asmc_mb_sysctl_fanmaxspeed(SYSCTL_HANDLER_ARGS); static int asmc_mb_sysctl_fantargetspeed(SYSCTL_HANDLER_ARGS); +static int asmc_mb_sysctl_fanmanual(SYSCTL_HANDLER_ARGS); static int asmc_temp_sysctl(SYSCTL_HANDLER_ARGS); static int asmc_mb_sysctl_sms_x(SYSCTL_HANDLER_ARGS); static int asmc_mb_sysctl_sms_y(SYSCTL_HANDLER_ARGS); @@ -656,6 +657,13 @@ asmc_attach(device_t dev) CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, dev, j, model->smc_fan_targetspeed, "I", "Fan target speed in RPM"); + + SYSCTL_ADD_PROC(sysctlctx, + SYSCTL_CHILDREN(sc->sc_fan_tree[i]), + OID_AUTO, "manual", + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, + dev, j, asmc_mb_sysctl_fanmanual, "I", + "Fan manual mode (0=auto, 1=manual)"); } /* @@ -1338,6 +1346,53 @@ asmc_mb_sysctl_fantargetspeed(SYSCTL_HANDLER_ARGS) return (error); } +static int +asmc_mb_sysctl_fanmanual(SYSCTL_HANDLER_ARGS) +{ + device_t dev = (device_t) arg1; + int fan = arg2; + int error; + int32_t v; + uint8_t buf[2]; + uint16_t val; + + /* Read current FS! bitmask (asmc_key_read locks internally) */ + error = asmc_key_read(dev, ASMC_KEY_FANMANUAL, buf, sizeof(buf)); + if (error != 0) + return (error); + + /* Extract manual bit for this fan (big-endian) */ + val = (buf[0] << 8) | buf[1]; + v = (val >> fan) & 0x01; + + /* Let sysctl handle the value */ + error = sysctl_handle_int(oidp, &v, 0, req); + + if (error == 0 && req->newptr != NULL) { + /* Validate input (0 = auto, 1 = manual) */ + if (v != 0 && v != 1) + return (EINVAL); + /* Read-modify-write of FS! bitmask */ + error = asmc_key_read(dev, ASMC_KEY_FANMANUAL, buf, sizeof(buf)); + if (error == 0) { + val = (buf[0] << 8) | buf[1]; + + /* Modify single bit */ + if (v) + val |= (1 << fan); /* Set to manual */ + else + val &= ~(1 << fan); /* Set to auto */ + + /* Write back */ + buf[0] = val >> 8; + buf[1] = val & 0xff; + error = asmc_key_write(dev, ASMC_KEY_FANMANUAL, buf, sizeof(buf)); + } + } + + return (error); +} + /* * Temperature functions. */