@@ -758,10 +758,8 @@ static inline bool cpu_has_hw_af(void)
ID_AA64MMFR1_HADBS_SHIFT);
}
-#ifdef CONFIG_ARM64_AMU_EXTN
-/* Check whether the cpu supports the Activity Monitors Unit (AMU) */
-extern bool cpu_has_amu_feat(int cpu);
-#endif
+/* Return cpumask with CPUs that support the Activity Monitors Unit (AMU) */
+extern const struct cpumask *cpus_with_amu_counters(void);
static inline unsigned int get_vmid_bits(u64 mmfr1)
{
@@ -1516,9 +1516,9 @@ static bool has_hw_dbm(const struct arm64_cpu_capabilities *cap,
*/
static struct cpumask amu_cpus __read_mostly;
-bool cpu_has_amu_feat(int cpu)
+const struct cpumask *cpus_with_amu_counters(void)
{
- return cpumask_test_cpu(cpu, &amu_cpus);
+ return (const struct cpumask *)&amu_cpus;
}
/* Initialize the use of AMU counters for frequency invariance */
@@ -1552,7 +1552,12 @@ static bool has_amu(const struct arm64_cpu_capabilities *cap,
return true;
}
-#endif
+#else
+const struct cpumask *cpus_with_amu_counters(void)
+{
+ return NULL;
+}
+#endif /* CONFIG_ARM64_AMU_EXTN */
#ifdef CONFIG_ARM64_VHE
static bool runs_at_el2(const struct arm64_cpu_capabilities *entry, int __unused)
@@ -142,9 +142,10 @@ void init_cpu_freq_invariance_counters(void)
static int validate_cpu_freq_invariance_counters(int cpu)
{
+ const struct cpumask *cnt_cpu_mask = cpus_with_amu_counters();
u64 max_freq_hz, ratio;
- if (!cpu_has_amu_feat(cpu)) {
+ if (!cnt_cpu_mask || !cpumask_test_cpu(cpu, cnt_cpu_mask)) {
pr_debug("CPU%d: counters are not supported.\n", cpu);
return -EINVAL;
}
The current cpu_has_amu_feat() function only returns whether a single provided CPU has support for Activity Monitors (AMUs). Replace that function by cpus_with_amu_counters() that returns a pointer to a cpumask with all CPUs that support AMUs. This way the user has more freedom in regards to either checking many CPUs at once or selecting any supporting CPU, through the use of cpumask operations. Signed-off-by: Ionela Voinescu <ionela.voinescu@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will@kernel.org> --- arch/arm64/include/asm/cpufeature.h | 6 ++---- arch/arm64/kernel/cpufeature.c | 11 ++++++++--- arch/arm64/kernel/topology.c | 3 ++- 3 files changed, 12 insertions(+), 8 deletions(-)