hulk inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I8ELKA
----------------------------------------
In cppc_cpufreq_get_rate(), when the platform doesn't have AMU and call cppc_get_perf_ctrs_sample() directly, it needs target cpunum argument but not get local cpu by smp_processor_id().
Here introduce the struct fb_ctr_pair which includes the target cpunum, and acts as the parameter of cppc_get_perf_ctrs_sample().
Fixes: 904d9dcde3e6 ("cpufreq: CPPC: keep target core awake when reading its cpufreq rate") Signed-off-by: Zeng Heng zengheng4@huawei.com --- drivers/cpufreq/cppc_cpufreq.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c index f7f3632dcf31..225c5260d2cb 100644 --- a/drivers/cpufreq/cppc_cpufreq.c +++ b/drivers/cpufreq/cppc_cpufreq.c @@ -57,6 +57,12 @@ static struct cppc_workaround_oem_info wa_info[] = { } };
+struct fb_ctr_pair { + u32 cpu; + struct cppc_perf_fb_ctrs fb_ctrs_t0; + struct cppc_perf_fb_ctrs fb_ctrs_t1; +}; + /* Callback function used to retrieve the max frequency from DMI */ static void cppc_find_dmi_mhz(const struct dmi_header *dm, void *private) { @@ -352,35 +358,37 @@ static int cppc_get_rate_from_fbctrs(struct cppc_cpudata *cpu,
static int cppc_get_perf_ctrs_sample(void *val) { - int cpunum = smp_processor_id(); - struct cppc_perf_fb_ctrs *fb_ctrs = val; + struct fb_ctr_pair *fb_ctrs = val; + int cpu = fb_ctrs->cpu; int ret;
- ret = cppc_get_perf_ctrs(cpunum, fb_ctrs); + ret = cppc_get_perf_ctrs(cpu, &fb_ctrs->fb_ctrs_t0); if (ret) return ret;
udelay(2); /* 2usec delay between sampling */
- return cppc_get_perf_ctrs(cpunum, fb_ctrs + 1); + return cppc_get_perf_ctrs(cpu, &fb_ctrs->fb_ctrs_t1); }
static unsigned int cppc_cpufreq_get_rate(unsigned int cpunum) { - struct cppc_perf_fb_ctrs fb_ctrs[2] = {0}; + struct fb_ctr_pair fb_ctrs = { .cpu = cpunum, }; struct cppc_cpudata *cpu = all_cpu_data[cpunum]; int ret;
if (cpu_has_amu_feat(cpunum)) ret = smp_call_on_cpu(cpunum, cppc_get_perf_ctrs_sample, - fb_ctrs, false); + &fb_ctrs, false); else - ret = cppc_get_perf_ctrs_sample(fb_ctrs); + ret = cppc_get_perf_ctrs_sample(&fb_ctrs);
if (ret) return ret;
- return cppc_get_rate_from_fbctrs(cpu, fb_ctrs[0], fb_ctrs[1]); + return cppc_get_rate_from_fbctrs(cpu, + fb_ctrs.fb_ctrs_t0, + fb_ctrs.fb_ctrs_t1); }
static int cppc_cpufreq_set_boost(struct cpufreq_policy *policy, int state)