From nobody Wed Feb 11 20:43:59 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 4fB9QD68snz6SBnL for ; Wed, 11 Feb 2026 20:44:04 +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 4fB9QD4qdrz3PVp for ; Wed, 11 Feb 2026 20:44:04 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1770842644; 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=NevUR4YUHj3sJ7sNzzP6cN8IxDiD2BRe67TvGYjGhC4=; b=QUSh/UfthSq0RGBRCCw8YbA29TaBccVI1ZcXx79+yvXF8rjtgBE8JesimoxFKO9iGRcWwP yywtIfVhQcbxvBEHXOqEeYt0CHjdwGDGigtowHH84HwcRNKkyEYP78fk2WUOHrQB0HzmFt SwX3rylI8Kn+XXR3DhV0zIWOY4BZLQ6A10a8aolq2i1dV59+gTYA/TyO7VQW5pGRfqFzgr YfAiaVdA73aaooNPO97akc1752O/j5fOgHSi9ieesPjrTtw8poQrXzfuR3V5+mo07wySLG MykLkMy7znFOAYGiIhaY7VMEJ/pbTWYBGJBQGrH+OAusvdjHM4xj1TLUzlfmXg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1770842644; a=rsa-sha256; cv=none; b=chTUHS3Hsn2xW9jEZb+KGAxGJ++mKWlpE5xffiE0yT1FXRbnLbET5QAtv6cZH9tCv420sd zg/jDaW/OJNkUNplcxqtvMB3bW+MwOe3aYWkFBLyjUcg7MTpOvfGOE1xuAUgbRL4B0XDML 9gb7AH9dH900tiSD8lXpqMfRyRc8uFSiWg6QE+TYFubp/S/H9lOMAJcIuN7OFjulppPtxV 8067crBG9KEIxI8KFP7IOteGPkMYzbJW5kNHaS8gydY9X0nFCmYzDDMPJ5ioEBPsvFOvly pZWGCncGNvWJMz2ZVBox4+iV4//IU16jyeQW75p1lnZk2P0u7kNxkGrrrsGz/Q== 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=1770842644; 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=NevUR4YUHj3sJ7sNzzP6cN8IxDiD2BRe67TvGYjGhC4=; b=GYWaPe2oeHQ1T2ZK10wvWzFoXRMU02dcw111o4WxCdCqD8n3pvRgY+MNta1IcJltBM9IGr seB0xdpElypDkRWKGxSzbiy6brQWkuZ3wh0Hqu3uAW45DLovUgBhMWP/p4ACa0xpJNctcg uEhD7e1p2eiKFnjsSnh6quRjP6wddMnW1crANKNY6zNkYOiqd/K179c7kuPUMv+0LFvCJg mwGa6xM0Qqz+ph7dU92HhypQq5i2SJMKV71y1UVRa7yGYMpixglHQkQrI6jD1ARXPsDNYi LXvaRiSxh9BGLSFZbAhD2ad7/2tNNAWH34wF4S/mPqR2mYvV4iHihxtjgUIubQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fB9Q73sHpz14R4 for ; Wed, 11 Feb 2026 20:43:59 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 181e6 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 11 Feb 2026 20:43:59 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Olivier Certner Subject: git: 8aac1e9b028e - main - hwpstate_amd(4): Register dump: Fine-grained error reporting 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: olce X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 8aac1e9b028e5bd2e249023687effd98739358a6 Auto-Submitted: auto-generated Date: Wed, 11 Feb 2026 20:43:59 +0000 Message-Id: <698cea0f.181e6.21bb59f2@gitrepo.freebsd.org> The branch main has been updated by olce: URL: https://cgit.FreeBSD.org/src/commit/?id=8aac1e9b028e5bd2e249023687effd98739358a6 commit 8aac1e9b028e5bd2e249023687effd98739358a6 Author: Olivier Certner AuthorDate: 2026-01-29 16:23:54 +0000 Commit: Olivier Certner CommitDate: 2026-02-11 20:42:15 +0000 hwpstate_amd(4): Register dump: Fine-grained error reporting If some of the registers cannot be read, report that but continue trying reading the others. This also has the side benefit of simplifying code. While here, use sbuf_new_for_sysctl(), and rename 'res' and 'ret', which are to contain error values, to 'error'. While here, remove the test on getting the per-cpu structure, as if it is not present we would have already crashed on device attach. While here, fix format for printing the CPU ID. PR: 292615 Reviewed by: aokblast (older version) Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D55005 --- sys/x86/cpufreq/hwpstate_amd.c | 112 ++++++++++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 40 deletions(-) diff --git a/sys/x86/cpufreq/hwpstate_amd.c b/sys/x86/cpufreq/hwpstate_amd.c index e8499f2e3c88..ac0d9c9e49b0 100644 --- a/sys/x86/cpufreq/hwpstate_amd.c +++ b/sys/x86/cpufreq/hwpstate_amd.c @@ -86,6 +86,7 @@ #define MSR_AMD_CPPC_STATUS 0xc00102b4 #define MSR_AMD_CPPC_CAPS_1_NAME "CPPC_CAPABILITY_1" +#define MSR_AMD_CPPC_ENABLE_NAME "CPPC_ENABLE" #define MSR_AMD_CPPC_REQUEST_NAME "CPPC_REQUEST" #define MSR_AMD_PWR_ACC 0xc001007a @@ -216,11 +217,26 @@ check_cppc_enabled(const struct hwpstate_softc *const sc, const char *const func ": %s() called but PSTATE_CPPC not set", func)); } +/* + * Internal errors conveyed by code executing on another CPU. + */ +#define HWP_ERROR_CPPC_ENABLE (1 << 0) +#define HWP_ERROR_CPPC_CAPS (1 << 1) +#define HWP_ERROR_CPPC_REQUEST (1 << 2) +#define HWP_ERROR_CPPC_REQUEST_WRITE (1 << 3) + +static inline bool +hwp_has_error(u_int res, u_int err) +{ + return ((res & err) != 0); +} + struct get_cppc_regs_data { uint64_t enable; uint64_t caps; uint64_t req; - int res; + /* HWP_ERROR_CPPC_* except HWP_ERROR_*_WRITE */ + u_int res; }; static void @@ -245,6 +261,14 @@ print_cppc_caps_1(struct sbuf *const sb, const uint64_t caps) AMD_CPPC_CAPS_1_LOWEST_PERF_BITS, caps); } +#define MSR_NOT_READ_MSG "Fault on read" + +static void +print_cppc_no_caps_1(struct sbuf *const sb) +{ + sbuf_printf(sb, MSR_AMD_CPPC_CAPS_1_NAME ": " MSR_NOT_READ_MSG "\n"); +} + static void print_cppc_request(struct sbuf *const sb, const uint64_t request) { @@ -260,66 +284,74 @@ print_cppc_request(struct sbuf *const sb, const uint64_t request) AMD_CPPC_REQUEST_MAX_PERF_BITS, request); } +static void +print_cppc_no_request(struct sbuf *const sb) +{ + sbuf_printf(sb, MSR_AMD_CPPC_REQUEST_NAME ": " MSR_NOT_READ_MSG "\n"); +} + static void get_cppc_regs_cb(void *args) { struct get_cppc_regs_data *data = args; + int error; + + data->res = 0; + + error = rdmsr_safe(MSR_AMD_CPPC_ENABLE, &data->enable); + if (error != 0) + data->res |= HWP_ERROR_CPPC_ENABLE; + + error = rdmsr_safe(MSR_AMD_CPPC_CAPS_1, &data->caps); + if (error != 0) + data->res |= HWP_ERROR_CPPC_CAPS; - data->res = rdmsr_safe(MSR_AMD_CPPC_ENABLE, &data->enable); - if (data->res == 0) - data->res = rdmsr_safe(MSR_AMD_CPPC_CAPS_1, &data->caps); - if (data->res == 0) - data->res = rdmsr_safe(MSR_AMD_CPPC_REQUEST, &data->req); + error = rdmsr_safe(MSR_AMD_CPPC_REQUEST, &data->req); + if (error != 0) + data->res |= HWP_ERROR_CPPC_REQUEST; } static int sysctl_cppc_dump_handler(SYSCTL_HANDLER_ARGS) { - device_t dev; - struct pcpu *pc; + const struct hwpstate_softc *const sc = arg1; + const device_t dev = sc->dev; + const u_int cpuid = cpu_get_pcpu(dev)->pc_cpuid; struct sbuf *sb; - struct hwpstate_softc *sc; - struct get_cppc_regs_data request; - uint64_t data; - int ret; + struct sbuf sbs; + struct get_cppc_regs_data data; + int error; - sc = (struct hwpstate_softc *)arg1; /* Sysctl knob does not exist if PSTATE_CPPC is not set. */ check_cppc_enabled(sc, __func__); - dev = sc->dev; - pc = cpu_get_pcpu(dev); - if (pc == NULL) - return (ENXIO); - - sb = sbuf_new(NULL, NULL, 1024, SBUF_FIXEDLEN | SBUF_INCLUDENUL); - sbuf_putc(sb, '\n'); - smp_rendezvous_cpu(pc->pc_cpuid, smp_no_rendezvous_barrier, - get_cppc_regs_cb, smp_no_rendezvous_barrier, &request); - ret = request.res; - if (ret) - goto out; + sb = sbuf_new_for_sysctl(&sbs, NULL, 0, req); - data = request.enable; - sbuf_printf(sb, "CPU%d: HWP %sabled\n", pc->pc_cpuid, - ((data & 1) ? "En" : "Dis")); - if (data == 0) - goto out; + smp_rendezvous_cpu(cpuid, smp_no_rendezvous_barrier, get_cppc_regs_cb, + smp_no_rendezvous_barrier, &data); - data = request.caps; - print_cppc_caps_1(sb, data); + if (hwp_has_error(data.res, HWP_ERROR_CPPC_ENABLE)) + sbuf_printf(sb, "CPU%u: " MSR_AMD_CPPC_ENABLE_NAME ": " + MSR_NOT_READ_MSG "\n", cpuid); + else + sbuf_printf(sb, "CPU%u: HWP %sabled (" MSR_AMD_CPPC_REQUEST_NAME + ": %#" PRIx64 ")\n", cpuid, data.enable & 1 ? "En" : "Dis", + data.enable); - data = request.req; - print_cppc_request(sb, data); + if (hwp_has_error(data.res, HWP_ERROR_CPPC_CAPS)) + print_cppc_no_caps_1(sb); + else + print_cppc_caps_1(sb, data.caps); -out: - if (ret == 0) - ret = sbuf_finish(sb); - if (ret == 0) - ret = SYSCTL_OUT(req, sbuf_data(sb), sbuf_len(sb)); + if (hwp_has_error(data.res, HWP_ERROR_CPPC_REQUEST)) + print_cppc_no_request(sb); + else + print_cppc_request(sb, data.req); + + error = sbuf_finish(sb); sbuf_delete(sb); - return (ret); + return (error); } static void