From: "Limonciello, Mario" <mario.limonciello@amd.com>
To: Huang Rui <ray.huang@amd.com>,
"Rafael J . Wysocki" <rafael.j.wysocki@intel.com>,
Viresh Kumar <viresh.kumar@linaro.org>,
Shuah Khan <skhan@linuxfoundation.org>,
Borislav Petkov <bp@suse.de>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>,
Giovanni Gherdovich <ggherdovich@suse.cz>,
linux-pm@vger.kernel.org
Cc: Deepak Sharma <deepak.sharma@amd.com>,
Alex Deucher <alexander.deucher@amd.com>,
Steven Noonan <steven@valvesoftware.com>,
Nathan Fontenot <nathan.fontenot@amd.com>,
Jinzhou Su <Jinzhou.Su@amd.com>,
Xiaojian Du <Xiaojian.Du@amd.com>,
linux-kernel@vger.kernel.org, x86@kernel.org
Subject: Re: [PATCH v3 06/21] cpufreq: amd: introduce a new amd pstate driver to support future processors
Date: Tue, 2 Nov 2021 13:52:44 -0500 [thread overview]
Message-ID: <a975268f-ed3a-f100-5bf6-cce74b6df63f@amd.com> (raw)
In-Reply-To: <20211029130241.1984459-7-ray.huang@amd.com>
On 10/29/2021 08:02, Huang Rui wrote:
> amd-pstate is the AMD CPU performance scaling driver that introduces a
> new CPU frequency control mechanism on AMD Zen based CPU series in Linux
> kernel. The new mechanism is based on Collaborative processor
> performance control (CPPC) which is finer grain frequency management
> than legacy ACPI hardware P-States. Current AMD CPU platforms are using
> the ACPI P-states driver to manage CPU frequency and clocks with
> switching only in 3 P-states. AMD P-States is to replace the ACPI
> P-states controls, allows a flexible, low-latency interface for the
> Linux kernel to directly communicate the performance hints to hardware.
>
> "amd-pstate" leverages the Linux kernel governors such as *schedutil*,
> *ondemand*, etc. to manage the performance hints which are provided by CPPC
> hardware functionality. The first version for amd-pstate is to support one
> of the Zen3 processors, and we will support more in future after we verify
> the hardware and SBIOS functionalities.
>
> There are two types of hardware implementations for amd-pstate: one is full
> MSR support and another is shared memory support. It can use
> X86_FEATURE_AMD_CPPC_EXT feature flag to distinguish the different types.
>
> Using the new AMD P-States method + kernel governors (*schedutil*,
> *ondemand*, ...) to manage the frequency update is the most appropriate
> bridge between AMD Zen based hardware processor and Linux kernel, the
> processor is able to ajust to the most efficiency frequency according to
> the kernel scheduler loading.
>
> Performance Per Watt (PPW) Caculation:
>
> The PPW caculation is referred by below paper:
> https://software.intel.com/content/dam/develop/external/us/en/documents/performance-per-what-paper.pdf
>
> Below formula is referred from below spec to measure the PPW:
>
> (F / t) / P = F * t / (t * E) = F / E,
>
> "F" is the number of frames per second.
> "P" is power measurd in watts.
> "E" is energy measured in joules.
>
> We use the RAPL interface with "perf" tool to get the energy data of the
> package power.
>
> The data comparsions between amd-pstate and acpi-freq module are tested on
> AMD Cezanne processor:
>
> 1) TBench CPU benchmark:
>
> +---------------------------------------------------------------------+
> | |
> | TBench (Performance Per Watt) |
> | Higher is better |
> +-------------------+------------------------+------------------------+
> | | Performance Per Watt | Performance Per Watt |
> | Kernel Module | (Schedutil) | (Ondemand) |
> | | Unit: MB / (s * J) | Unit: MB / (s * J) |
> +-------------------+------------------------+------------------------+
> | | | |
> | acpi-cpufreq | 3.022 | 2.969 |
> | | | |
> +-------------------+------------------------+------------------------+
> | | | |
> | amd-pstate | 3.131 | 3.284 |
> | | | |
> +-------------------+------------------------+------------------------+
>
> 2) Gitsource CPU benchmark:
>
> +---------------------------------------------------------------------+
> | |
> | Gitsource (Performance Per Watt) |
> | Higher is better |
> +-------------------+------------------------+------------------------+
> | | Performance Per Watt | Performance Per Watt |
> | Kernel Module | (Schedutil) | (Ondemand) |
> | | Unit: 1 / (s * J) | Unit: 1 / (s * J) |
> +-------------------+------------------------+------------------------+
> | | | |
> | acpi-cpufreq | 3.42172E-07 | 2.74508E-07 |
> | | | |
> +-------------------+------------------------+------------------------+
> | | | |
> | amd-pstate | 4.09141E-07 | 3.47610E-07 |
> | | | |
> +-------------------+------------------------+------------------------+
>
> 3) Speedometer 2.0 CPU benchmark:
>
> +---------------------------------------------------------------------+
> | |
> | Speedometer 2.0 (Performance Per Watt) |
> | Higher is better |
> +-------------------+------------------------+------------------------+
> | | Performance Per Watt | Performance Per Watt |
> | Kernel Module | (Schedutil) | (Ondemand) |
> | | Unit: 1 / (s * J) | Unit: 1 / (s * J) |
> +-------------------+------------------------+------------------------+
> | | | |
> | acpi-cpufreq | 0.116111767 | 0.110321664 |
> | | | |
> +-------------------+------------------------+------------------------+
> | | | |
> | amd-pstate | 0.115825281 | 0.122024299 |
> | | | |
> +-------------------+------------------------+------------------------+
>
> According to above average data, we can see this solution has shown better
> performance per watt scaling on mobile CPU benchmarks in most of cases.
>
> Signed-off-by: Huang Rui <ray.huang@amd.com>
> ---
> drivers/cpufreq/Kconfig.x86 | 17 ++
> drivers/cpufreq/Makefile | 1 +
> drivers/cpufreq/amd-pstate.c | 413 +++++++++++++++++++++++++++++++++++
> 3 files changed, 431 insertions(+)
> create mode 100644 drivers/cpufreq/amd-pstate.c
>
> diff --git a/drivers/cpufreq/Kconfig.x86 b/drivers/cpufreq/Kconfig.x86
> index 92701a18bdd9..2e798b2c0bdb 100644
> --- a/drivers/cpufreq/Kconfig.x86
> +++ b/drivers/cpufreq/Kconfig.x86
> @@ -34,6 +34,23 @@ config X86_PCC_CPUFREQ
>
> If in doubt, say N.
>
> +config X86_AMD_PSTATE
> + bool "AMD Processor P-State driver"
> + depends on X86
> + select ACPI_PROCESSOR if ACPI
> + select ACPI_CPPC_LIB if X86_64 && ACPI && SCHED_MC_PRIO
> + select CPU_FREQ_GOV_SCHEDUTIL if SMP
> + help
> + This driver adds a CPUFreq driver which utilizes a fine grain
> + processor performance freqency control range instead of legacy
> + performance levels. This driver supports the AMD processors with
> + _CPC object in the SBIOS.
> +
> + For details, take a look at:
> + <file:Documentation/admin-guide/pm/amd-pstate.rst>.
> +
> + If in doubt, say N.
> +
> config X86_ACPI_CPUFREQ
> tristate "ACPI Processor P-States driver"
> depends on ACPI_PROCESSOR
> diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
> index 48ee5859030c..c8d307010922 100644
> --- a/drivers/cpufreq/Makefile
> +++ b/drivers/cpufreq/Makefile
> @@ -25,6 +25,7 @@ obj-$(CONFIG_CPUFREQ_DT_PLATDEV) += cpufreq-dt-platdev.o
> # speedstep-* is preferred over p4-clockmod.
>
> obj-$(CONFIG_X86_ACPI_CPUFREQ) += acpi-cpufreq.o
> +obj-$(CONFIG_X86_AMD_PSTATE) += amd-pstate.o
> obj-$(CONFIG_X86_POWERNOW_K8) += powernow-k8.o
> obj-$(CONFIG_X86_PCC_CPUFREQ) += pcc-cpufreq.o
> obj-$(CONFIG_X86_POWERNOW_K6) += powernow-k6.o
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> new file mode 100644
> index 000000000000..a400861c7fdc
> --- /dev/null
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -0,0 +1,413 @@
> +/*
> + * amd-pstate.c - AMD Processor P-state Frequency Driver
> + *
> + * Copyright (C) 2021 Advanced Micro Devices, Inc. All Rights Reserved.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along with
> + * this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
> + *
> + * Author: Huang Rui <ray.huang@amd.com>
> + */
> +
> +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> +
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/init.h>
> +#include <linux/smp.h>
> +#include <linux/sched.h>
> +#include <linux/cpufreq.h>
> +#include <linux/compiler.h>
> +#include <linux/dmi.h>
> +#include <linux/slab.h>
> +#include <linux/acpi.h>
> +#include <linux/io.h>
> +#include <linux/delay.h>
> +#include <linux/uaccess.h>
> +#include <linux/static_call.h>
> +
> +#include <acpi/processor.h>
> +#include <acpi/cppc_acpi.h>
> +
> +#include <asm/msr.h>
> +#include <asm/processor.h>
> +#include <asm/cpufeature.h>
> +#include <asm/cpu_device_id.h>
> +
> +#define AMD_PSTATE_TRANSITION_LATENCY 0x20000
> +#define AMD_PSTATE_TRANSITION_DELAY 500
> +
> +static struct cpufreq_driver amd_pstate_driver;
> +
> +struct amd_cpudata {
> + int cpu;
> +
> + struct freq_qos_request req[2];
> +
> + u64 cppc_req_cached;
> +
> + u32 highest_perf;
> + u32 nominal_perf;
> + u32 lowest_nonlinear_perf;
> + u32 lowest_perf;
> +
> + u32 max_freq;
> + u32 min_freq;
> + u32 nominal_freq;
> + u32 lowest_nonlinear_freq;
> +};
> +
> +static inline int pstate_enable(bool enable)
> +{
> + return wrmsrl_safe(MSR_AMD_CPPC_ENABLE, enable ? 1 : 0);
> +}
> +
> +DEFINE_STATIC_CALL(amd_pstate_enable, pstate_enable);
> +
> +static inline int amd_pstate_enable(bool enable)
> +{
> + return static_call(amd_pstate_enable)(enable);
> +}
> +
> +static int pstate_init_perf(struct amd_cpudata *cpudata)
> +{
> + u64 cap1;
> +
> + int ret = rdmsrl_safe_on_cpu(cpudata->cpu, MSR_AMD_CPPC_CAP1,
> + &cap1);
> + if (ret)
> + return ret;
> +
> + /*
> + * TODO: Introduce AMD specific power feature.
> + *
> + * CPPC entry doesn't indicate the highest performance in some ASICs.
> + */
> + WRITE_ONCE(cpudata->highest_perf, amd_get_highest_perf());
Wouldn't it be better to default to CAP1_HIGHEST_PERF(cap1) and quirk
the ones that don't work instead?
> +
> + WRITE_ONCE(cpudata->nominal_perf, CAP1_NOMINAL_PERF(cap1));
> + WRITE_ONCE(cpudata->lowest_nonlinear_perf, CAP1_LOWNONLIN_PERF(cap1));
> + WRITE_ONCE(cpudata->lowest_perf, CAP1_LOWEST_PERF(cap1));
> +
> + return 0;
> +}
> +
> +DEFINE_STATIC_CALL(amd_pstate_init_perf, pstate_init_perf);
> +
> +static inline int amd_pstate_init_perf(struct amd_cpudata *cpudata)
> +{
> + return static_call(amd_pstate_init_perf)(cpudata);
> +}
> +
> +static void pstate_update_perf(struct amd_cpudata *cpudata, u32 min_perf,
> + u32 des_perf, u32 max_perf, bool fast_switch)
> +{
> + if (fast_switch)
> + wrmsrl(MSR_AMD_CPPC_REQ, READ_ONCE(cpudata->cppc_req_cached));
> + else
> + wrmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ,
> + READ_ONCE(cpudata->cppc_req_cached));
> +}
> +
> +DEFINE_STATIC_CALL(amd_pstate_update_perf, pstate_update_perf);
> +
> +static inline void amd_pstate_update_perf(struct amd_cpudata *cpudata,
> + u32 min_perf, u32 des_perf,
> + u32 max_perf, bool fast_switch)
> +{
> + static_call(amd_pstate_update_perf)(cpudata, min_perf, des_perf,
> + max_perf, fast_switch);
> +}
> +
> +static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
> + u32 des_perf, u32 max_perf, bool fast_switch)
> +{
> + u64 prev = READ_ONCE(cpudata->cppc_req_cached);
> + u64 value = prev;
> +
> + value &= ~REQ_MIN_PERF(~0L);
> + value |= REQ_MIN_PERF(min_perf);
> +
> + value &= ~REQ_DES_PERF(~0L);
> + value |= REQ_DES_PERF(des_perf);
> +
> + value &= ~REQ_MAX_PERF(~0L);
> + value |= REQ_MAX_PERF(max_perf);
> +
> + if (value == prev)
> + return;
> +
> + WRITE_ONCE(cpudata->cppc_req_cached, value);
> +
> + amd_pstate_update_perf(cpudata, min_perf, des_perf,
> + max_perf, fast_switch);
> +}
> +
> +static int amd_pstate_verify(struct cpufreq_policy_data *policy)
> +{
> + cpufreq_verify_within_cpu_limits(policy);
> +
> + return 0;
> +}
> +
> +static int amd_pstate_target(struct cpufreq_policy *policy,
> + unsigned int target_freq,
> + unsigned int relation)
> +{
> + struct cpufreq_freqs freqs;
> + struct amd_cpudata *cpudata = policy->driver_data;
> + unsigned long amd_max_perf, amd_min_perf, amd_des_perf,
> + amd_cap_perf;
> +
> + if (!cpudata->max_freq)
> + return -ENODEV;
> +
> + amd_cap_perf = READ_ONCE(cpudata->highest_perf);
> + amd_min_perf = READ_ONCE(cpudata->lowest_nonlinear_perf);
> + amd_max_perf = amd_cap_perf;
> +
> + freqs.old = policy->cur;
> + freqs.new = target_freq;
> +
> + amd_des_perf = DIV_ROUND_CLOSEST(target_freq * amd_cap_perf,
> + cpudata->max_freq);
> +
> + cpufreq_freq_transition_begin(policy, &freqs);
> + amd_pstate_update(cpudata, amd_min_perf, amd_des_perf,
> + amd_max_perf, false);
> + cpufreq_freq_transition_end(policy, &freqs, false);
> +
> + return 0;
> +}
> +
> +static int amd_get_min_freq(struct amd_cpudata *cpudata)
> +{
> + struct cppc_perf_caps cppc_perf;
> +
> + int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
> + if (ret)
> + return ret;
> +
> + /* Switch to khz */
> + return cppc_perf.lowest_freq * 1000;
> +}
> +
> +static int amd_get_max_freq(struct amd_cpudata *cpudata)
> +{
> + struct cppc_perf_caps cppc_perf;
> + u32 max_perf, max_freq, nominal_freq, nominal_perf;
> + u64 boost_ratio;
> +
> + int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
> + if (ret)
> + return ret;
> +
> + nominal_freq = cppc_perf.nominal_freq;
> + nominal_perf = READ_ONCE(cpudata->nominal_perf);
> + max_perf = READ_ONCE(cpudata->highest_perf);
> +
> + boost_ratio = div_u64(max_perf << SCHED_CAPACITY_SHIFT,
> + nominal_perf);
> +
> + max_freq = nominal_freq * boost_ratio >> SCHED_CAPACITY_SHIFT;
> +
> + /* Switch to khz */
> + return max_freq * 1000;
> +}
> +
> +static int amd_get_nominal_freq(struct amd_cpudata *cpudata)
> +{
> + struct cppc_perf_caps cppc_perf;
> + u32 nominal_freq;
> +
> + int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
> + if (ret)
> + return ret;
> +
> + nominal_freq = cppc_perf.nominal_freq;
> +
> + /* Switch to khz */
> + return nominal_freq * 1000;
> +}
> +
> +static int amd_get_lowest_nonlinear_freq(struct amd_cpudata *cpudata)
> +{
> + struct cppc_perf_caps cppc_perf;
> + u32 lowest_nonlinear_freq, lowest_nonlinear_perf,
> + nominal_freq, nominal_perf;
> + u64 lowest_nonlinear_ratio;
> +
> + int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
> + if (ret)
> + return ret;
> +
> + nominal_freq = cppc_perf.nominal_freq;
> + nominal_perf = READ_ONCE(cpudata->nominal_perf);
> +
> + lowest_nonlinear_perf = cppc_perf.lowest_nonlinear_perf;
> +
> + lowest_nonlinear_ratio = div_u64(lowest_nonlinear_perf <<
> + SCHED_CAPACITY_SHIFT, nominal_perf);
> +
> + lowest_nonlinear_freq = nominal_freq * lowest_nonlinear_ratio >> SCHED_CAPACITY_SHIFT;
> +
> + /* Switch to khz */
> + return lowest_nonlinear_freq * 1000;
> +}
> +
> +static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
> +{
> + int min_freq, max_freq, nominal_freq, lowest_nonlinear_freq, ret;
> + unsigned int cpu = policy->cpu;
> + struct device *dev;
> + struct amd_cpudata *cpudata;
> +
> + dev = get_cpu_device(policy->cpu);
> + if (!dev)
> + return -ENODEV;
> +
> + cpudata = kzalloc(sizeof(*cpudata), GFP_KERNEL);
> + if (!cpudata)
> + return -ENOMEM;
> +
> + cpudata->cpu = cpu;
> +
> + ret = amd_pstate_init_perf(cpudata);
> + if (ret)
> + goto free_cpudata1;
> +
> + min_freq = amd_get_min_freq(cpudata);
> + max_freq = amd_get_max_freq(cpudata);
> + nominal_freq = amd_get_nominal_freq(cpudata);
> + lowest_nonlinear_freq = amd_get_lowest_nonlinear_freq(cpudata);
> +
> + if (min_freq < 0 || max_freq < 0 || min_freq > max_freq) {
> + dev_err(dev, "min_freq(%d) or max_freq(%d) value is incorrect\n",
> + min_freq, max_freq);
> + ret = -EINVAL;
> + goto free_cpudata1;
> + }
> +
> + policy->cpuinfo.transition_latency = AMD_PSTATE_TRANSITION_LATENCY;
> + policy->transition_delay_us = AMD_PSTATE_TRANSITION_DELAY;
> +
> + policy->min = min_freq;
> + policy->max = max_freq;
> +
> + policy->cpuinfo.min_freq = min_freq;
> + policy->cpuinfo.max_freq = max_freq;
> +
> + /* It will be updated by governor */
> + policy->cur = policy->cpuinfo.min_freq;
> +
> + ret = freq_qos_add_request(&policy->constraints, &cpudata->req[0],
> + FREQ_QOS_MIN, policy->cpuinfo.min_freq);
> + if (ret < 0) {
> + dev_err(dev, "Failed to add min-freq constraint (%d)\n", ret);
> + goto free_cpudata1;
> + }
> +
> + ret = freq_qos_add_request(&policy->constraints, &cpudata->req[1],
> + FREQ_QOS_MAX, policy->cpuinfo.max_freq);
> + if (ret < 0) {
> + dev_err(dev, "Failed to add max-freq constraint (%d)\n", ret);
> + goto free_cpudata2;
> + }
> +
> + /* Initial processor data capability frequencies */
> + cpudata->max_freq = max_freq;
> + cpudata->min_freq = min_freq;
> + cpudata->nominal_freq = nominal_freq;
> + cpudata->lowest_nonlinear_freq = lowest_nonlinear_freq;
> +
> + policy->driver_data = cpudata;
> +
> + return 0;
> +
> + freq_qos_remove_request(&cpudata->req[1]);
> +free_cpudata2:
> + freq_qos_remove_request(&cpudata->req[0]);
> +free_cpudata1:
> + kfree(cpudata);
> + return ret;
> +}
> +
> +static int amd_pstate_cpu_exit(struct cpufreq_policy *policy)
> +{
> + struct amd_cpudata *cpudata;
> +
> + cpudata = policy->driver_data;
> +
> + freq_qos_remove_request(&cpudata->req[1]);
> + freq_qos_remove_request(&cpudata->req[0]);
> + kfree(cpudata);
> +
> + return 0;
> +}
> +
> +static struct cpufreq_driver amd_pstate_driver = {
> + .flags = CPUFREQ_CONST_LOOPS | CPUFREQ_NEED_UPDATE_LIMITS,
> + .verify = amd_pstate_verify,
> + .target = amd_pstate_target,
> + .init = amd_pstate_cpu_init,
> + .exit = amd_pstate_cpu_exit,
> + .name = "amd-pstate",
> +};
> +
> +static int __init amd_pstate_init(void)
> +{
> + int ret;
> +
> + if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
> + return -ENODEV;
> +
> + if (!acpi_cpc_valid()) {
> + pr_debug("%s, the _CPC object is not present in SBIOS\n",
> + __func__);
> + return -ENODEV;
> + }
> +
> + /* don't keep reloading if cpufreq_driver exists */
> + if (cpufreq_get_current_driver())
> + return -EEXIST;
> +
> + /* capability check */
> + if (!boot_cpu_has(X86_FEATURE_AMD_CPPC)) {
> + pr_debug("%s, AMD CPPC MSR based functionality is not supported\n",
> + __func__);
> + return -ENODEV;
> + }
> +
> + /* enable amd pstate feature */
> + ret = amd_pstate_enable(true);
> + if (ret) {
> + pr_err("%s, failed to enable amd-pstate with return %d\n",
> + __func__, ret);
> + return ret;
> + }
> +
> + ret = cpufreq_register_driver(&amd_pstate_driver);
> + if (ret) {
> + pr_err("%s, return %d\n", __func__, ret);
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +device_initcall(amd_pstate_init);
> +
> +MODULE_AUTHOR("Huang Rui <ray.huang@amd.com>");
> +MODULE_DESCRIPTION("AMD Processor P-state Frequency Driver");
> +MODULE_LICENSE("GPL");
>
next prev parent reply other threads:[~2021-11-02 18:52 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-29 13:02 [PATCH v3 00/21] cpufreq: introduce a new AMD CPU frequency control mechanism Huang Rui
2021-10-29 13:02 ` [PATCH v3 01/21] x86/cpufreatures: add AMD Collaborative Processor Performance Control feature flag Huang Rui
2021-10-29 14:39 ` Borislav Petkov
2021-11-06 10:28 ` Borislav Petkov
2021-11-09 3:08 ` Huang Rui
2021-10-29 13:02 ` [PATCH v3 02/21] x86/msr: add AMD CPPC MSR definitions Huang Rui
2021-10-29 13:02 ` [PATCH v3 03/21] ACPI: CPPC: implement support for SystemIO registers Huang Rui
2021-10-29 13:02 ` [PATCH v3 04/21] ACPI: CPPC: Check present CPUs for determining _CPC is valid Huang Rui
2021-10-29 13:02 ` [PATCH v3 05/21] ACPI: CPPC: add cppc enable register function Huang Rui
2021-10-29 14:15 ` Limonciello, Mario
2021-11-01 9:20 ` Huang Rui
2021-10-29 13:02 ` [PATCH v3 06/21] cpufreq: amd: introduce a new amd pstate driver to support future processors Huang Rui
2021-11-02 18:52 ` Limonciello, Mario [this message]
2021-11-02 19:38 ` Nathan Fontenot
2021-11-03 7:01 ` Huang Rui
2021-11-04 15:10 ` Nathan Fontenot
2021-11-05 4:20 ` Huang Rui
2021-10-29 13:02 ` [PATCH v3 07/21] cpufreq: amd: add fast switch function for amd-pstate Huang Rui
2021-10-29 14:16 ` Limonciello, Mario
2021-11-02 19:56 ` Nathan Fontenot
2021-10-29 13:02 ` [PATCH v3 08/21] cpufreq: amd: add acpi cppc function as the backend for legacy processors Huang Rui
2021-10-29 14:20 ` Limonciello, Mario
2021-11-01 9:02 ` Huang Rui
2021-11-02 18:46 ` Nathan Fontenot
2021-11-03 12:00 ` Huang Rui
2021-10-29 13:02 ` [PATCH v3 09/21] cpufreq: amd: add trace for amd-pstate module Huang Rui
2021-10-29 13:02 ` [PATCH v3 10/21] cpufreq: amd: add boost mode support for amd-pstate Huang Rui
2021-10-29 13:02 ` [PATCH v3 11/21] cpufreq: amd: add amd-pstate frequencies attributes Huang Rui
2021-11-05 18:59 ` Nathan Fontenot
2021-11-10 12:28 ` Huang Rui
2021-10-29 13:02 ` [PATCH v3 12/21] cpufreq: amd: add amd-pstate performance attributes Huang Rui
2021-11-05 18:50 ` Nathan Fontenot
2021-10-29 13:02 ` [PATCH v3 13/21] cpupower: add AMD P-state capability flag Huang Rui
2021-10-29 13:02 ` [PATCH v3 14/21] cpupower: add the function to check amd-pstate enabled Huang Rui
2021-10-29 13:02 ` [PATCH v3 15/21] cpupower: initial AMD P-state capability Huang Rui
2021-10-29 13:02 ` [PATCH v3 16/21] cpupower: add the function to get the sysfs value from specific table Huang Rui
2021-10-29 13:02 ` [PATCH v3 17/21] cpupower: add amd-pstate sysfs definition and access helper Huang Rui
2021-10-29 14:10 ` Limonciello, Mario
2021-11-01 9:14 ` Huang Rui
2021-10-29 13:02 ` [PATCH v3 18/21] cpupower: enable boost state support for amd-pstate module Huang Rui
2021-11-02 20:11 ` Nathan Fontenot
2021-11-03 7:04 ` Huang Rui
2021-10-29 13:02 ` [PATCH v3 19/21] cpupower: move print_speed function into misc helper Huang Rui
2021-10-29 13:02 ` [PATCH v3 20/21] cpupower: print amd-pstate information on cpupower Huang Rui
2021-10-29 13:02 ` [PATCH v3 21/21] Documentation: amd-pstate: add amd-pstate driver introduction Huang Rui
2021-11-04 16:40 ` [PATCH v3 00/21] cpufreq: introduce a new AMD CPU frequency control mechanism Giovanni Gherdovich
2021-11-05 16:09 ` Huang Rui
2021-11-06 8:58 ` Matt McDonald
2021-11-08 9:20 ` Huang Rui
2021-11-12 11:21 ` Du, Xiaojian
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a975268f-ed3a-f100-5bf6-cce74b6df63f@amd.com \
--to=mario.limonciello@amd.com \
--cc=Jinzhou.Su@amd.com \
--cc=Xiaojian.Du@amd.com \
--cc=alexander.deucher@amd.com \
--cc=bp@suse.de \
--cc=deepak.sharma@amd.com \
--cc=ggherdovich@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=nathan.fontenot@amd.com \
--cc=peterz@infradead.org \
--cc=rafael.j.wysocki@intel.com \
--cc=ray.huang@amd.com \
--cc=skhan@linuxfoundation.org \
--cc=steven@valvesoftware.com \
--cc=viresh.kumar@linaro.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).