From owner-svn-src-all@freebsd.org Sat Feb 1 20:12:03 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 80CC522A954; Sat, 1 Feb 2020 20:12:03 +0000 (UTC) (envelope-from cem@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) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4894xb2vQ3z416y; Sat, 1 Feb 2020 20:12:03 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 5EB18469A; Sat, 1 Feb 2020 20:12:03 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 011KC3or037246; Sat, 1 Feb 2020 20:12:03 GMT (envelope-from cem@FreeBSD.org) Received: (from cem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 011KC3QF037245; Sat, 1 Feb 2020 20:12:03 GMT (envelope-from cem@FreeBSD.org) Message-Id: <202002012012.011KC3QF037245@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cem set sender to cem@FreeBSD.org using -f From: Conrad Meyer Date: Sat, 1 Feb 2020 20:12:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r357381 - head/sys/x86/cpufreq X-SVN-Group: head X-SVN-Commit-Author: cem X-SVN-Commit-Paths: head/sys/x86/cpufreq X-SVN-Commit-Revision: 357381 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 01 Feb 2020 20:12:03 -0000 Author: cem Date: Sat Feb 1 20:12:02 2020 New Revision: 357381 URL: https://svnweb.freebsd.org/changeset/base/357381 Log: hwpstate_intel(4): Save admin-set EPP/EPB and restore after suspend Modified: head/sys/x86/cpufreq/hwpstate_intel.c Modified: head/sys/x86/cpufreq/hwpstate_intel.c ============================================================================== --- head/sys/x86/cpufreq/hwpstate_intel.c Sat Feb 1 20:11:25 2020 (r357380) +++ head/sys/x86/cpufreq/hwpstate_intel.c Sat Feb 1 20:12:02 2020 (r357381) @@ -90,8 +90,10 @@ struct hwp_softc { bool hwp_pkg_ctrl; bool hwp_pkg_ctrl_en; bool hwp_perf_bias; + bool hwp_perf_bias_cached; - uint64_t req; /* Cached copy of last request */ + uint64_t req; /* Cached copy of HWP_REQUEST */ + uint64_t hwp_energy_perf_bias; /* Cache PERF_BIAS */ uint8_t high; uint8_t guaranteed; @@ -248,7 +250,7 @@ sysctl_epp_select(SYSCTL_HANDLER_ARGS) struct hwp_softc *sc; device_t dev; struct pcpu *pc; - uint64_t requested; + uint64_t epb; uint32_t val; int ret; @@ -266,13 +268,7 @@ sysctl_epp_select(SYSCTL_HANDLER_ARGS) thread_unlock(curthread); if (sc->hwp_pref_ctrl) { - if (sc->hwp_pkg_ctrl_en) - ret = rdmsr_safe(MSR_IA32_HWP_REQUEST_PKG, &requested); - else - ret = rdmsr_safe(MSR_IA32_HWP_REQUEST, &requested); - if (ret) - goto out; - val = (requested & IA32_HWP_REQUEST_ENERGY_PERFORMANCE_PREFERENCE) >> 24; + val = (sc->req & IA32_HWP_REQUEST_ENERGY_PERFORMANCE_PREFERENCE) >> 24; val = raw_to_percent(val); } else { /* @@ -280,10 +276,15 @@ sysctl_epp_select(SYSCTL_HANDLER_ARGS) * uses MSR_IA32_ENERGY_PERF_BIAS instead (Intel SDM ยง14.4.4). * This register is per-core (but not HT). */ - ret = rdmsr_safe(MSR_IA32_ENERGY_PERF_BIAS, &requested); - if (ret) - goto out; - val = requested & IA32_ENERGY_PERF_BIAS_POLICY_HINT_MASK; + if (!sc->hwp_perf_bias_cached) { + ret = rdmsr_safe(MSR_IA32_ENERGY_PERF_BIAS, &epb); + if (ret) + goto out; + sc->hwp_energy_perf_bias = epb; + sc->hwp_perf_bias_cached = true; + } + val = sc->hwp_energy_perf_bias & + IA32_ENERGY_PERF_BIAS_POLICY_HINT_MASK; val = raw_to_percent_perf_bias(val); } @@ -301,17 +302,23 @@ sysctl_epp_select(SYSCTL_HANDLER_ARGS) if (sc->hwp_pref_ctrl) { val = percent_to_raw(val); - requested &= ~IA32_HWP_REQUEST_ENERGY_PERFORMANCE_PREFERENCE; - requested |= val << 24u; + sc->req = + ((sc->req & ~IA32_HWP_REQUEST_ENERGY_PERFORMANCE_PREFERENCE) + | (val << 24u)); if (sc->hwp_pkg_ctrl_en) - ret = wrmsr_safe(MSR_IA32_HWP_REQUEST_PKG, requested); + ret = wrmsr_safe(MSR_IA32_HWP_REQUEST_PKG, sc->req); else - ret = wrmsr_safe(MSR_IA32_HWP_REQUEST, requested); + ret = wrmsr_safe(MSR_IA32_HWP_REQUEST, sc->req); } else { - requested = percent_to_raw_perf_bias(val); - MPASS((requested & ~IA32_ENERGY_PERF_BIAS_POLICY_HINT_MASK) == 0); - ret = wrmsr_safe(MSR_IA32_ENERGY_PERF_BIAS, requested); + val = percent_to_raw_perf_bias(val); + MPASS((val & ~IA32_ENERGY_PERF_BIAS_POLICY_HINT_MASK) == 0); + + sc->hwp_energy_perf_bias = + ((sc->hwp_energy_perf_bias & + ~IA32_ENERGY_PERF_BIAS_POLICY_HINT_MASK) | val); + ret = wrmsr_safe(MSR_IA32_ENERGY_PERF_BIAS, + sc->hwp_energy_perf_bias); } out: @@ -604,10 +611,21 @@ intel_hwpstate_resume(device_t dev) } if (sc->hwp_pkg_ctrl_en) { ret = wrmsr_safe(MSR_IA32_HWP_REQUEST_PKG, sc->req); - if (ret) + if (ret) { device_printf(dev, "Failed to set autonomous HWP for package after " "suspend\n"); + goto out; + } + } + if (!sc->hwp_pref_ctrl && sc->hwp_perf_bias_cached) { + ret = wrmsr_safe(MSR_IA32_ENERGY_PERF_BIAS, + sc->hwp_energy_perf_bias); + if (ret) { + device_printf(dev, + "Failed to set energy perf bias for cpu%d after " + "suspend\n", pc->pc_cpuid); + } } out: