| From 3d0b1ce5b76bba5449890fccb3400899e44e413e Mon Sep 17 00:00:00 2001 |
| From: Sudeep Holla <sudeep.holla@arm.com> |
| Date: Wed, 27 Nov 2019 15:56:40 +0000 |
| Subject: [PATCH] ARM: vexpress: Set-up shared OPP table instead of individual |
| for each CPU |
| |
| commit 2a76352ad2cc6b78e58f737714879cc860903802 upstream. |
| |
| Currently we add individual copy of same OPP table for each CPU within |
| the cluster. This is redundant and doesn't reflect the reality. |
| |
| We can't use core cpumask to set policy->cpus in ve_spc_cpufreq_init() |
| anymore as it gets called via cpuhp_cpufreq_online()->cpufreq_online() |
| ->cpufreq_driver->init() and the cpumask gets updated upon CPU hotplug |
| operations. It also may cause issues when the vexpress_spc_cpufreq |
| driver is built as a module. |
| |
| Since ve_spc_clk_init is built-in device initcall, we should be able to |
| use the same topology_core_cpumask to set the opp sharing cpumask via |
| dev_pm_opp_set_sharing_cpus and use the same later in the driver via |
| dev_pm_opp_get_sharing_cpus. |
| |
| Cc: Liviu Dudau <liviu.dudau@arm.com> |
| Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> |
| Acked-by: Viresh Kumar <viresh.kumar@linaro.org> |
| Tested-by: Dietmar Eggemann <dietmar.eggemann@arm.com> |
| Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/arm/mach-vexpress/spc.c b/arch/arm/mach-vexpress/spc.c |
| index 0f5381d13494..55bbbc3b328f 100644 |
| --- a/arch/arm/mach-vexpress/spc.c |
| +++ b/arch/arm/mach-vexpress/spc.c |
| @@ -551,8 +551,9 @@ static struct clk *ve_spc_clk_register(struct device *cpu_dev) |
| |
| static int __init ve_spc_clk_init(void) |
| { |
| - int cpu; |
| + int cpu, cluster; |
| struct clk *clk; |
| + bool init_opp_table[MAX_CLUSTERS] = { false }; |
| |
| if (!info) |
| return 0; /* Continue only if SPC is initialised */ |
| @@ -578,8 +579,17 @@ static int __init ve_spc_clk_init(void) |
| continue; |
| } |
| |
| + cluster = topology_physical_package_id(cpu_dev->id); |
| + if (init_opp_table[cluster]) |
| + continue; |
| + |
| if (ve_init_opp_table(cpu_dev)) |
| pr_warn("failed to initialise cpu%d opp table\n", cpu); |
| + else if (dev_pm_opp_set_sharing_cpus(cpu_dev, |
| + topology_core_cpumask(cpu_dev->id))) |
| + pr_warn("failed to mark OPPs shared for cpu%d\n", cpu); |
| + else |
| + init_opp_table[cluster] = true; |
| } |
| |
| platform_device_register_simple("vexpress-spc-cpufreq", -1, NULL, 0); |
| -- |
| 2.7.4 |
| |