2022-07-26 15:10:02

by Jeremy Linton

[permalink] [raw]
Subject: [PATCH] ACPI: CPPC: Disable FIE if registers in PCC regions

PCC regions utilize a mailbox to set/retrieve register values used by
the CPPC code. This is fine as long as the operations are
infrequent. With the FIE code enabled though the overhead can range
from 2-11% of system CPU overhead (ex: as measured by top) on Arm
based machines.

So, before enabling FIE assure none of the registers used by
cppc_get_perf_ctrs() are in the PCC region. Furthermore lets also
enable a module parameter which can also disable it at boot or module
reload.

Signed-off-by: Jeremy Linton <[email protected]>
---
drivers/acpi/cppc_acpi.c | 31 +++++++++++++++++++++++++++++++
drivers/cpufreq/cppc_cpufreq.c | 19 +++++++++++++++----
include/acpi/cppc_acpi.h | 5 +++++
3 files changed, 51 insertions(+), 4 deletions(-)

diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c
index 3c6d4ef87be0..ad84c55b6409 100644
--- a/drivers/acpi/cppc_acpi.c
+++ b/drivers/acpi/cppc_acpi.c
@@ -1246,6 +1246,37 @@ int cppc_get_perf_caps(int cpunum, struct cppc_perf_caps *perf_caps)
}
EXPORT_SYMBOL_GPL(cppc_get_perf_caps);

+int cppc_perf_ctrs_in_pcc(void)
+{
+ int cpu;
+ struct cpc_desc *cpc_desc;
+ struct cpc_register_resource *delivered_reg, *reference_reg,
+ *ref_perf_reg, *ctr_wrap_reg;
+
+ for_each_present_cpu(cpu) {
+ cpc_desc = per_cpu(cpc_desc_ptr, cpu);
+ delivered_reg = &cpc_desc->cpc_regs[DELIVERED_CTR];
+ reference_reg = &cpc_desc->cpc_regs[REFERENCE_CTR];
+ ref_perf_reg = &cpc_desc->cpc_regs[REFERENCE_PERF];
+ ctr_wrap_reg = &cpc_desc->cpc_regs[CTR_WRAP_TIME];
+
+ /*
+ * 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];
+
+ /* Are any of the regs PCC ?*/
+ if (CPC_IN_PCC(delivered_reg) || CPC_IN_PCC(reference_reg) ||
+ CPC_IN_PCC(ctr_wrap_reg) || CPC_IN_PCC(ref_perf_reg)) {
+ return true;
+ }
+ }
+ return false;
+}
+EXPORT_SYMBOL_GPL(cppc_perf_ctrs_in_pcc);
+
/**
* cppc_get_perf_ctrs - Read a CPU's performance feedback counters.
* @cpunum: CPU from which to read counters.
diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
index 24eaf0ec344d..a66d3013d0f8 100644
--- a/drivers/cpufreq/cppc_cpufreq.c
+++ b/drivers/cpufreq/cppc_cpufreq.c
@@ -63,6 +63,10 @@ static struct cppc_workaround_oem_info wa_info[] = {

static struct cpufreq_driver cppc_cpufreq_driver;

+static bool fie_disabled;
+module_param(fie_disabled, bool, 0444);
+MODULE_PARM_DESC(fie_disabled, "Disable Frequency Invariance Engine (FIE)");
+
#ifdef CONFIG_ACPI_CPPC_CPUFREQ_FIE

/* Frequency invariance support */
@@ -158,7 +162,7 @@ static void cppc_cpufreq_cpu_fie_init(struct cpufreq_policy *policy)
struct cppc_freq_invariance *cppc_fi;
int cpu, ret;

- if (cppc_cpufreq_driver.get == hisi_cppc_cpufreq_get_rate)
+ if (fie_disabled)
return;

for_each_cpu(cpu, policy->cpus) {
@@ -199,7 +203,7 @@ static void cppc_cpufreq_cpu_fie_exit(struct cpufreq_policy *policy)
struct cppc_freq_invariance *cppc_fi;
int cpu;

- if (cppc_cpufreq_driver.get == hisi_cppc_cpufreq_get_rate)
+ if (fie_disabled)
return;

/* policy->cpus will be empty here, use related_cpus instead */
@@ -229,7 +233,12 @@ static void __init cppc_freq_invariance_init(void)
};
int ret;

