From nobody Mon Jan 5 18:26:29 2026 X-Original-To: dev-commits-src-main@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 4dlN6Z1KK7z6Ms1G for ; Mon, 05 Jan 2026 18:26: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 4dlN6Y5PXBz4HSw for ; Mon, 05 Jan 2026 18:26:29 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1767637589; 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=mzO3jWoAA562iHSfMMZr4FHyc3zieBg+4ClFbfdAiJU=; b=jIZnDIOSxYbOSeurkhBL0ye4aWmjSF1RhjDgJ0I30nnwtcnEVUNWQG6mbPK2WBkQgnlWnn o7qOOfRhL0pWuFTQns0saj42cMGqgapqQBPDCKyarOF/k2bGqwLiWHa9xRnB2ZMx4yaHR9 ZbsXZvYbleOBs3XG5D9recNTD5zNkKZCYYMIOUcWFOHcmM+JRyRUGu+6TZp281+K3+M1OY iO4HQ6sTc4Nv2kETdNSXw9VuvnDGScwdZ/BcoWGfy1ra41ZSfDYURKkpz/gukGXJLCSjhk nCZIgmaU3NN1eJ9vg7h4YZKKr+0WT1DtNPQkYo35gI3bDVpUFEMV9RzRbgunXw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1767637589; 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=mzO3jWoAA562iHSfMMZr4FHyc3zieBg+4ClFbfdAiJU=; b=C2Ukx/CwdQxzAh7X1h2mqE+isRyYtGktJBF+/23mjBdfiR8H2lE+fta9F6l1x9ufGVSBXk CNMogs1heDhdQNDqAo/NJUp2rxirAWKN9PgqWVBo3Xug7AyAz4iHWPgXWix7U0+l73/JUv CVVjc8+hzIajLZam5v8WcdnRSsS8LoxDRfjjcGB4YdFQbozRiuBcR4mlQLQRkhymAkX8s3 Pr4yQIHOBZ2tqiYCtAX4doM37o7HbdTM9mmTHTGzAEUhPFVdrelIDZXddhBOyI/m+bN147 q9NI3PNJM9qwWKyHmf7oVpPVpMJwZ6mp2txcC/HZZKxAgNUDaP9AGesn+U3sDQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1767637589; a=rsa-sha256; cv=none; b=wXxITYnF921H0CB7IjfEJYO+ZHHzDG1M8GuW2mlv9Wx+CxDncfjBDJSYXfXS0NU1Sfn5zE fv/0hEx+z3VrHWaaGSp6OwZjBZCY6evygNibNZP0FYuHxQ7ALcKvy6LjFttx5frzXG3xfQ /zdaKhKoV8i1c2cLxpHAyY8X/w46QU5DkE7nw6onNLOGgTE0EoilbPrVRyjTqinzwCv6Ua UvheyZq/wBnJ3wn/aCmIlDPWBT2+JkQiSLZekQRM3Mo2XSp8tqWHTJPG8Bm6TMivA+2YtH 4NaoCYYJv1zItJsYLPsq04Rbzd6u4h7OD9jBpuSXwYtXN5AcV2PluBerves6/Q== 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 4dlN6Y4FFgzY4p for ; Mon, 05 Jan 2026 18:26:29 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 36582 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 05 Jan 2026 18:26:29 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Abdelkader Boudih From: Mark Johnston Subject: git: 1ecac45cfc5f - main - asmc: add per-fan manual mode control via sysctl List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: 1ecac45cfc5f0886907c34ec0da2c1b32618665d Auto-Submitted: auto-generated Date: Mon, 05 Jan 2026 18:26:29 +0000 Message-Id: <695c0255.36582.2683e43a@gitrepo.freebsd.org> The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=1ecac45cfc5f0886907c34ec0da2c1b32618665d commit 1ecac45cfc5f0886907c34ec0da2c1b32618665d Author: Abdelkader Boudih AuthorDate: 2026-01-05 18:03:23 +0000 Commit: Mark Johnston CommitDate: 2026-01-05 18:25:47 +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 --- 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 bdb8ca7831c4..0572c8e663a7 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)"); } /* @@ -1347,6 +1355,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. */