From nobody Mon Mar 09 09:21:49 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 4fTs315bffz6VSFP for ; Mon, 09 Mar 2026 09:21:49 +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 "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fTs314qCwz3Z5f for ; Mon, 09 Mar 2026 09:21:49 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1773048109; 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=nSK1qUyM3X6FldvKwdyivAyGlnWbUO5U5MvoTI5n3/c=; b=eFXNsctZ1KENouXUOvJtqPRmI0mMZcP4rAYYKb3b5a6MbHU0rgB4WE2xNJaMmhXI6dOeiO y1/McbSaA7pScNned7QxJSvt0FgJVOqHWQ1UG8O3TvH+m/QUwQ585abH3AUiR+5PXcxmhr pwL+0cR+bdcXPNt3WMFhaDbFmy84Lh2LUPL1mVU5/eKgXRT5tEKjMgSVKIupobLCACQoWh wDGkZUpzU+kxRzTDtdkKPCkX/r/EZ5XIkdIunkj1xsFotHhFtgX+MofM8GL/bRyLNBkMTa pE0cx2sTIWp2Ftyocne+4iJU9WEJ7xqpgtT3w2Xp58zMRp46ApYrf/9b/MILEA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1773048109; a=rsa-sha256; cv=none; b=XizaTjnq8g7jf3coljycknxxOds22YY25HoPzeuLMJEU7Vul/jw/m7pa6fW/cUUcvCo9bm SZDZTknJvFdK9fZ4aZmLRH40LADe3SkxfdqURVyYd65aFJuznnTTbn9p/IlKxPCiTKpCYU qXgpy85a1xy2xZ6LFlpAjq9tXL+Rfj1TJzF3SRgvQptwx7gT9gIfLJJPDf9fkeFYeQN+gC mLo2LNhtNNArcq5Hiq81awki/19LAPCnrMTdMtpzf6yzbNPQUc8xQD8WBV7U/wz7AEZ/4O NV648wp7J29BKNmOqkhSv0AwGcxgFHiSU9W6OYz7N/SunC/YwrseaYpMJNL/7Q== 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=1773048109; 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=nSK1qUyM3X6FldvKwdyivAyGlnWbUO5U5MvoTI5n3/c=; b=mLdIsozlKAnMCn1UxgFh2U1sD/r32rM06M0V5CNfpoyhB0yE8iFgwYLuC2EQZ7mjeRZblL h03Qv806wa9vzHhU1z75pcr4rJzcyCh1cNXlQwn3uNCpe4FBxpi2nymSBtaAhlRgZA6GsM 6zOM9psUtzwTXiIJwjHf38ZTpous89YwDNz26wvkKlX4/Mz2LCd1WlIHpVxHAJCawi+YAd 8nKes6MXo9/IkKnVFgtO/tkLnv8d1Wlm5Xb7/IfrgB2NExLHCodn1IhxMsySGJi25FgkME 5T/nPo6yHIwhSv3EfVoPkuX1tJlrQkr8fhNuUzaR7ptPmVOgqs5/KFwLgsIw3w== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fTs314Jftz3lS for ; Mon, 09 Mar 2026 09:21:49 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3d042 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 09 Mar 2026 09:21:49 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Pouria Mousavizadeh Tehrani Subject: git: f87ba4522ec9 - main - acpi_system76: Add support for battary charge thresholds 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 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: pouria X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f87ba4522ec9e7b2227b8f20f3a4d7c6a129da1c Auto-Submitted: auto-generated Date: Mon, 09 Mar 2026 09:21:49 +0000 Message-Id: <69ae912d.3d042.77be2a85@gitrepo.freebsd.org> The branch main has been updated by pouria: URL: https://cgit.FreeBSD.org/src/commit/?id=f87ba4522ec9e7b2227b8f20f3a4d7c6a129da1c commit f87ba4522ec9e7b2227b8f20f3a4d7c6a129da1c Author: Pouria Mousavizadeh Tehrani AuthorDate: 2026-03-07 18:33:43 +0000 Commit: Pouria Mousavizadeh Tehrani CommitDate: 2026-03-09 09:11:56 +0000 acpi_system76: Add support for battary charge thresholds Reviewed by: wulf Differential Revision: https://reviews.freebsd.org/D55710 --- sys/dev/acpi_support/acpi_system76.c | 147 +++++++++++++++++++++++++++-------- 1 file changed, 116 insertions(+), 31 deletions(-) diff --git a/sys/dev/acpi_support/acpi_system76.c b/sys/dev/acpi_support/acpi_system76.c index c20725f0174e..9ae7d116be0b 100644 --- a/sys/dev/acpi_support/acpi_system76.c +++ b/sys/dev/acpi_support/acpi_system76.c @@ -54,7 +54,9 @@ struct acpi_system76_softc { ACPI_HANDLE handle; struct acpi_ctrl kbb, /* S76_CTRL_KBB */ - kbc; /* S76_CTRL_KBC */ + kbc, /* S76_CTRL_KBC */ + bctl, /* S76_CTRL_BCTL */ + bcth; /* S76_CTRL_BCTH */ struct sysctl_ctx_list sysctl_ctx; struct sysctl_oid *sysctl_tree; @@ -72,19 +74,25 @@ static void acpi_system76_notify_handler(ACPI_HANDLE, uint32_t, void *); static void acpi_system76_check(struct acpi_system76_softc *); /* methods */ -#define S76_CTRL_KBB 1 /* Keyboard Brightness */ -#define S76_CTRL_KBC 2 /* Keyboard Color */ -#define S76_CTRL_MAX 3 +enum { + S76_CTRL_KBB = 1, /* Keyboard Brightness */ + S76_CTRL_KBC = 2, /* Keyboard Color */ + S76_CTRL_BCTL = 3, /* Battary Charging Start Thresholds */ + S76_CTRL_BCTH = 4, /* Battary Charging End Thresholds */ +}; +#define S76_CTRL_MAX 5 struct s76_ctrl_table { char *name; char *get_method; #define S76_CTRL_GKBB "\\_SB.S76D.GKBB" #define S76_CTRL_GKBC "\\_SB.S76D.GKBC" +#define S76_CTRL_GBCT "\\_SB.PCI0.LPCB.EC0.GBCT" char *set_method; #define S76_CTRL_SKBB "\\_SB.S76D.SKBB" #define S76_CTRL_SKBC "\\_SB.S76D.SKBC" +#define S76_CTRL_SBCT "\\_SB.PCI0.LPCB.EC0.SBCT" char *desc; }; @@ -102,6 +110,18 @@ static const struct s76_ctrl_table s76_sysctl_table[] = { .set_method = S76_CTRL_SKBC, .desc = "Keyboard Color", }, + [S76_CTRL_BCTL] = { + .name = "battary_thresholds_low", + .get_method = S76_CTRL_GBCT, + .set_method = S76_CTRL_SBCT, + .desc = "Battary charging start thresholds", + }, + [S76_CTRL_BCTH] = { + .name = "battary_thresholds_high", + .get_method = S76_CTRL_GBCT, + .set_method = S76_CTRL_SBCT, + .desc = "Battary charging end thresholds", + }, }; static device_method_t acpi_system76_methods[] = { @@ -135,10 +155,12 @@ acpi_system76_ctrl_map(struct acpi_system76_softc *sc, int method) switch (method) { case S76_CTRL_KBB: return (&sc->kbb); - break; case S76_CTRL_KBC: return (&sc->kbc); - break; + case S76_CTRL_BCTL: + return (&sc->bctl); + case S76_CTRL_BCTH: + return (&sc->bcth); default: device_printf(sc->dev, "Driver received unknown method\n"); return (NULL); @@ -150,6 +172,9 @@ acpi_system76_update(struct acpi_system76_softc *sc, int method, bool set) { struct acpi_ctrl *ctrl; ACPI_STATUS status; + ACPI_BUFFER Buf; + ACPI_OBJECT Arg[2], Obj; + ACPI_OBJECT_LIST Args; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); ACPI_SERIAL_ASSERT(system76); @@ -157,12 +182,41 @@ acpi_system76_update(struct acpi_system76_softc *sc, int method, bool set) if ((ctrl = acpi_system76_ctrl_map(sc, method)) == NULL) return (EINVAL); - if (set) - status = acpi_SetInteger(sc->handle, s76_sysctl_table[method].set_method, - ctrl->val); - else - status = acpi_GetInteger(sc->handle, s76_sysctl_table[method].get_method, - &ctrl->val); + switch (method) { + case S76_CTRL_BCTL: + case S76_CTRL_BCTH: + Arg[0].Type = ACPI_TYPE_INTEGER; + Arg[0].Integer.Value = method == S76_CTRL_BCTH ? 1 : 0; + Args.Count = set ? 2 : 1; + Args.Pointer = Arg; + Buf.Length = sizeof(Obj); + Buf.Pointer = &Obj; + + if (set) { + Arg[1].Type = ACPI_TYPE_INTEGER; + Arg[1].Integer.Value = ctrl->val; + + status = AcpiEvaluateObject(sc->handle, + s76_sysctl_table[method].set_method, &Args, &Buf); + } else { + status = AcpiEvaluateObject(sc->handle, + s76_sysctl_table[method].get_method, &Args, &Buf); + if (ACPI_SUCCESS(status) && + Obj.Type == ACPI_TYPE_INTEGER) + ctrl->val = Obj.Integer.Value; + } + break; + case S76_CTRL_KBB: + case S76_CTRL_KBC: + if (set) + status = acpi_SetInteger(sc->handle, s76_sysctl_table[method].set_method, + ctrl->val); + else + status = acpi_GetInteger(sc->handle, s76_sysctl_table[method].get_method, + &ctrl->val); + break; + } + if (ACPI_FAILURE(status)) { device_printf(sc->dev, "Couldn't query method (%s)\n", s76_sysctl_table[method].name); @@ -183,8 +237,12 @@ acpi_system76_notify_update(void *arg) sc = (struct acpi_system76_softc *)device_get_softc(arg); ACPI_SERIAL_BEGIN(system76); - for (method = 1; method < S76_CTRL_MAX; method++) + for (method = 1; method < S76_CTRL_MAX; method++) { + if (method == S76_CTRL_BCTL || + method == S76_CTRL_BCTH) + continue; acpi_system76_update(sc, method, false); + } ACPI_SERIAL_END(system76); } @@ -201,6 +259,14 @@ acpi_system76_check(struct acpi_system76_softc *sc) if ((ctrl = acpi_system76_ctrl_map(sc, method)) == NULL) continue; + /* available in all models */ + if (method == S76_CTRL_BCTL || + method == S76_CTRL_BCTH) { + ctrl->exists = true; + acpi_system76_update(sc, method, false); + continue; + } + if (ACPI_FAILURE(acpi_GetInteger(sc->handle, s76_sysctl_table[method].get_method, &ctrl->val))) { ctrl->exists = false; @@ -236,9 +302,10 @@ acpi_system76_notify_handler(ACPI_HANDLE handle, uint32_t notify, void *ctx) static int acpi_system76_sysctl_handler(SYSCTL_HANDLER_ARGS) { - struct acpi_ctrl *ctrl; + struct acpi_ctrl *ctrl, *ctrl_cmp; struct acpi_system76_softc *sc; int val, method, error; + bool update; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); @@ -253,27 +320,45 @@ acpi_system76_sysctl_handler(SYSCTL_HANDLER_ARGS) device_printf(sc->dev, "Driver query failed\n"); return (error); } - if (req->newptr == NULL) - return (error); - /* Input validation */ - switch (method) { - case S76_CTRL_KBB: - if (val > UINT8_MAX || val < 0) - return (EINVAL); - break; - case S76_CTRL_KBC: - if (val >= (1 << 24) || val < 0) - return (EINVAL); - break; - default: - break; + if (req->newptr == NULL) { + /* + * ACPI will not notify us if battary thresholds changes + * outside this module. Therefore, always fetch those values. + */ + if (method != S76_CTRL_BCTL && method != S76_CTRL_BCTH) + return (error); + update = false; + } else { + /* Input validation */ + switch (method) { + case S76_CTRL_KBB: + if (val > UINT8_MAX || val < 0) + return (EINVAL); + break; + case S76_CTRL_KBC: + if (val >= (1 << 24) || val < 0) + return (EINVAL); + break; + case S76_CTRL_BCTL: + if ((ctrl_cmp = acpi_system76_ctrl_map(sc, S76_CTRL_BCTH)) == NULL) + return (EINVAL); + if (val > 100 || val < 0 || val >= ctrl_cmp->val) + return (EINVAL); + break; + case S76_CTRL_BCTH: + if ((ctrl_cmp = acpi_system76_ctrl_map(sc, S76_CTRL_BCTL)) == NULL) + return (EINVAL); + if (val > 100 || val < 0 || val <= ctrl_cmp->val) + return (EINVAL); + break; + } + ctrl->val = val; + update = true; } - ctrl->val = val; - ACPI_SERIAL_BEGIN(system76); - error = acpi_system76_update(sc, method, true); + error = acpi_system76_update(sc, method, update); ACPI_SERIAL_END(system76); return (error); }