[PATCH v4 1/3] ACPI: CPPC: Factor out and export per-cpu cppc_perf_ctrs_in_pcc_cpu()
Jie Zhan
zhanjie9 at hisilicon.com
Tue Dec 2 19:24:20 PST 2025
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.
Signed-off-by: Jie Zhan <zhanjie9 at hisilicon.com>
---
drivers/acpi/cppc_acpi.c | 45 +++++++++++++++++++++-------------------
include/acpi/cppc_acpi.h | 5 +++++
2 files changed, 29 insertions(+), 21 deletions(-)
diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c
index 3bdeeee3414e..aa80dbcf42c0 100644
--- a/drivers/acpi/cppc_acpi.c
+++ b/drivers/acpi/cppc_acpi.c
@@ -1422,6 +1422,29 @@ int cppc_get_perf_caps(int cpunum, struct cppc_perf_caps *perf_caps)
}
EXPORT_SYMBOL_GPL(cppc_get_perf_caps);
+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];
+
+ 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]) ||
+ CPC_IN_PCC(ref_perf_reg))
+ return true;
+
+ return false;
+}
+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 +1459,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;
}
diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h
index 13fa81504844..4bcdcaf8bf2c 100644
--- a/include/acpi/cppc_acpi.h
+++ b/include/acpi/cppc_acpi.h
@@ -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;
--
2.33.0
More information about the linux-arm-kernel
mailing list