aboutsummaryrefslogtreecommitdiff
path: root/SOURCES/0001-amd-pstate.patch
diff options
context:
space:
mode:
Diffstat (limited to 'SOURCES/0001-amd-pstate.patch')
-rw-r--r--SOURCES/0001-amd-pstate.patch337
1 files changed, 121 insertions, 216 deletions
diff --git a/SOURCES/0001-amd-pstate.patch b/SOURCES/0001-amd-pstate.patch
index 8b81bc4..d4986ef 100644
--- a/SOURCES/0001-amd-pstate.patch
+++ b/SOURCES/0001-amd-pstate.patch
@@ -1,7 +1,7 @@
-From 4ca68a16f48ef388742a25c6d6643bf996e8d1d5 Mon Sep 17 00:00:00 2001
+From 06c02d91fcfeb0fde264f03f0e364161b11a678d Mon Sep 17 00:00:00 2001
From: Peter Jung <admin@ptr1337.dev>
-Date: Fri, 5 Jul 2024 10:31:29 +0200
-Subject: [PATCH 02/10] amd-pstate
+Date: Sat, 3 Aug 2024 09:32:45 +0200
+Subject: [PATCH 01/12] amd-pstate
Signed-off-by: Peter Jung <admin@ptr1337.dev>
---
@@ -11,10 +11,10 @@ Signed-off-by: Peter Jung <admin@ptr1337.dev>
arch/x86/kernel/cpu/scattered.c | 1 +
drivers/cpufreq/Kconfig.x86 | 1 +
drivers/cpufreq/acpi-cpufreq.c | 3 +-
- drivers/cpufreq/amd-pstate.c | 356 ++++++++++++++------
- drivers/cpufreq/amd-pstate.h | 16 +-
+ drivers/cpufreq/amd-pstate.c | 307 ++++++++++++++------
+ drivers/cpufreq/amd-pstate.h | 2 +
drivers/cpufreq/cpufreq.c | 11 +-
- 9 files changed, 290 insertions(+), 119 deletions(-)
+ 9 files changed, 251 insertions(+), 95 deletions(-)
diff --git a/Documentation/admin-guide/pm/amd-pstate.rst b/Documentation/admin-guide/pm/amd-pstate.rst
index 1e0d101b020a..d0324d44f548 100644
@@ -65,10 +65,10 @@ index 3c7434329661..6c128d463a14 100644
/*
* BUG word(s)
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
-index e72c2b872957..8738a7b3917d 100644
+index e022e6eb766c..384739d592af 100644
--- a/arch/x86/include/asm/msr-index.h
+++ b/arch/x86/include/asm/msr-index.h
-@@ -782,6 +782,8 @@
+@@ -781,6 +781,8 @@
#define MSR_K7_HWCR_IRPERF_EN BIT_ULL(MSR_K7_HWCR_IRPERF_EN_BIT)
#define MSR_K7_FID_VID_CTL 0xc0010041
#define MSR_K7_FID_VID_STATUS 0xc0010042
@@ -123,7 +123,7 @@ index 4ac3a35dcd98..f4f8587c4ea0 100644
return 0;
}
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
-index 6af175e6c08a..80eaa58f1405 100644
+index a092b13ffbc2..804fab4ebb26 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -51,6 +51,7 @@
@@ -168,7 +168,7 @@ index 6af175e6c08a..80eaa58f1405 100644
if (!cppc_req_cached) {
epp = rdmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ,
&cppc_req_cached);
-@@ -252,7 +244,7 @@ static int amd_pstate_set_epp(struct amd_cpudata *cpudata, u32 epp)
+@@ -272,7 +264,7 @@ static int amd_pstate_set_epp(struct amd_cpudata *cpudata, u32 epp)
int ret;
struct cppc_perf_ctrls perf_ctrls;
@@ -177,7 +177,7 @@ index 6af175e6c08a..80eaa58f1405 100644
u64 value = READ_ONCE(cpudata->cppc_req_cached);
value &= ~GENMASK_ULL(31, 24);
-@@ -281,10 +273,8 @@ static int amd_pstate_set_energy_pref_index(struct amd_cpudata *cpudata,
+@@ -304,10 +296,8 @@ static int amd_pstate_set_energy_pref_index(struct amd_cpudata *cpudata,
int epp = -EINVAL;
int ret;
@@ -190,7 +190,7 @@ index 6af175e6c08a..80eaa58f1405 100644
if (epp == -EINVAL)
epp = epp_values[pref_index];
-@@ -521,7 +511,10 @@ static inline bool amd_pstate_sample(struct amd_cpudata *cpudata)
+@@ -524,7 +514,10 @@ static inline bool amd_pstate_sample(struct amd_cpudata *cpudata)
static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
u32 des_perf, u32 max_perf, bool fast_switch, int gov_flags)
{
@@ -201,7 +201,7 @@ index 6af175e6c08a..80eaa58f1405 100644
u64 value = prev;
min_perf = clamp_t(unsigned long, min_perf, cpudata->min_limit_perf,
-@@ -530,6 +523,9 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
+@@ -533,6 +526,9 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
cpudata->max_limit_perf);
des_perf = clamp_t(unsigned long, des_perf, min_perf, max_perf);
@@ -211,7 +211,7 @@ index 6af175e6c08a..80eaa58f1405 100644
if ((cppc_state == AMD_PSTATE_GUIDED) && (gov_flags & CPUFREQ_GOV_DYNAMIC_SWITCHING)) {
min_perf = des_perf;
des_perf = 0;
-@@ -541,6 +537,10 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
+@@ -544,6 +540,10 @@ static void amd_pstate_update(struct amd_cpudata *cpudata, u32 min_perf,
value &= ~AMD_CPPC_DES_PERF(~0L);
value |= AMD_CPPC_DES_PERF(des_perf);
@@ -222,7 +222,7 @@ index 6af175e6c08a..80eaa58f1405 100644
value &= ~AMD_CPPC_MAX_PERF(~0L);
value |= AMD_CPPC_MAX_PERF(max_perf);
-@@ -651,10 +651,9 @@ static void amd_pstate_adjust_perf(unsigned int cpu,
+@@ -654,10 +654,9 @@ static void amd_pstate_adjust_perf(unsigned int cpu,
unsigned long capacity)
{
unsigned long max_perf, min_perf, des_perf,
@@ -234,7 +234,7 @@ index 6af175e6c08a..80eaa58f1405 100644
if (policy->min != cpudata->min_limit_freq || policy->max != cpudata->max_limit_freq)
amd_pstate_update_min_max_limit(policy);
-@@ -662,7 +661,6 @@ static void amd_pstate_adjust_perf(unsigned int cpu,
+@@ -665,7 +664,6 @@ static void amd_pstate_adjust_perf(unsigned int cpu,
cap_perf = READ_ONCE(cpudata->highest_perf);
lowest_nonlinear_perf = READ_ONCE(cpudata->lowest_nonlinear_perf);
@@ -242,7 +242,7 @@ index 6af175e6c08a..80eaa58f1405 100644
des_perf = cap_perf;
if (target_perf < capacity)
-@@ -680,32 +678,57 @@ static void amd_pstate_adjust_perf(unsigned int cpu,
+@@ -683,51 +681,111 @@ static void amd_pstate_adjust_perf(unsigned int cpu,
max_perf = min_perf;
des_perf = clamp_t(unsigned long, des_perf, min_perf, max_perf);
@@ -254,35 +254,25 @@ index 6af175e6c08a..80eaa58f1405 100644
cpufreq_cpu_put(policy);
}
--static int amd_get_min_freq(struct amd_cpudata *cpudata)
+-static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
+static int amd_pstate_cpu_boost_update(struct cpufreq_policy *policy, bool on)
{
-- return READ_ONCE(cpudata->min_freq);
--}
-+ struct amd_cpudata *cpudata = policy->driver_data;
+ struct amd_cpudata *cpudata = policy->driver_data;
+ struct cppc_perf_ctrls perf_ctrls;
+ u32 highest_perf, nominal_perf, nominal_freq, max_freq;
-+ int ret;
+ int ret;
--static int amd_get_max_freq(struct amd_cpudata *cpudata)
--{
-- return READ_ONCE(cpudata->max_freq);
--}
+- if (!cpudata->boost_supported) {
+- pr_err("Boost mode is not supported by this processor or SBIOS\n");
+- return -EINVAL;
+ highest_perf = READ_ONCE(cpudata->highest_perf);
+ nominal_perf = READ_ONCE(cpudata->nominal_perf);
+ nominal_freq = READ_ONCE(cpudata->nominal_freq);
+ max_freq = READ_ONCE(cpudata->max_freq);
-
--static int amd_get_nominal_freq(struct amd_cpudata *cpudata)
--{
-- return READ_ONCE(cpudata->nominal_freq);
--}
++
+ if (boot_cpu_has(X86_FEATURE_CPPC)) {
+ u64 value = READ_ONCE(cpudata->cppc_req_cached);
-
--static int amd_get_lowest_nonlinear_freq(struct amd_cpudata *cpudata)
--{
-- return READ_ONCE(cpudata->lowest_nonlinear_freq);
++
+ value &= ~GENMASK_ULL(7, 0);
+ value |= on ? highest_perf : nominal_perf;
+ WRITE_ONCE(cpudata->cppc_req_cached, value);
@@ -297,32 +287,46 @@ index 6af175e6c08a..80eaa58f1405 100644
+ cpudata->cpu, ret);
+ return ret;
+ }
-+ }
-+
+ }
+
+- if (state)
+- policy->cpuinfo.max_freq = cpudata->max_freq;
+- else
+- policy->cpuinfo.max_freq = cpudata->nominal_freq * 1000;
+ if (on)
+ policy->cpuinfo.max_freq = max_freq;
+ else if (policy->cpuinfo.max_freq > nominal_freq * 1000)
+ policy->cpuinfo.max_freq = nominal_freq * 1000;
-+
-+ policy->max = policy->cpuinfo.max_freq;
-+
+
+ policy->max = policy->cpuinfo.max_freq;
+
+- ret = freq_qos_update_request(&cpudata->req[1],
+- policy->cpuinfo.max_freq);
+- if (ret < 0)
+- return ret;
+ if (cppc_state == AMD_PSTATE_PASSIVE) {
+ ret = freq_qos_update_request(&cpudata->req[1], policy->cpuinfo.max_freq);
+ if (ret < 0)
+ pr_debug("Failed to update freq constraint: CPU%d\n", cpudata->cpu);
+ }
-+
+
+- return 0;
+ return ret < 0 ? ret : 0;
}
- static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
-@@ -715,36 +738,51 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
+-static void amd_pstate_boost_init(struct amd_cpudata *cpudata)
++static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
+ {
+- u32 highest_perf, nominal_perf;
++ struct amd_cpudata *cpudata = policy->driver_data;
++ int ret;
- if (!cpudata->boost_supported) {
- pr_err("Boost mode is not supported by this processor or SBIOS\n");
-- return -EINVAL;
+- highest_perf = READ_ONCE(cpudata->highest_perf);
+- nominal_perf = READ_ONCE(cpudata->nominal_perf);
++ if (!cpudata->boost_supported) {
++ pr_err("Boost mode is not supported by this processor or SBIOS\n");
+ return -EOPNOTSUPP;
- }
++ }
+ mutex_lock(&amd_pstate_driver_lock);
+ ret = amd_pstate_cpu_boost_update(policy, state);
+ WRITE_ONCE(cpudata->boost_state, !ret ? state : false);
@@ -330,23 +334,17 @@ index 6af175e6c08a..80eaa58f1405 100644
+ refresh_frequency_limits(policy);
+ mutex_unlock(&amd_pstate_driver_lock);
-- if (state)
-- policy->cpuinfo.max_freq = cpudata->max_freq;
-- else
-- policy->cpuinfo.max_freq = cpudata->nominal_freq * 1000;
+- if (highest_perf <= nominal_perf)
+- return;
+ return ret;
+}
-- policy->max = policy->cpuinfo.max_freq;
+- cpudata->boost_supported = true;
+static int amd_pstate_init_boost_support(struct amd_cpudata *cpudata)
+{
+ u64 boost_val;
+ int ret = -1;
-
-- ret = freq_qos_update_request(&cpudata->req[1],
-- policy->cpuinfo.max_freq);
-- if (ret < 0)
-- return ret;
++
+ /*
+ * If platform has no CPB support or disable it, initialize current driver
+ * boost_enabled state to be false, it is not an error for cpufreq core to handle.
@@ -356,40 +354,29 @@ index 6af175e6c08a..80eaa58f1405 100644
+ ret = 0;
+ goto exit_err;
+ }
-
-- return 0;
--}
++
+ /* at least one CPU supports CPB, even if others fail later on to set up */
-+ current_pstate_driver->boost_enabled = true;
-
--static void amd_pstate_boost_init(struct amd_cpudata *cpudata)
--{
-- u32 highest_perf, nominal_perf;
+ current_pstate_driver->boost_enabled = true;
++
+ ret = rdmsrl_on_cpu(cpudata->cpu, MSR_K7_HWCR, &boost_val);
+ if (ret) {
+ pr_err_once("failed to read initial CPU boost state!\n");
+ ret = -EIO;
+ goto exit_err;
+ }
-
-- highest_perf = READ_ONCE(cpudata->highest_perf);
-- nominal_perf = READ_ONCE(cpudata->nominal_perf);
++
+ if (!(boost_val & MSR_K7_HWCR_CPB_DIS))
+ cpudata->boost_supported = true;
-
-- if (highest_perf <= nominal_perf)
-- return;
++
+ return 0;
-
-- cpudata->boost_supported = true;
-- current_pstate_driver->boost_enabled = true;
++
+exit_err:
+ cpudata->boost_supported = false;
+ return ret;
}
static void amd_perf_ctl_reset(unsigned int cpu)
-@@ -773,7 +811,7 @@ static int amd_pstate_get_highest_perf(int cpu, u32 *highest_perf)
+@@ -756,7 +814,7 @@ static int amd_pstate_get_highest_perf(int cpu, u32 *highest_perf)
{
int ret;
@@ -398,58 +385,22 @@ index 6af175e6c08a..80eaa58f1405 100644
u64 cap1;
ret = rdmsrl_safe_on_cpu(cpu, MSR_AMD_CPPC_CAP1, &cap1);
-@@ -860,7 +898,41 @@ static void amd_pstate_update_limits(unsigned int cpu)
- mutex_unlock(&amd_pstate_driver_lock);
- }
+@@ -852,8 +910,12 @@ static u32 amd_pstate_get_transition_delay_us(unsigned int cpu)
+ u32 transition_delay_ns;
--/**
-+/*
-+ * Get pstate transition delay time from ACPI tables that firmware set
-+ * instead of using hardcode value directly.
-+ */
-+static u32 amd_pstate_get_transition_delay_us(unsigned int cpu)
-+{
-+ u32 transition_delay_ns;
-+
-+ transition_delay_ns = cppc_get_transition_latency(cpu);
+ transition_delay_ns = cppc_get_transition_latency(cpu);
+- if (transition_delay_ns == CPUFREQ_ETERNAL)
+- return AMD_PSTATE_TRANSITION_DELAY;
+ if (transition_delay_ns == CPUFREQ_ETERNAL) {
+ if (cpu_feature_enabled(X86_FEATURE_FAST_CPPC))
+ return AMD_PSTATE_FAST_CPPC_TRANSITION_DELAY;
+ else
+ return AMD_PSTATE_TRANSITION_DELAY;
+ }
-+
-+ return transition_delay_ns / NSEC_PER_USEC;
-+}
-+
-+/*
-+ * Get pstate transition latency value from ACPI tables that firmware
-+ * set instead of using hardcode value directly.
-+ */
-+static u32 amd_pstate_get_transition_latency(unsigned int cpu)
-+{
-+ u32 transition_latency;
-+
-+ transition_latency = cppc_get_transition_latency(cpu);
-+ if (transition_latency == CPUFREQ_ETERNAL)
-+ return AMD_PSTATE_TRANSITION_LATENCY;
-+
-+ return transition_latency;
-+}
-+
-+/*
- * amd_pstate_init_freq: Initialize the max_freq, min_freq,
- * nominal_freq and lowest_nonlinear_freq for
- * the @cpudata object.
-@@ -881,7 +953,6 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)
- u32 boost_ratio, lowest_nonlinear_ratio;
- struct cppc_perf_caps cppc_perf;
--
- ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);
- if (ret)
- return ret;
-@@ -912,12 +983,30 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)
+ return transition_delay_ns / NSEC_PER_USEC;
+ }
+@@ -924,12 +986,30 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)
WRITE_ONCE(cpudata->nominal_freq, nominal_freq);
WRITE_ONCE(cpudata->max_freq, max_freq);
@@ -476,40 +427,35 @@ index 6af175e6c08a..80eaa58f1405 100644
static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
{
-- int min_freq, max_freq, nominal_freq, lowest_nonlinear_freq, ret;
+- int min_freq, max_freq, nominal_freq, ret;
+ int min_freq, max_freq, ret;
struct device *dev;
struct amd_cpudata *cpudata;
-@@ -946,20 +1035,15 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
+@@ -958,18 +1038,12 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
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;
+ ret = amd_pstate_init_boost_support(cpudata);
+ if (ret)
- goto free_cpudata1;
-- }
-
-- policy->cpuinfo.transition_latency = AMD_PSTATE_TRANSITION_LATENCY;
-- policy->transition_delay_us = AMD_PSTATE_TRANSITION_DELAY;
-+ min_freq = READ_ONCE(cpudata->min_freq);
-+ max_freq = READ_ONCE(cpudata->max_freq);
++ goto free_cpudata1;
+
-+ policy->cpuinfo.transition_latency = amd_pstate_get_transition_latency(policy->cpu);
-+ policy->transition_delay_us = amd_pstate_get_transition_delay_us(policy->cpu);
+ min_freq = READ_ONCE(cpudata->min_freq);
+ max_freq = READ_ONCE(cpudata->max_freq);
+- nominal_freq = READ_ONCE(cpudata->nominal_freq);
+-
+- if (min_freq <= 0 || max_freq <= 0 ||
+- nominal_freq <= 0 || min_freq > max_freq) {
+- dev_err(dev,
+- "min_freq(%d) or max_freq(%d) or nominal_freq (%d) value is incorrect, check _CPC in ACPI tables\n",
+- min_freq, max_freq, nominal_freq);
+- ret = -EINVAL;
+- goto free_cpudata1;
+- }
- policy->min = min_freq;
- policy->max = max_freq;
-@@ -967,10 +1051,12 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
+ policy->cpuinfo.transition_latency = amd_pstate_get_transition_latency(policy->cpu);
+ policy->transition_delay_us = amd_pstate_get_transition_delay_us(policy->cpu);
+@@ -980,10 +1054,12 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
policy->cpuinfo.min_freq = min_freq;
policy->cpuinfo.max_freq = max_freq;
@@ -523,7 +469,7 @@ index 6af175e6c08a..80eaa58f1405 100644
policy->fast_switch_possible = true;
ret = freq_qos_add_request(&policy->constraints, &cpudata->req[0],
-@@ -992,7 +1078,6 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
+@@ -1005,7 +1081,6 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy)
policy->driver_data = cpudata;
@@ -531,25 +477,7 @@ index 6af175e6c08a..80eaa58f1405 100644
if (!current_pstate_driver->adjust_perf)
current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;
-@@ -1052,7 +1137,7 @@ static ssize_t show_amd_pstate_max_freq(struct cpufreq_policy *policy,
- int max_freq;
- struct amd_cpudata *cpudata = policy->driver_data;
-
-- max_freq = amd_get_max_freq(cpudata);
-+ max_freq = READ_ONCE(cpudata->max_freq);
- if (max_freq < 0)
- return max_freq;
-
-@@ -1065,7 +1150,7 @@ static ssize_t show_amd_pstate_lowest_nonlinear_freq(struct cpufreq_policy *poli
- int freq;
- struct amd_cpudata *cpudata = policy->driver_data;
-
-- freq = amd_get_lowest_nonlinear_freq(cpudata);
-+ freq = READ_ONCE(cpudata->lowest_nonlinear_freq);
- if (freq < 0)
- return freq;
-
-@@ -1203,7 +1288,7 @@ static int amd_pstate_change_mode_without_dvr_change(int mode)
+@@ -1216,7 +1291,7 @@ static int amd_pstate_change_mode_without_dvr_change(int mode)
cppc_state = mode;
@@ -558,38 +486,38 @@ index 6af175e6c08a..80eaa58f1405 100644
return 0;
for_each_present_cpu(cpu) {
-@@ -1376,7 +1461,7 @@ static bool amd_pstate_acpi_pm_profile_undefined(void)
+@@ -1389,7 +1464,7 @@ static bool amd_pstate_acpi_pm_profile_undefined(void)
static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
{
-- int min_freq, max_freq, nominal_freq, lowest_nonlinear_freq, ret;
+- int min_freq, max_freq, nominal_freq, ret;
+ int min_freq, max_freq, ret;
struct amd_cpudata *cpudata;
struct device *dev;
u64 value;
-@@ -1407,16 +1492,12 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
+@@ -1420,17 +1495,12 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
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;
+ ret = amd_pstate_init_boost_support(cpudata);
+ if (ret)
- goto free_cpudata1;
-- }
++ goto free_cpudata1;
+
-+ min_freq = READ_ONCE(cpudata->min_freq);
-+ max_freq = READ_ONCE(cpudata->max_freq);
+ min_freq = READ_ONCE(cpudata->min_freq);
+ max_freq = READ_ONCE(cpudata->max_freq);
+- nominal_freq = READ_ONCE(cpudata->nominal_freq);
+- if (min_freq <= 0 || max_freq <= 0 ||
+- nominal_freq <= 0 || min_freq > max_freq) {
+- dev_err(dev,
+- "min_freq(%d) or max_freq(%d) or nominal_freq(%d) value is incorrect, check _CPC in ACPI tables\n",
+- min_freq, max_freq, nominal_freq);
+- ret = -EINVAL;
+- goto free_cpudata1;
+- }
policy->cpuinfo.min_freq = min_freq;
policy->cpuinfo.max_freq = max_freq;
-@@ -1425,11 +1506,13 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
+@@ -1439,11 +1509,13 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
policy->driver_data = cpudata;
@@ -604,7 +532,7 @@ index 6af175e6c08a..80eaa58f1405 100644
/*
* Set the policy to provide a valid fallback value in case
* the default cpufreq governor is neither powersave nor performance.
-@@ -1440,7 +1523,7 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
+@@ -1454,7 +1526,7 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
else
policy->policy = CPUFREQ_POLICY_POWERSAVE;
@@ -613,7 +541,7 @@ index 6af175e6c08a..80eaa58f1405 100644
ret = rdmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ, &value);
if (ret)
return ret;
-@@ -1451,7 +1534,6 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
+@@ -1465,7 +1537,6 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
return ret;
WRITE_ONCE(cpudata->cppc_cap1_cached, value);
}
@@ -621,7 +549,7 @@ index 6af175e6c08a..80eaa58f1405 100644
return 0;
-@@ -1530,7 +1612,7 @@ static void amd_pstate_epp_update_limit(struct cpufreq_policy *policy)
+@@ -1544,7 +1615,7 @@ static void amd_pstate_epp_update_limit(struct cpufreq_policy *policy)
epp = 0;
/* Set initial EPP value */
@@ -630,7 +558,7 @@ index 6af175e6c08a..80eaa58f1405 100644
value &= ~GENMASK_ULL(31, 24);
value |= (u64)epp << 24;
}
-@@ -1553,6 +1635,12 @@ static int amd_pstate_epp_set_policy(struct cpufreq_policy *policy)
+@@ -1567,6 +1638,12 @@ static int amd_pstate_epp_set_policy(struct cpufreq_policy *policy)
amd_pstate_epp_update_limit(policy);
@@ -643,7 +571,7 @@ index 6af175e6c08a..80eaa58f1405 100644
return 0;
}
-@@ -1569,7 +1657,7 @@ static void amd_pstate_epp_reenable(struct amd_cpudata *cpudata)
+@@ -1583,7 +1660,7 @@ static void amd_pstate_epp_reenable(struct amd_cpudata *cpudata)
value = READ_ONCE(cpudata->cppc_req_cached);
max_perf = READ_ONCE(cpudata->highest_perf);
@@ -652,7 +580,7 @@ index 6af175e6c08a..80eaa58f1405 100644
wrmsrl_on_cpu(cpudata->cpu, MSR_AMD_CPPC_REQ, value);
} else {
perf_ctrls.max_perf = max_perf;
-@@ -1603,7 +1691,7 @@ static void amd_pstate_epp_offline(struct cpufreq_policy *policy)
+@@ -1617,7 +1694,7 @@ static void amd_pstate_epp_offline(struct cpufreq_policy *policy)
value = READ_ONCE(cpudata->cppc_req_cached);
mutex_lock(&amd_pstate_limits_lock);
@@ -661,7 +589,7 @@ index 6af175e6c08a..80eaa58f1405 100644
cpudata->epp_policy = CPUFREQ_POLICY_UNKNOWN;
/* Set max perf same as min perf */
-@@ -1707,6 +1795,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = {
+@@ -1721,6 +1798,7 @@ static struct cpufreq_driver amd_pstate_epp_driver = {
.suspend = amd_pstate_epp_suspend,
.resume = amd_pstate_epp_resume,
.update_limits = amd_pstate_update_limits,
@@ -669,7 +597,7 @@ index 6af175e6c08a..80eaa58f1405 100644
.name = "amd-pstate-epp",
.attr = amd_pstate_epp_attr,
};
-@@ -1730,6 +1819,46 @@ static int __init amd_pstate_set_driver(int mode_idx)
+@@ -1744,6 +1822,46 @@ static int __init amd_pstate_set_driver(int mode_idx)
return -EINVAL;
}
@@ -716,7 +644,7 @@ index 6af175e6c08a..80eaa58f1405 100644
static int __init amd_pstate_init(void)
{
struct device *dev_root;
-@@ -1738,6 +1867,11 @@ static int __init amd_pstate_init(void)
+@@ -1752,6 +1870,11 @@ static int __init amd_pstate_init(void)
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
return -ENODEV;
@@ -728,7 +656,7 @@ index 6af175e6c08a..80eaa58f1405 100644
if (!acpi_cpc_valid()) {
pr_warn_once("the _CPC object is not present in SBIOS or ACPI disabled\n");
return -ENODEV;
-@@ -1752,35 +1886,43 @@ static int __init amd_pstate_init(void)
+@@ -1766,35 +1889,43 @@ static int __init amd_pstate_init(void)
/* check if this machine need CPPC quirks */
dmi_check_system(amd_pstate_quirks_table);
@@ -782,7 +710,7 @@ index 6af175e6c08a..80eaa58f1405 100644
pr_debug("AMD CPPC MSR based functionality is supported\n");
if (cppc_state != AMD_PSTATE_ACTIVE)
current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;
-@@ -1794,13 +1936,15 @@ static int __init amd_pstate_init(void)
+@@ -1808,13 +1939,15 @@ static int __init amd_pstate_init(void)
/* enable amd pstate feature */
ret = amd_pstate_enable(true);
if (ret) {
@@ -800,7 +728,7 @@ index 6af175e6c08a..80eaa58f1405 100644
dev_root = bus_get_dev_root(&cpu_subsys);
if (dev_root) {
-@@ -1816,6 +1960,8 @@ static int __init amd_pstate_init(void)
+@@ -1830,6 +1963,8 @@ static int __init amd_pstate_init(void)
global_attr_free:
cpufreq_unregister_driver(current_pstate_driver);
@@ -810,33 +738,10 @@ index 6af175e6c08a..80eaa58f1405 100644
}
device_initcall(amd_pstate_init);
diff --git a/drivers/cpufreq/amd-pstate.h b/drivers/cpufreq/amd-pstate.h
-index bc341f35908d..cc8bb2bc325a 100644
+index e6a28e7f4dbf..cc8bb2bc325a 100644
--- a/drivers/cpufreq/amd-pstate.h
+++ b/drivers/cpufreq/amd-pstate.h
-@@ -42,13 +42,17 @@ struct amd_aperf_mperf {
- * @lowest_perf: the absolute lowest performance level of the processor
- * @prefcore_ranking: the preferred core ranking, the higher value indicates a higher
- * priority.
-- * @max_freq: the frequency that mapped to highest_perf
-- * @min_freq: the frequency that mapped to lowest_perf
-- * @nominal_freq: the frequency that mapped to nominal_perf
-- * @lowest_nonlinear_freq: the frequency that mapped to lowest_nonlinear_perf
-+ * @min_limit_perf: Cached value of the performance corresponding to policy->min
-+ * @max_limit_perf: Cached value of the performance corresponding to policy->max
-+ * @min_limit_freq: Cached value of policy->min (in khz)
-+ * @max_limit_freq: Cached value of policy->max (in khz)
-+ * @max_freq: the frequency (in khz) that mapped to highest_perf
-+ * @min_freq: the frequency (in khz) that mapped to lowest_perf
-+ * @nominal_freq: the frequency (in khz) that mapped to nominal_perf
-+ * @lowest_nonlinear_freq: the frequency (in khz) that mapped to lowest_nonlinear_perf
- * @cur: Difference of Aperf/Mperf/tsc count between last and current sample
- * @prev: Last Aperf/Mperf/tsc count value read from register
-- * @freq: current cpu frequency value
-+ * @freq: current cpu frequency value (in khz)
- * @boost_supported: check whether the Processor or SBIOS supports boost mode
- * @hw_prefcore: check whether HW supports preferred core featue.
- * Only when hw_prefcore and early prefcore param are true,
-@@ -95,6 +99,8 @@ struct amd_cpudata {
+@@ -99,6 +99,8 @@ struct amd_cpudata {
u32 policy;
u64 cppc_cap1_cached;
bool suspended;
@@ -846,7 +751,7 @@ index bc341f35908d..cc8bb2bc325a 100644
#endif /* _LINUX_AMD_PSTATE_H */
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
-index d7630d9cdb2f..bbbeb8b90313 100644
+index 9e5060b27864..270ea04fb616 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -614,10 +614,9 @@ static ssize_t show_boost(struct kobject *kobj,