From nobody Wed Feb 11 20:44:02 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 4fB9QC0WfXz6SBSX for ; Wed, 11 Feb 2026 20:44:03 +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 4fB9QB6nscz3PRm for ; Wed, 11 Feb 2026 20:44:02 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1770842643; 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=JSABBLlD2l12OFm4Xc0jTihP/1XhcULAA9pkbHIsA7E=; b=vrutWvVjD0coB5VVqPLhEAEJJls6ucaTyD6HKGD0b45ARGjPPL7LX3/rcItTd+CABbkSpf UQp6m1zPU/Io1/RweLBk38YkOpJc9f+b89JAypFD7ldGzKAP+6I5pS9kZiAAA7qcvLrCVj MLp8sg9CkUgXl1EowkHebn1RxgNgcPlxGTwKQ6nbWpJ35jzggjSiKmxsV6clkH8tc5EO3C PbqmDlWe4upR//y2mj3qmlfrAWBBpFeHTdsinR9afO4l+k7tcFIPdsmyux96yGsdura6iU YNAHtuiSBGMK+JYJxIZxOoh2ABZa6s5iS3BJBsL8w6XVaMwDtI7t8OT+zJ3VZQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1770842643; a=rsa-sha256; cv=none; b=fVO5rO+/cYZ/aW9OUrwkunSih5CNj9pDMkvm6LnZXwls41q9N0THbtNoXoQQyvl1ANpqFw 90bw4THjnjL1n/R7+tcEFw2g91X6ERELGZUj5QQW7ULg4h2UNN5L09wyzw8kYVpkDEovix 0d3HwiBaa+NL09PQQZX7PLohyF5OfiS1e4/+LD5HBRJGwXOEfaIewjlqFk+aMVW0nOr3xu UH65D1nJCUC5mnIdrvUXKuWdMOL/LXMy3WhEz5pQb91CWXuL8XjSneiLM4+9oCrMIgHxS3 Nm4OConSbSJHIl57CHpqHINZHt56d46Lm44Mrlo/IMzRZwEsp0EiUwybtP+DWg== 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=1770842643; 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=JSABBLlD2l12OFm4Xc0jTihP/1XhcULAA9pkbHIsA7E=; b=uNrOYwdOu3rMT99Pj2OYPZPCpCdXPPm6DbioaMd5Bx9oaeaCavw99kFgRDH7TONKtti/Uo ckBkrJlNRQuqInbXzgyExeV6ey/fGx7lctUs93Vsv1mmz1P/sNBzePXwHF95wPxB3bK16i mwit69qWHt89jADwvc+FezUxoPjvFOEa4XziNK45xKOhGA59mwI4+AJL1u8W2YsChFPVzR 9xu4RTfIMtxX2R1sbj8w8OSvR7zXhtusmMp95Czq/WAGSZT02jZ5nAdAeea9UE3tR6g5pq ABtA6smsoMejtpj7oY327k+my+/J5jwJLXLa8bTyAj7C2YpFCuGk4sDJeoucgg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fB9QB61L5z153N for ; Wed, 11 Feb 2026 20:44:02 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 46042 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 11 Feb 2026 20:44:02 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Olivier Certner Subject: git: 6db204dc2de0 - main - hwpstate_amd(4): Factor out setting the CPPC_REQUEST register 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: olce X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 6db204dc2de0f52e9a6842af29f026a8a2951e3c Auto-Submitted: auto-generated Date: Wed, 11 Feb 2026 20:44:02 +0000 Message-Id: <698cea12.46042.6e964248@gitrepo.freebsd.org> The branch main has been updated by olce: URL: https://cgit.FreeBSD.org/src/commit/?id=6db204dc2de0f52e9a6842af29f026a8a2951e3c commit 6db204dc2de0f52e9a6842af29f026a8a2951e3c Author: Olivier Certner AuthorDate: 2026-01-27 11:30:48 +0000 Commit: Olivier Certner CommitDate: 2026-02-11 20:43:20 +0000 hwpstate_amd(4): Factor out setting the CPPC_REQUEST register In preparation for creating other knobs to tweak values in this register beyond just the EPP (Efficiency/Performance Preference). While here, add a herald comment before the softc structure indicating how we achieve atomicity when modifying the softc. Reviewed by: aokblast Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D55008 --- sys/x86/cpufreq/hwpstate_amd.c | 94 +++++++++++++++++++++++++++++++----------- 1 file changed, 69 insertions(+), 25 deletions(-) diff --git a/sys/x86/cpufreq/hwpstate_amd.c b/sys/x86/cpufreq/hwpstate_amd.c index 049699ea02d4..18d420dc7747 100644 --- a/sys/x86/cpufreq/hwpstate_amd.c +++ b/sys/x86/cpufreq/hwpstate_amd.c @@ -147,6 +147,12 @@ enum hwpstate_flags { PSTATE_CPPC = 1, }; +/* + * Atomicity is achieved by only modifying a given softc on its associated CPU + * and with interrupts disabled. + * + * XXX - Only the CPPC support complies at the moment. + */ struct hwpstate_softc { device_t dev; u_int flags; @@ -354,35 +360,78 @@ sysctl_cppc_dump_handler(SYSCTL_HANDLER_ARGS) return (error); } + +struct set_cppc_request_cb { + struct hwpstate_softc *sc; + uint64_t request; + uint64_t mask; + int res; /* 0 or HWP_ERROR_CPPC_REQUEST_WRITE */ +}; + static void -set_epp(device_t hwp_device, u_int val) +set_cppc_request_cb(void *args) { - struct hwpstate_softc *sc; + struct set_cppc_request_cb *const data = args; + uint64_t *const req = &data->sc->cppc.request; + int error; - sc = device_get_softc(hwp_device); - if (BITS_VALUE(AMD_CPPC_REQUEST_EPP_BITS, sc->cppc.request) == val) - return; - SET_BITS_VALUE(sc->cppc.request, AMD_CPPC_REQUEST_EPP_BITS, val); - x86_msr_op(MSR_AMD_CPPC_REQUEST, - MSR_OP_RENDEZVOUS_ONE | MSR_OP_WRITE | - MSR_OP_CPUID(cpu_get_pcpu(hwp_device)->pc_cpuid), - sc->cppc.request, NULL); + *req &= ~data->mask; + *req |= data->request & data->mask; + + error = wrmsr_safe(MSR_AMD_CPPC_REQUEST, *req); + data->res = error == 0 ? 0 : HWP_ERROR_CPPC_REQUEST_WRITE; +} + +static inline void +set_cppc_request_send_one(struct set_cppc_request_cb *const data, device_t dev) +{ + const u_int cpuid = cpu_get_pcpu(dev)->pc_cpuid; + + data->sc = device_get_softc(dev); + smp_rendezvous_cpu(cpuid, smp_no_rendezvous_barrier, + set_cppc_request_cb, smp_no_rendezvous_barrier, data); +} + +static int +set_cppc_request(device_t hwp_dev, uint64_t request, uint64_t mask) +{ + struct set_cppc_request_cb data = { + .request = request, + .mask = mask, + /* 'sc' filled by set_cppc_request_send_one(). */ + }; + int error; + + if (hwpstate_pkg_ctrl_enable) { + const devclass_t dc = devclass_find(HWP_AMD_CLASSNAME); + const int units = devclass_get_maxunit(dc); + + error = 0; + for (int i = 0; i < units; ++i) { + const device_t dev = devclass_get_device(dc, i); + + set_cppc_request_send_one(&data, dev); + if (data.res != 0) + /* Note the error, but continue. */ + error = EFAULT; + } + } else { + set_cppc_request_send_one(&data, hwp_dev); + error = data.res != 0 ? EFAULT : 0; + } + + return (error); } static int sysctl_epp_handler(SYSCTL_HANDLER_ARGS) { - device_t dev, hwp_dev; - devclass_t dc; - struct hwpstate_softc *sc; const u_int max_epp = BITS_VALUE(AMD_CPPC_REQUEST_EPP_BITS, (uint64_t)-1); + const device_t dev = oidp->oid_arg1; + struct hwpstate_softc *const sc = device_get_softc(dev); u_int val; int error = 0; - int cpu; - - dev = oidp->oid_arg1; - sc = device_get_softc(dev); /* Sysctl knob does not exist if PSTATE_CPPC is not set. */ check_cppc_enabled(sc, __func__); @@ -398,14 +447,9 @@ sysctl_epp_handler(SYSCTL_HANDLER_ARGS) } val = (val * max_epp) / 100; - if (hwpstate_pkg_ctrl_enable) { - dc = devclass_find(HWP_AMD_CLASSNAME); - CPU_FOREACH(cpu) { - hwp_dev = devclass_get_device(dc, cpu); - set_epp(hwp_dev, val); - } - } else - set_epp(dev, val); + error = set_cppc_request(dev, + BITS_WITH_VALUE(AMD_CPPC_REQUEST_EPP_BITS, val), + BITS_WITH_VALUE(AMD_CPPC_REQUEST_EPP_BITS, -1)); end: return (error);