| From 5477fa249b56c59c3baa1b237bf083cffa64c84a Mon Sep 17 00:00:00 2001 |
| From: Vincent Guittot <vincent.guittot@linaro.org> |
| Date: Mon, 11 Dec 2023 11:48:54 +0100 |
| Subject: cpufreq/cppc: Set the frequency used for computing the capacity |
| |
| From: Vincent Guittot <vincent.guittot@linaro.org> |
| |
| commit 5477fa249b56c59c3baa1b237bf083cffa64c84a upstream. |
| |
| Save the frequency associated to the performance that has been used when |
| initializing the capacity of CPUs. |
| |
| Also, cppc cpufreq driver can register an artificial energy model. In such |
| case, it needs the frequency for this compute capacity. |
| |
| Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org> |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Tested-by: Pierre Gondois <pierre.gondois@arm.com> |
| Acked-by: Sudeep Holla <sudeep.holla@arm.com> |
| Acked-by: Viresh Kumar <viresh.kumar@linaro.org> |
| Link: https://lore.kernel.org/r/20231211104855.558096-7-vincent.guittot@linaro.org |
| Stable-dep-of: e37617c8e53a ("sched/fair: Fix frequency selection for non-invariant case") |
| Signed-off-by: Wentao Guan <guanwentao@uniontech.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/base/arch_topology.c | 15 ++++++++++++++- |
| 1 file changed, 14 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/base/arch_topology.c |
| +++ b/drivers/base/arch_topology.c |
| @@ -349,6 +349,7 @@ bool __init topology_parse_cpu_capacity( |
| |
| void topology_init_cpu_capacity_cppc(void) |
| { |
| + u64 capacity, capacity_scale = 0; |
| struct cppc_perf_caps perf_caps; |
| int cpu; |
| |
| @@ -365,6 +366,10 @@ void topology_init_cpu_capacity_cppc(voi |
| (perf_caps.highest_perf >= perf_caps.nominal_perf) && |
| (perf_caps.highest_perf >= perf_caps.lowest_perf)) { |
| raw_capacity[cpu] = perf_caps.highest_perf; |
| + capacity_scale = max_t(u64, capacity_scale, raw_capacity[cpu]); |
| + |
| + per_cpu(capacity_freq_ref, cpu) = cppc_perf_to_khz(&perf_caps, raw_capacity[cpu]); |
| + |
| pr_debug("cpu_capacity: CPU%d cpu_capacity=%u (raw).\n", |
| cpu, raw_capacity[cpu]); |
| continue; |
| @@ -375,7 +380,15 @@ void topology_init_cpu_capacity_cppc(voi |
| goto exit; |
| } |
| |
| - topology_normalize_cpu_scale(); |
| + for_each_possible_cpu(cpu) { |
| + capacity = raw_capacity[cpu]; |
| + capacity = div64_u64(capacity << SCHED_CAPACITY_SHIFT, |
| + capacity_scale); |
| + topology_set_cpu_scale(cpu, capacity); |
| + pr_debug("cpu_capacity: CPU%d cpu_capacity=%lu\n", |
| + cpu, topology_get_cpu_scale(cpu)); |
| + } |
| + |
| schedule_work(&update_topology_flags_work); |
| pr_debug("cpu_capacity: cpu_capacity initialization done\n"); |
| |