From nobody Wed Jul 1 00:18:47 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 4gqgbr1HMMz6kC8p for ; Wed, 01 Jul 2026 00:18:48 +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 "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gqgbq4NSwz3Rgs for ; Wed, 01 Jul 2026 00:18:47 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782865127; 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=np1NJFiT0DskIHm2Z3ioR+zEsO+/QPMQ874EMm8c64A=; b=PYsIpR8hkwkmZWyWseqmjDFmTbm3qRI6ZqP21MI2po/dV4xC6T2zpsRc/KAmEg518PLG4y P/PjbT4t7YL4P2ER3c1BdZXe7BV/DMBWg68eAMd5mEUlU3wSyqBrXY7V2rcoRKhUAlbnGs k57DPeelHZBk5qnw55T7afrbXn8aC/TSu70v/BRM0JngXQnlypIaDaJXlSqX5GCfqOTQAu T6u8U52hTOCycHUgT4DHhsBzSEXRsEj3F2CwylzCss/jyzuua02+t5pry/VArJqmL1OSrZ A9XfzcULJuFqSdfdK8eA6f8q7KjJNuJZYYIFht0XrAL3t3jyT8qOXPaxcJdybQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1782865127; a=rsa-sha256; cv=none; b=SvZ258GN2RUuk4pLHUJTlDrJZIWHX8fQEo6JuQ3EFJf+/sYkUv/RDKvkOjJllX+l5uuess u3RdRe4nG0saeE8nS4txtM+leYv7mk0M+Z3fc3O5gQLMN+X6ZBInZkJmvSH1iE3kJPN6xn FcJZkaYv+SsBCkGRkByykPJhFJIqsB1k408S7LuTDUh3+FrZlKovsRoveR8OWt+OmXp4+T 6tsdXlUDSo1kvLJFwMP7/O6DSbzZM+rb3DDOm6ZpSGXbCdjWehrZ6rLMa8MZt0GWTCHrtP IX3oswE5ASE+tmtmVaIgnXbd99oBH0OItx8xTFGgE06BkY5NMXQHlj2/l3xSkA== 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=1782865127; 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=np1NJFiT0DskIHm2Z3ioR+zEsO+/QPMQ874EMm8c64A=; b=kN5YEzlVIM4k/fFv/AneyA0qvElzVP75yjeFyVN+Q1fTOOloQKrxFwIla/5r5F5GdkVRJB NSrycQmUHg5X9rzhrBtxLE+8bZ/QZovMzYLRj2AXaN7FL3Wi0eov/2IkU/lZpxUzAH5quZ ejzGau7h8uomtZY0T0TMShqAY/EcVcJ0X4UXbLwSbyj65A0yZxNnRVjd0NUq6eYd7CoBoU umH3MiHnjkI4LalFXvZz9wD2Z3ivrTVy4Z0FLFpwN8T6nW73y9CODVWa1OMagmmDEboShD X1i5+FZIkvLXfddCIVQCpn23aX/JI9Iglnvo7q6rqBXmenV246of2NgPG9c/2A== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gqgbq36VZz1695 for ; Wed, 01 Jul 2026 00:18:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 20567 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 01 Jul 2026 00:18:47 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Abdelkader Boudih From: Adrian Chadd Subject: git: 126f82a3eb61 - main - asmc: deduplicate sensor converters and cause sysctls 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: adrian X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 126f82a3eb613976f477aa8326a208459f60465d Auto-Submitted: auto-generated Date: Wed, 01 Jul 2026 00:18:47 +0000 Message-Id: <6a445ce7.20567.2e460e12@gitrepo.freebsd.org> The branch main has been updated by adrian: URL: https://cgit.FreeBSD.org/src/commit/?id=126f82a3eb613976f477aa8326a208459f60465d commit 126f82a3eb613976f477aa8326a208459f60465d Author: Abdelkader Boudih AuthorDate: 2026-07-01 00:15:51 +0000 Commit: Adrian Chadd CommitDate: 2026-07-01 00:18:40 +0000 asmc: deduplicate sensor converters and cause sysctls Replace per-type spXX_to_milli() functions with a table-driven asmc_sensor_convert() that looks up the divisor by SMC type string. Reviewed by: adrian Differential Revision: https://reviews.freebsd.org/D57854 --- sys/dev/asmc/asmc.c | 153 ++++++++++++++++------------------------------------ 1 file changed, 45 insertions(+), 108 deletions(-) diff --git a/sys/dev/asmc/asmc.c b/sys/dev/asmc/asmc.c index 6513cfed7b4f..d55c585419fb 100644 --- a/sys/dev/asmc/asmc.c +++ b/sys/dev/asmc/asmc.c @@ -130,8 +130,7 @@ static int asmc_aupo_sysctl(SYSCTL_HANDLER_ARGS); static int asmc_key_getinfo(device_t, const char *, uint8_t *, char *); /* System state / board identity sysctls */ -static int asmc_mssd_sysctl(SYSCTL_HANDLER_ARGS); -static int asmc_mssp_sysctl(SYSCTL_HANDLER_ARGS); +static int asmc_cause_sysctl(SYSCTL_HANDLER_ARGS); static int asmc_msal_sysctl(SYSCTL_HANDLER_ARGS); static int asmc_clkt_sysctl(SYSCTL_HANDLER_ARGS); static int asmc_msps_sysctl(SYSCTL_HANDLER_ARGS); @@ -687,14 +686,14 @@ asmc_attach(device_t dev) SYSCTL_ADD_PROC(sysctlctx, SYSCTL_CHILDREN(sys_tree), OID_AUTO, "shutdown_cause", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, - dev, 0, asmc_mssd_sysctl, "A", + dev, 0, asmc_cause_sysctl, "A", "Last shutdown cause (MSSD)"); if (asmc_key_getinfo(dev, ASMC_KEY_MSSP, NULL, NULL) == 0) SYSCTL_ADD_PROC(sysctlctx, SYSCTL_CHILDREN(sys_tree), OID_AUTO, "sleep_cause", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, - dev, 0, asmc_mssp_sysctl, "A", + dev, 1, asmc_cause_sysctl, "A", "Last sleep cause (MSSP)"); if (asmc_key_getinfo(dev, ASMC_KEY_MSAL, NULL, NULL) == 0) @@ -1487,78 +1486,50 @@ asmc_raw_type_sysctl(SYSCTL_HANDLER_ARGS) } #endif -/* - * Convert signed fixed-point SMC values to milli-units. - * Format "spXY" means signed with X integer bits and Y fraction bits. - */ -static int -asmc_sp78_to_milli(const uint8_t *buf) -{ - int16_t val = (int16_t)be16dec(buf); - - return ((int)val * 1000) / 256; -} - -static int -asmc_sp87_to_milli(const uint8_t *buf) -{ - int16_t val = (int16_t)be16dec(buf); - - return ((int)val * 1000) / 128; -} - -static int -asmc_sp4b_to_milli(const uint8_t *buf) -{ - int16_t val = (int16_t)be16dec(buf); - - return ((int)val * 1000) / 2048; -} - -static int -asmc_sp5a_to_milli(const uint8_t *buf) -{ - int16_t val = (int16_t)be16dec(buf); - - return ((int)val * 1000) / 1024; -} - -static int -asmc_sp69_to_milli(const uint8_t *buf) -{ - int16_t val = (int16_t)be16dec(buf); - - return ((int)val * 1000) / 512; -} - -static int -asmc_sp96_to_milli(const uint8_t *buf) -{ - int16_t val = (int16_t)be16dec(buf); - - return ((int)val * 1000) / 64; -} +/* SMC sensor type table: type string to fixed-point divisor. */ +static const struct { + const char type[5]; + int divisor; +} asmc_sensor_types[] = { + { "sp78", 256 }, + { "sp87", 128 }, + { "sp4b", 2048 }, + { "sp5a", 1024 }, + { "sp69", 512 }, + { "sp96", 64 }, + { "sp2d", 8192 }, + { "ui16", 1 }, + { "", 0 }, +}; -static int -asmc_sp2d_to_milli(const uint8_t *buf) +/* Convert a 2-byte SMC value to milli-units. */ +static bool +asmc_sensor_convert(const char *type, const uint8_t *buf, int *millivalue) { - int16_t val = (int16_t)be16dec(buf); + int i; - return ((int)val * 1000) / 8192; + for (i = 0; asmc_sensor_types[i].divisor != 0; i++) { + if (strncmp(type, asmc_sensor_types[i].type, 4) != 0) + continue; + if (asmc_sensor_types[i].divisor == 1) + *millivalue = be16dec(buf); + else + *millivalue = ((int)(int16_t)be16dec(buf) * 1000) / + asmc_sensor_types[i].divisor; + return (true); + } + return (false); } static bool asmc_sensor_type_supported(const char *type) { + int i; - return (strncmp(type, "sp78", 4) == 0 || - strncmp(type, "sp87", 4) == 0 || - strncmp(type, "sp4b", 4) == 0 || - strncmp(type, "sp5a", 4) == 0 || - strncmp(type, "sp69", 4) == 0 || - strncmp(type, "sp96", 4) == 0 || - strncmp(type, "sp2d", 4) == 0 || - strncmp(type, "ui16", 4) == 0); + for (i = 0; asmc_sensor_types[i].divisor != 0; i++) + if (strncmp(type, asmc_sensor_types[i].type, 4) == 0) + return (true); + return (false); } /* @@ -1589,23 +1560,7 @@ asmc_sensor_read(device_t dev, const char *key, int *millivalue) if (error != 0) return (error); - if (strncmp(type, "sp78", 4) == 0) { - *millivalue = asmc_sp78_to_milli(buf); - } else if (strncmp(type, "sp87", 4) == 0) { - *millivalue = asmc_sp87_to_milli(buf); - } else if (strncmp(type, "sp4b", 4) == 0) { - *millivalue = asmc_sp4b_to_milli(buf); - } else if (strncmp(type, "sp5a", 4) == 0) { - *millivalue = asmc_sp5a_to_milli(buf); - } else if (strncmp(type, "sp69", 4) == 0) { - *millivalue = asmc_sp69_to_milli(buf); - } else if (strncmp(type, "sp96", 4) == 0) { - *millivalue = asmc_sp96_to_milli(buf); - } else if (strncmp(type, "sp2d", 4) == 0) { - *millivalue = asmc_sp2d_to_milli(buf); - } else if (strncmp(type, "ui16", 4) == 0) { - *millivalue = be16dec(buf); - } else { + if (!asmc_sensor_convert(type, buf, millivalue)) { if (bootverbose) device_printf(dev, "%s: unknown type '%s' for key %s\n", @@ -2631,40 +2586,22 @@ asmc_cause_str(int8_t cause, bool is_sleep) return (NULL); } +/* MSSD/MSSP: last shutdown/sleep cause. arg2: 0=shutdown, 1=sleep. */ static int -asmc_mssd_sysctl(SYSCTL_HANDLER_ARGS) -{ - device_t dev = (device_t)arg1; - int8_t cause; - const char *desc; - char buf[ASMC_CAUSE_BUFLEN]; - - /* EIO: SMC I/O bus did not respond to key read. */ - if (asmc_key_read(dev, ASMC_KEY_MSSD, (uint8_t *)&cause, 1) != 0) - return (EIO); - - desc = asmc_cause_str(cause, false); - if (desc != NULL) - snprintf(buf, sizeof(buf), "%d (%s)", (int)cause, desc); - else - snprintf(buf, sizeof(buf), "%d", (int)cause); - - return (sysctl_handle_string(oidp, buf, sizeof(buf), req)); -} - -static int -asmc_mssp_sysctl(SYSCTL_HANDLER_ARGS) +asmc_cause_sysctl(SYSCTL_HANDLER_ARGS) { device_t dev = (device_t)arg1; + bool is_sleep = (arg2 != 0); + const char *key = is_sleep ? ASMC_KEY_MSSP : ASMC_KEY_MSSD; int8_t cause; const char *desc; char buf[ASMC_CAUSE_BUFLEN]; /* EIO: SMC I/O bus did not respond to key read. */ - if (asmc_key_read(dev, ASMC_KEY_MSSP, (uint8_t *)&cause, 1) != 0) + if (asmc_key_read(dev, key, (uint8_t *)&cause, 1) != 0) return (EIO); - desc = asmc_cause_str(cause, true); + desc = asmc_cause_str(cause, is_sleep); if (desc != NULL) snprintf(buf, sizeof(buf), "%d (%s)", (int)cause, desc); else