62 lines
2.0 KiB
Diff
62 lines
2.0 KiB
Diff
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
|
|
--- a/drivers/cpufreq/cpufreq.c
|
|
+++ b/drivers/cpufreq/cpufreq.c
|
|
@@ -2590,8 +2590,8 @@ static void cpufreq_update_pressure(struct cpufreq_policy *policy)
|
|
|
|
cpu = cpumask_first(policy->related_cpus);
|
|
max_freq = arch_scale_freq_ref(cpu);
|
|
- if (!max_freq)
|
|
- max_freq = policy->cpuinfo.max_freq;
|
|
+ if (!max_freq && cpufreq_driver->scale_freq_ref)
|
|
+ max_freq = cpufreq_driver->scale_freq_ref(policy);
|
|
|
|
capped_freq = policy->max;
|
|
|
|
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
|
|
--- a/drivers/cpufreq/intel_pstate.c
|
|
+++ b/drivers/cpufreq/intel_pstate.c
|
|
@@ -1175,6 +1175,14 @@ static bool hybrid_clear_max_perf_cpu(void)
|
|
return ret;
|
|
}
|
|
|
|
+static unsigned int intel_pstate_scale_freq_ref(struct cpufreq_policy *policy)
|
|
+{
|
|
+ if (READ_ONCE(all_cpu_data[policy->cpu]->capacity_perf))
|
|
+ return policy->cpuinfo.max_freq;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static void intel_pstate_update_freq_limits(struct cpudata *cpu)
|
|
{
|
|
int scaling = cpu->pstate.scaling;
|
|
@@ -3092,6 +3100,7 @@ static struct cpufreq_driver intel_pstate = {
|
|
.offline = intel_pstate_cpu_offline,
|
|
.online = intel_pstate_cpu_online,
|
|
.update_limits = intel_pstate_update_limits,
|
|
+ .scale_freq_ref = intel_pstate_scale_freq_ref,
|
|
.name = "intel_pstate",
|
|
};
|
|
|
|
@@ -3415,6 +3424,7 @@ static struct cpufreq_driver intel_cpufreq = {
|
|
.suspend = intel_cpufreq_suspend,
|
|
.resume = intel_pstate_resume,
|
|
.update_limits = intel_pstate_update_limits,
|
|
+ .scale_freq_ref = intel_pstate_scale_freq_ref,
|
|
.name = "intel_cpufreq",
|
|
};
|
|
|
|
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
|
|
--- a/include/linux/cpufreq.h
|
|
+++ b/include/linux/cpufreq.h
|
|
@@ -420,6 +420,9 @@ struct cpufreq_driver {
|
|
/* Will be called after the driver is fully initialized */
|
|
void (*ready)(struct cpufreq_policy *policy);
|
|
|
|
+ /* Return the capacity reference frequency for policy. */
|
|
+ unsigned int (*scale_freq_ref)(struct cpufreq_policy *policy);
|
|
+
|
|
struct freq_attr **attr;
|
|
|
|
/* platform specific boost support code */
|