- if (cppc_cpufreq_driver.get == hisi_cppc_cpufreq_get_rate)
+ if (cppc_perf_ctrs_in_pcc()) {
+ pr_debug("FIE not enabled on systems with registers in PCC\n");
+ fie_disabled = true;
+ }
+
+ if (fie_disabled)
return;

kworker_fie = kthread_create_worker(0, "cppc_fie");
@@ -247,7 +256,7 @@ static void __init cppc_freq_invariance_init(void)

static void cppc_freq_invariance_exit(void)
{
- if (cppc_cpufreq_driver.get == hisi_cppc_cpufreq_get_rate)
+ if (fie_disabled)
return;

kthread_destroy_worker(kworker_fie);
@@ -940,6 +949,8 @@ static void cppc_check_hisi_workaround(void)
}
}

+ fie_disabled = true;
+
acpi_put_table(tbl);
}

diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h
index d389bab54241..f4ff571fcdcb 100644
--- a/include/acpi/cppc_acpi.h
+++ b/include/acpi/cppc_acpi.h
@@ -140,6 +140,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 int cppc_perf_ctrs_in_pcc(void);
extern bool acpi_cpc_valid(void);
extern bool cppc_allow_fast_switch(void);
extern int acpi_get_psd_map(unsigned int cpu, struct cppc_cpudata *cpu_data);
@@ -173,6 +174,10 @@ static inline int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps)
{
return -ENOTSUPP;
}
+extern int cppc_perf_ctrs_in_pcc(void)
+{
+ return false;
+}
static inline bool acpi_cpc_valid(void)
{
return false;
--
2.37.1


2022-07-26 18:49:01

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH] ACPI: CPPC: Disable FIE if registers in PCC regions

On Tue, Jul 26, 2022 at 5:00 PM Jeremy Linton <[email protected]> wrote:
>
> PCC regions utilize a mailbox to set/retrieve register values used by
> the CPPC code. This is fine as long as the operations are
> infrequent. With the FIE code enabled though the overhead can range
> from 2-11% of system CPU overhead (ex: as measured by top) on Arm
> based machines.
>
> So, before enabling FIE assure none of the registers used by
> cppc_get_perf_ctrs() are in the PCC region. Furthermore lets also
> enable a module parameter which can also disable it at boot or module
> reload.
>
> Signed-off-by: Jeremy Linton <[email protected]>
> ---
> drivers/acpi/cppc_acpi.c | 31 +++++++++++++++++++++++++++++++
> drivers/cpufreq/cppc_cpufreq.c | 19 +++++++++++++++----
> include/acpi/cppc_acpi.h | 5 +++++
> 3 files changed, 51 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c
> index 3c6d4ef87be0..ad84c55b6409 100644
> --- a/drivers/acpi/cppc_acpi.c
> +++ b/drivers/acpi/cppc_acpi.c
> @@ -1246,6 +1246,37 @@ int cppc_get_perf_caps(int cpunum, struct cppc_perf_caps *perf_caps)
> }
> EXPORT_SYMBOL_GPL(cppc_get_perf_caps);
>

A kerneldoc, please.

> +int cppc_perf_ctrs_in_pcc(void)

Why int and not bool?

> +{
> + int cpu;
> + struct cpc_desc *cpc_desc;
> + struct cpc_register_resource *delivered_reg, *reference_reg,
> + *ref_perf_reg, *ctr_wrap_reg;

No line wraps here, please and follow the reverse xmas tree convention.

> +
> + for_each_present_cpu(cpu) {

Declare the variables only used in this loop here and you only need two.

> + cpc_desc = per_cpu(cpc_desc_ptr, cpu);
> + delivered_reg = &cpc_desc->cpc_regs[DELIVERED_CTR];
> + reference_reg = &cpc_desc->cpc_regs[REFERENCE_CTR];
> + ref_perf_reg = &cpc_desc->cpc_regs[REFERENCE_PERF];
> + ctr_wrap_reg = &cpc_desc->cpc_regs[CTR_WRAP_TIME];

I would do

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 (!CPC_SUPPORTED(ref_perf_reg))
ref_perf_reg = &cpc_desc->cpc_regs[NOMINAL_PERF];

if (CPC_IN_PCC(ref_perf_reg))
return true;

> +
> + /*
> + * 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];
> +
> + /* Are any of the regs PCC ?*/
> + if (CPC_IN_PCC(delivered_reg) || CPC_IN_PCC(reference_reg) ||
> + CPC_IN_PCC(ctr_wrap_reg) || CPC_IN_PCC(ref_perf_reg)) {
> + return true;
> + }
> + }
> + return false;
> +}
> +EXPORT_SYMBOL_GPL(cppc_perf_ctrs_in_pcc);
> +
> /**
> * cppc_get_perf_ctrs - Read a CPU's performance feedback counters.
> * @cpunum: CPU from which to read counters.
> diff --git a/drivers/cpufreq/cppc_cpufreq.c b/drivers/cpufreq/cppc_cpufreq.c
> index 24eaf0ec344d..a66d3013d0f8 100644
> --- a/drivers/cpufreq/cppc_cpufreq.c
> +++ b/drivers/cpufreq/cppc_cpufreq.c
> @@ -63,6 +63,10 @@ static struct cppc_workaround_oem_info wa_info[] = {
>
> static struct cpufreq_driver cppc_cpufreq_driver;
>
> +static bool fie_disabled;
> +module_param(fie_disabled, bool, 0444);
> +MODULE_PARM_DESC(fie_disabled, "Disable Frequency Invariance Engine (FIE)");
> +
> #ifdef CONFIG_ACPI_CPPC_CPUFREQ_FIE
>
> /* Frequency invariance support */
> @@ -158,7 +162,7 @@ static void cppc_cpufreq_cpu_fie_init(struct cpufreq_policy *policy)
> struct cppc_freq_invariance *cppc_fi;
> int cpu, ret;
>
> - if (cppc_cpufreq_driver.get == hisi_cppc_cpufreq_get_rate)
> + if (fie_disabled)
> return;
>
> for_each_cpu(cpu, policy->cpus) {
> @@ -199,7 +203,7 @@ static void cppc_cpufreq_cpu_fie_exit(struct cpufreq_policy *policy)
> struct cppc_freq_invariance *cppc_fi;
> int cpu;
>
> - if (cppc_cpufreq_driver.get == hisi_cppc_cpufreq_get_rate)
> + if (fie_disabled)
> return;
>
> /* policy->cpus will be empty here, use related_cpus instead */
> @@ -229,7 +233,12 @@ static void __init cppc_freq_invariance_init(void)
> };
> int ret;
>
> - if (cppc_cpufreq_driver.get == hisi_cppc_cpufreq_get_rate)
> + if (cppc_perf_ctrs_in_pcc()) {
> + pr_debug("FIE not enabled on systems with registers in PCC\n");
> + fie_disabled = true;
> + }
> +
> + if (fie_disabled)
> return;
>
> kworker_fie = kthread_create_worker(0, "cppc_fie");
> @@ -247,7 +256,7 @@ static void __init cppc_freq_invariance_init(void)
>
> static void cppc_freq_invariance_exit(void)
> {
> - if (cppc_cpufreq_driver.get == hisi_cppc_cpufreq_get_rate)
> + if (fie_disabled)
> return;
>
> kthread_destroy_worker(kworker_fie);
> @@ -940,6 +949,8 @@ static void cppc_check_hisi_workaround(void)
> }
> }
>
> + fie_disabled = true;
> +
> acpi_put_table(tbl);
> }
>
> diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h
> index d389bab54241..f4ff571fcdcb 100644
> --- a/include/acpi/cppc_acpi.h
> +++ b/include/acpi/cppc_acpi.h
> @@ -140,6 +140,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 int cppc_perf_ctrs_in_pcc(void);
> extern bool acpi_cpc_valid(void);
> extern bool cppc_allow_fast_switch(void);
> extern int acpi_get_psd_map(unsigned int cpu, struct cppc_cpudata *cpu_data);
> @@ -173,6 +174,10 @@ static inline int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps)
> {
> return -ENOTSUPP;
> }
> +extern int cppc_perf_ctrs_in_pcc(void)
> +{
> + return false;
> +}
> static inline bool acpi_cpc_valid(void)
> {
> return false;
> --

2022-07-27 03:55:57

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] ACPI: CPPC: Disable FIE if registers in PCC regions

Hi Jeremy,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on rafael-pm/linux-next]
[also build test WARNING on linus/master v5.19-rc8 next-20220726]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Jeremy-Linton/ACPI-CPPC-Disable-FIE-if-registers-in-PCC-regions/20220726-230217
base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
config: x86_64-randconfig-a005 (https://download.01.org/0day-ci/archive/20220727/[email protected]/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 83882606dbd7ffb0bdd3460356202d97705809c8)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/a4dd80cfc857eef429f60e999bdc9479179d495e
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Jeremy-Linton/ACPI-CPPC-Disable-FIE-if-registers-in-PCC-regions/20220726-230217
git checkout a4dd80cfc857eef429f60e999bdc9479179d495e
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/cpufreq/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>):

In file included from drivers/cpufreq/intel_pstate.c:45:
>> include/acpi/cppc_acpi.h:177:12: warning: no previous prototype for function 'cppc_perf_ctrs_in_pcc' [-Wmissing-prototypes]
extern int cppc_perf_ctrs_in_pcc(void)
^
include/acpi/cppc_acpi.h:177:8: note: declare 'static' if the function is not intended to be used outside of this translation unit
extern int cppc_perf_ctrs_in_pcc(void)
^
1 warning generated.


vim +/cppc_perf_ctrs_in_pcc +177 include/acpi/cppc_acpi.h

135
136 #ifdef CONFIG_ACPI_CPPC_LIB
137 extern int cppc_get_desired_perf(int cpunum, u64 *desired_perf);
138 extern int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf);
139 extern int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs);
140 extern int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls);
141 extern int cppc_set_enable(int cpu, bool enable);
142 extern int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps);
143 extern int cppc_perf_ctrs_in_pcc(void);
144 extern bool acpi_cpc_valid(void);
145 extern bool cppc_allow_fast_switch(void);
146 extern int acpi_get_psd_map(unsigned int cpu, struct cppc_cpudata *cpu_data);
147 extern unsigned int cppc_get_transition_latency(int cpu);
148 extern bool cpc_ffh_supported(void);
149 extern bool cpc_supported_by_cpu(void);
150 extern int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val);
151 extern int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val);
152 #else /* !CONFIG_ACPI_CPPC_LIB */
153 static inline int cppc_get_desired_perf(int cpunum, u64 *desired_perf)
154 {
155 return -ENOTSUPP;
156 }
157 static inline int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf)
158 {
159 return -ENOTSUPP;
160 }
161 static inline int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs)
162 {
163 return -ENOTSUPP;
164 }
165 static inline int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls)
166 {
167 return -ENOTSUPP;
168 }
169 static inline int cppc_set_enable(int cpu, bool enable)
170 {
171 return -ENOTSUPP;
172 }
173 static inline int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps)
174 {
175 return -ENOTSUPP;
176 }
> 177 extern int cppc_perf_ctrs_in_pcc(void)
178 {
179 return false;
180 }
181 static inline bool acpi_cpc_valid(void)
182 {
183 return false;
184 }
185 static inline bool cppc_allow_fast_switch(void)
186 {
187 return false;
188 }
189 static inline unsigned int cppc_get_transition_latency(int cpu)
190 {
191 return CPUFREQ_ETERNAL;
192 }
193 static inline bool cpc_ffh_supported(void)
194 {
195 return false;
196 }
197 static inline int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val)
198 {
199 return -ENOTSUPP;
200 }
201 static inline int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val)
202 {
203 return -ENOTSUPP;
204 }
205 #endif /* !CONFIG_ACPI_CPPC_LIB */
206

--
0-DAY CI Kernel Test Service
https://01.org/lkp

2022-07-29 03:04:51

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] ACPI: CPPC: Disable FIE if registers in PCC regions

Hi Jeremy,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on rafael-pm/linux-next]
[also build test ERROR on linus/master v5.19-rc8 next-20220728]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Jeremy-Linton/ACPI-CPPC-Disable-FIE-if-registers-in-PCC-regions/20220726-230217
base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
config: x86_64-randconfig-a011 (https://download.01.org/0day-ci/archive/20220729/[email protected]/config)
compiler: gcc-11 (Debian 11.3.0-3) 11.3.0
reproduce (this is a W=1 build):
# https://github.com/intel-lab-lkp/linux/commit/a4dd80cfc857eef429f60e999bdc9479179d495e
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Jeremy-Linton/ACPI-CPPC-Disable-FIE-if-registers-in-PCC-regions/20220726-230217
git checkout a4dd80cfc857eef429f60e999bdc9479179d495e
# save the config file
mkdir build_dir && cp config build_dir/.config
make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>

All error/warnings (new ones prefixed by >>):

In file included from drivers/cpufreq/acpi-cpufreq.c:29:
>> include/acpi/cppc_acpi.h:177:12: warning: no previous prototype for 'cppc_perf_ctrs_in_pcc' [-Wmissing-prototypes]
177 | extern int cppc_perf_ctrs_in_pcc(void)
| ^~~~~~~~~~~~~~~~~~~~~
--
ld: drivers/cpufreq/intel_pstate.o: in function `cppc_perf_ctrs_in_pcc':
>> include/acpi/cppc_acpi.h:178: multiple definition of `cppc_perf_ctrs_in_pcc'; drivers/cpufreq/acpi-cpufreq.o:include/acpi/cppc_acpi.h:178: first defined here


vim +178 include/acpi/cppc_acpi.h

135
136 #ifdef CONFIG_ACPI_CPPC_LIB
137 extern int cppc_get_desired_perf(int cpunum, u64 *desired_perf);
138 extern int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf);
139 extern int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs);
140 extern int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls);
141 extern int cppc_set_enable(int cpu, bool enable);
142 extern int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps);
143 extern int cppc_perf_ctrs_in_pcc(void);
144 extern bool acpi_cpc_valid(void);
145 extern bool cppc_allow_fast_switch(void);
146 extern int acpi_get_psd_map(unsigned int cpu, struct cppc_cpudata *cpu_data);
147 extern unsigned int cppc_get_transition_latency(int cpu);
148 extern bool cpc_ffh_supported(void);
149 extern bool cpc_supported_by_cpu(void);
150 extern int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val);
151 extern int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val);
152 #else /* !CONFIG_ACPI_CPPC_LIB */
153 static inline int cppc_get_desired_perf(int cpunum, u64 *desired_perf)
154 {
155 return -ENOTSUPP;
156 }
157 static inline int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf)
158 {
159 return -ENOTSUPP;
160 }
161 static inline int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs)
162 {
163 return -ENOTSUPP;
164 }
165 static inline int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls)
166 {
167 return -ENOTSUPP;
168 }
169 static inline int cppc_set_enable(int cpu, bool enable)
170 {
171 return -ENOTSUPP;
172 }
173 static inline int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps)
174 {
175 return -ENOTSUPP;
176 }
> 177 extern int cppc_perf_ctrs_in_pcc(void)
> 178 {
179 return false;
180 }
181 static inline bool acpi_cpc_valid(void)
182 {
183 return false;
184 }
185 static inline bool cppc_allow_fast_switch(void)
186 {
187 return false;
188 }
189 static inline unsigned int cppc_get_transition_latency(int cpu)
190 {
191 return CPUFREQ_ETERNAL;
192 }
193 static inline bool cpc_ffh_supported(void)
194 {
195 return false;
196 }
197 static inline int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val)
198 {
199 return -ENOTSUPP;
200 }
201 static inline int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val)
202 {
203 return -ENOTSUPP;
204 }
205 #endif /* !CONFIG_ACPI_CPPC_LIB */
206

--
0-DAY CI Kernel Test Service
https://01.org/lkp