]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ACPI: CPPC: Factor out and export per-cpu cppc_perf_ctrs_in_pcc_cpu()
authorJie Zhan <zhanjie9@hisilicon.com>
Tue, 23 Dec 2025 07:21:17 +0000 (15:21 +0800)
committerViresh Kumar <viresh.kumar@linaro.org>
Tue, 27 Jan 2026 05:51:23 +0000 (11:21 +0530)
Factor out cppc_perf_ctrs_in_pcc_cpu() for checking whether per-cpu CPC
regs are defined in PCC channels, and export it out for further use.

Reviewed-by: Lifeng Zheng <zhenglifeng1@huawei.com>
Reviewed-by: Pierre Gondois <pierre.gondois@arm.com>
Signed-off-by: Jie Zhan <zhanjie9@hisilicon.com>
Acked-by: Rafael J. Wysocki (Intel) <rafael@kernel.org>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
drivers/acpi/cppc_acpi.c
include/acpi/cppc_acpi.h

index 3bdeeee3414e68c4b4752257362afa5c13ad995e..ec4966aaa8d498d55d5634c52a5635267da0961b 100644 (file)
@@ -1422,6 +1422,32 @@ out_err:
 }
 EXPORT_SYMBOL_GPL(cppc_get_perf_caps);
 
+/**
+ * cppc_perf_ctrs_in_pcc_cpu - Check if any perf counters of a CPU are in PCC.
+ * @cpu: CPU on which to check perf counters.
+ *
+ * Return: true if any of the counters are in PCC regions, false otherwise
+ */
+bool cppc_perf_ctrs_in_pcc_cpu(unsigned int cpu)
+{
+       struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpu);
+       struct cpc_register_resource *ref_perf_reg;
+
+       /*
+        * If reference perf register is not supported then we should use the
+        * nominal perf value
+        */
+       ref_perf_reg = &cpc_desc->cpc_regs[REFERENCE_PERF];
+       if (!CPC_SUPPORTED(ref_perf_reg))
+               ref_perf_reg = &cpc_desc->cpc_regs[NOMINAL_PERF];
+
+       return CPC_IN_PCC(&cpc_desc->cpc_regs[DELIVERED_CTR]) ||
+               CPC_IN_PCC(&cpc_desc->cpc_regs[REFERENCE_CTR]) ||
+               CPC_IN_PCC(&cpc_desc->cpc_regs[CTR_WRAP_TIME]) ||
+               CPC_IN_PCC(ref_perf_reg);
+}
+EXPORT_SYMBOL_GPL(cppc_perf_ctrs_in_pcc_cpu);
+
 /**
  * cppc_perf_ctrs_in_pcc - Check if any perf counters are in a PCC region.
  *
@@ -1436,27 +1462,7 @@ bool cppc_perf_ctrs_in_pcc(void)
        int cpu;
 
        for_each_online_cpu(cpu) {
-               struct cpc_register_resource *ref_perf_reg;
-               struct cpc_desc *cpc_desc;
-
-               cpc_desc = per_cpu(cpc_desc_ptr, cpu);
-
-               if (CPC_IN_PCC(&cpc_desc->cpc_regs[DELIVERED_CTR]) ||
-                   CPC_IN_PCC(&cpc_desc->cpc_regs[REFERENCE_CTR]) ||
-                   CPC_IN_PCC(&cpc_desc->cpc_regs[CTR_WRAP_TIME]))
-                       return true;
-
-
-               ref_perf_reg = &cpc_desc->cpc_regs[REFERENCE_PERF];
-
-               /*
-                * If reference perf register is not supported then we should
-                * use the nominal perf value
-                */
-               if (!CPC_SUPPORTED(ref_perf_reg))
-                       ref_perf_reg = &cpc_desc->cpc_regs[NOMINAL_PERF];
-
-               if (CPC_IN_PCC(ref_perf_reg))
+               if (cppc_perf_ctrs_in_pcc_cpu(cpu))
                        return true;
        }
 
index 13fa81504844563f84bf8b75efed7915b662acfe..4bcdcaf8bf2c5696922e458a1ab0b284a8d38ce1 100644 (file)
@@ -154,6 +154,7 @@ extern int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs);
 extern int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls);
 extern int cppc_set_enable(int cpu, bool enable);
 extern int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps);
+extern bool cppc_perf_ctrs_in_pcc_cpu(unsigned int cpu);
 extern bool cppc_perf_ctrs_in_pcc(void);
 extern unsigned int cppc_perf_to_khz(struct cppc_perf_caps *caps, unsigned int perf);
 extern unsigned int cppc_khz_to_perf(struct cppc_perf_caps *caps, unsigned int freq);
@@ -204,6 +205,10 @@ static inline int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps)
 {
        return -EOPNOTSUPP;
 }
+static inline bool cppc_perf_ctrs_in_pcc_cpu(unsigned int cpu)
+{
+       return false;
+}
 static inline bool cppc_perf_ctrs_in_pcc(void)
 {
        return false;