Message ID | 20240903203701.2695040-8-superm1@kernel.org (mailing list archive) |
---|---|
State | Accepted, archived |
Delegated to: | Mario Limonciello |
Headers | show |
Series | Adjustments for preferred core detection | expand |
Hi Mario, kernel test robot noticed the following build errors: [auto build test ERROR on rafael-pm/linux-next] [also build test ERROR on rafael-pm/bleeding-edge tip/x86/core tip/master linus/master v6.11-rc6 next-20240904] [cannot apply to tip/auto-latest] [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/Mario-Limonciello/x86-amd-Move-amd_get_highest_perf-from-amd-c-to-cppc-c/20240904-044140 base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next patch link: https://lore.kernel.org/r/20240903203701.2695040-8-superm1%40kernel.org patch subject: [PATCH v2 07/11] x86/amd: Detect preferred cores in amd_get_boost_ratio_numerator() config: i386-allmodconfig (https://download.01.org/0day-ci/archive/20240905/202409050432.AoAbkkyJ-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240905/202409050432.AoAbkkyJ-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202409050432.AoAbkkyJ-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from drivers/cpufreq/amd-pstate.c:42: >> include/acpi/cppc_acpi.h:242:19: error: static declaration of 'amd_get_highest_perf' follows non-static declaration 242 | static inline int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf) | ^~~~~~~~~~~~~~~~~~~~ include/acpi/cppc_acpi.h:141:12: note: previous declaration of 'amd_get_highest_perf' with type 'int(unsigned int, u32 *)' {aka 'int(unsigned int, unsigned int *)'} 141 | extern int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf); | ^~~~~~~~~~~~~~~~~~~~ >> include/acpi/cppc_acpi.h:246:19: error: static declaration of 'amd_get_boost_ratio_numerator' follows non-static declaration 246 | static inline int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/acpi/cppc_acpi.h:142:12: note: previous declaration of 'amd_get_boost_ratio_numerator' with type 'int(unsigned int, u64 *)' {aka 'int(unsigned int, long long unsigned int *)'} 142 | extern int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vim +/amd_get_highest_perf +242 include/acpi/cppc_acpi.h 337aadff8e4567 Ashwin Chaugule 2015-10-02 140 7885bc49834406 Mario Limonciello 2024-09-03 141 extern int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf); 7885bc49834406 Mario Limonciello 2024-09-03 142 extern int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator); 8a02d99876362f Rafael J. Wysocki 2021-03-16 143 #ifdef CONFIG_ACPI_CPPC_LIB 1757d05f3112ac Xiongfeng Wang 2019-02-17 144 extern int cppc_get_desired_perf(int cpunum, u64 *desired_perf); 0654cf05d17bc4 Rafael J. Wysocki 2021-09-04 145 extern int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf); 12753d71e8c5c3 Meng Li 2024-01-19 146 extern int cppc_get_highest_perf(int cpunum, u64 *highest_perf); 337aadff8e4567 Ashwin Chaugule 2015-10-02 147 extern int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs); 337aadff8e4567 Ashwin Chaugule 2015-10-02 148 extern int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls); fb0b00af04d083 Jinzhou Su 2021-12-24 149 extern int cppc_set_enable(int cpu, bool enable); 337aadff8e4567 Ashwin Chaugule 2015-10-02 150 extern int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps); ae2df912d1a557 Jeremy Linton 2022-09-12 151 extern bool cppc_perf_ctrs_in_pcc(void); 50b813b147e9eb Vincent Guittot 2023-12-11 152 extern unsigned int cppc_perf_to_khz(struct cppc_perf_caps *caps, unsigned int perf); 50b813b147e9eb Vincent Guittot 2023-12-11 153 extern unsigned int cppc_khz_to_perf(struct cppc_perf_caps *caps, unsigned int freq); a28b2bfc099c6b Ionela Voinescu 2020-12-14 154 extern bool acpi_cpc_valid(void); 3cc30dd00a580c Pierre Gondois 2022-05-18 155 extern bool cppc_allow_fast_switch(void); a28b2bfc099c6b Ionela Voinescu 2020-12-14 156 extern int acpi_get_psd_map(unsigned int cpu, struct cppc_cpudata *cpu_data); be8b88d7d98771 Prakash, Prashanth 2016-08-16 157 extern unsigned int cppc_get_transition_latency(int cpu); ad3bc25a320742 Borislav Petkov 2018-12-05 158 extern bool cpc_ffh_supported(void); 8b356e536e69f3 Mario Limonciello 2022-07-05 159 extern bool cpc_supported_by_cpu(void); ad3bc25a320742 Borislav Petkov 2018-12-05 160 extern int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val); ad3bc25a320742 Borislav Petkov 2018-12-05 161 extern int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val); 7bc1fcd3990182 Perry Yuan 2023-01-31 162 extern int cppc_get_epp_perf(int cpunum, u64 *epp_perf); 7bc1fcd3990182 Perry Yuan 2023-01-31 163 extern int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable); c984f5d5d45bd5 Wyes Karny 2023-03-07 164 extern int cppc_get_auto_sel_caps(int cpunum, struct cppc_perf_caps *perf_caps); c984f5d5d45bd5 Wyes Karny 2023-03-07 165 extern int cppc_set_auto_sel(int cpu, bool enable); cfa6630658f7de Mario Limonciello 2024-09-03 166 extern int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf); 402eea79aece78 Mario Limonciello 2024-09-03 167 extern int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator); 7885bc49834406 Mario Limonciello 2024-09-03 168 extern int amd_detect_prefcore(bool *detected); 8a02d99876362f Rafael J. Wysocki 2021-03-16 169 #else /* !CONFIG_ACPI_CPPC_LIB */ 8a02d99876362f Rafael J. Wysocki 2021-03-16 170 static inline int cppc_get_desired_perf(int cpunum, u64 *desired_perf) 8a02d99876362f Rafael J. Wysocki 2021-03-16 171 { e224a868e488cf Mario Limonciello 2024-09-03 172 return -EOPNOTSUPP; 8a02d99876362f Rafael J. Wysocki 2021-03-16 173 } 0654cf05d17bc4 Rafael J. Wysocki 2021-09-04 174 static inline int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf) 0654cf05d17bc4 Rafael J. Wysocki 2021-09-04 175 { e224a868e488cf Mario Limonciello 2024-09-03 176 return -EOPNOTSUPP; 0654cf05d17bc4 Rafael J. Wysocki 2021-09-04 177 } 12753d71e8c5c3 Meng Li 2024-01-19 178 static inline int cppc_get_highest_perf(int cpunum, u64 *highest_perf) 12753d71e8c5c3 Meng Li 2024-01-19 179 { e224a868e488cf Mario Limonciello 2024-09-03 180 return -EOPNOTSUPP; 12753d71e8c5c3 Meng Li 2024-01-19 181 } 8a02d99876362f Rafael J. Wysocki 2021-03-16 182 static inline int cppc_get_perf_ctrs(int cpu, struct cppc_perf_fb_ctrs *perf_fb_ctrs) 8a02d99876362f Rafael J. Wysocki 2021-03-16 183 { e224a868e488cf Mario Limonciello 2024-09-03 184 return -EOPNOTSUPP; 8a02d99876362f Rafael J. Wysocki 2021-03-16 185 } 8a02d99876362f Rafael J. Wysocki 2021-03-16 186 static inline int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls) 8a02d99876362f Rafael J. Wysocki 2021-03-16 187 { e224a868e488cf Mario Limonciello 2024-09-03 188 return -EOPNOTSUPP; 8a02d99876362f Rafael J. Wysocki 2021-03-16 189 } fb0b00af04d083 Jinzhou Su 2021-12-24 190 static inline int cppc_set_enable(int cpu, bool enable) fb0b00af04d083 Jinzhou Su 2021-12-24 191 { e224a868e488cf Mario Limonciello 2024-09-03 192 return -EOPNOTSUPP; fb0b00af04d083 Jinzhou Su 2021-12-24 193 } 8a02d99876362f Rafael J. Wysocki 2021-03-16 194 static inline int cppc_get_perf_caps(int cpu, struct cppc_perf_caps *caps) 8a02d99876362f Rafael J. Wysocki 2021-03-16 195 { e224a868e488cf Mario Limonciello 2024-09-03 196 return -EOPNOTSUPP; 8a02d99876362f Rafael J. Wysocki 2021-03-16 197 } ae2df912d1a557 Jeremy Linton 2022-09-12 198 static inline bool cppc_perf_ctrs_in_pcc(void) ae2df912d1a557 Jeremy Linton 2022-09-12 199 { ae2df912d1a557 Jeremy Linton 2022-09-12 200 return false; ae2df912d1a557 Jeremy Linton 2022-09-12 201 } 8a02d99876362f Rafael J. Wysocki 2021-03-16 202 static inline bool acpi_cpc_valid(void) 8a02d99876362f Rafael J. Wysocki 2021-03-16 203 { 8a02d99876362f Rafael J. Wysocki 2021-03-16 204 return false; 8a02d99876362f Rafael J. Wysocki 2021-03-16 205 } 3cc30dd00a580c Pierre Gondois 2022-05-18 206 static inline bool cppc_allow_fast_switch(void) 3cc30dd00a580c Pierre Gondois 2022-05-18 207 { 3cc30dd00a580c Pierre Gondois 2022-05-18 208 return false; 3cc30dd00a580c Pierre Gondois 2022-05-18 209 } 8a02d99876362f Rafael J. Wysocki 2021-03-16 210 static inline unsigned int cppc_get_transition_latency(int cpu) 8a02d99876362f Rafael J. Wysocki 2021-03-16 211 { 8a02d99876362f Rafael J. Wysocki 2021-03-16 212 return CPUFREQ_ETERNAL; 8a02d99876362f Rafael J. Wysocki 2021-03-16 213 } 8a02d99876362f Rafael J. Wysocki 2021-03-16 214 static inline bool cpc_ffh_supported(void) 8a02d99876362f Rafael J. Wysocki 2021-03-16 215 { 8a02d99876362f Rafael J. Wysocki 2021-03-16 216 return false; 8a02d99876362f Rafael J. Wysocki 2021-03-16 217 } 8a02d99876362f Rafael J. Wysocki 2021-03-16 218 static inline int cpc_read_ffh(int cpunum, struct cpc_reg *reg, u64 *val) 8a02d99876362f Rafael J. Wysocki 2021-03-16 219 { e224a868e488cf Mario Limonciello 2024-09-03 220 return -EOPNOTSUPP; 8a02d99876362f Rafael J. Wysocki 2021-03-16 221 } 8a02d99876362f Rafael J. Wysocki 2021-03-16 222 static inline int cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val) 8a02d99876362f Rafael J. Wysocki 2021-03-16 223 { e224a868e488cf Mario Limonciello 2024-09-03 224 return -EOPNOTSUPP; 8a02d99876362f Rafael J. Wysocki 2021-03-16 225 } 7bc1fcd3990182 Perry Yuan 2023-01-31 226 static inline int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable) 7bc1fcd3990182 Perry Yuan 2023-01-31 227 { e224a868e488cf Mario Limonciello 2024-09-03 228 return -EOPNOTSUPP; 7bc1fcd3990182 Perry Yuan 2023-01-31 229 } 7bc1fcd3990182 Perry Yuan 2023-01-31 230 static inline int cppc_get_epp_perf(int cpunum, u64 *epp_perf) 7bc1fcd3990182 Perry Yuan 2023-01-31 231 { e224a868e488cf Mario Limonciello 2024-09-03 232 return -EOPNOTSUPP; 7bc1fcd3990182 Perry Yuan 2023-01-31 233 } c984f5d5d45bd5 Wyes Karny 2023-03-07 234 static inline int cppc_set_auto_sel(int cpu, bool enable) c984f5d5d45bd5 Wyes Karny 2023-03-07 235 { e224a868e488cf Mario Limonciello 2024-09-03 236 return -EOPNOTSUPP; c984f5d5d45bd5 Wyes Karny 2023-03-07 237 } c984f5d5d45bd5 Wyes Karny 2023-03-07 238 static inline int cppc_get_auto_sel_caps(int cpunum, struct cppc_perf_caps *perf_caps) c984f5d5d45bd5 Wyes Karny 2023-03-07 239 { e224a868e488cf Mario Limonciello 2024-09-03 240 return -EOPNOTSUPP; c984f5d5d45bd5 Wyes Karny 2023-03-07 241 } cfa6630658f7de Mario Limonciello 2024-09-03 @242 static inline int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf) cfa6630658f7de Mario Limonciello 2024-09-03 243 { cfa6630658f7de Mario Limonciello 2024-09-03 244 return -ENODEV; cfa6630658f7de Mario Limonciello 2024-09-03 245 } 402eea79aece78 Mario Limonciello 2024-09-03 @246 static inline int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator) 402eea79aece78 Mario Limonciello 2024-09-03 247 { 402eea79aece78 Mario Limonciello 2024-09-03 248 return -EOPNOTSUPP; 402eea79aece78 Mario Limonciello 2024-09-03 249 } 7885bc49834406 Mario Limonciello 2024-09-03 250 static inline int amd_detect_prefcore(bool *detected) 7885bc49834406 Mario Limonciello 2024-09-03 251 { 7885bc49834406 Mario Limonciello 2024-09-03 252 return -ENODEV; 7885bc49834406 Mario Limonciello 2024-09-03 253 } 8a02d99876362f Rafael J. Wysocki 2021-03-16 254 #endif /* !CONFIG_ACPI_CPPC_LIB */ 337aadff8e4567 Ashwin Chaugule 2015-10-02 255
diff --git a/arch/x86/kernel/acpi/cppc.c b/arch/x86/kernel/acpi/cppc.c index a75dcb382c786..df367bc359308 100644 --- a/arch/x86/kernel/acpi/cppc.c +++ b/arch/x86/kernel/acpi/cppc.c @@ -9,6 +9,16 @@ #include <asm/processor.h> #include <asm/topology.h> +#define CPPC_HIGHEST_PERF_PREFCORE 166 + +enum amd_pref_core { + AMD_PREF_CORE_UNKNOWN = 0, + AMD_PREF_CORE_SUPPORTED, + AMD_PREF_CORE_UNSUPPORTED, +}; +static enum amd_pref_core amd_pref_core_detected; +static u64 boost_numerator; + /* Refer to drivers/acpi/cppc_acpi.c for the description of functions */ bool cpc_supported_by_cpu(void) @@ -146,6 +156,66 @@ int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf) } EXPORT_SYMBOL_GPL(amd_get_highest_perf); +/** + * amd_detect_prefcore: Detect if CPUs in the system support preferred cores + * @detected: Output variable for the result of the detection. + * + * Determine whether CPUs in the system support preferred cores. On systems + * that support preferred cores, different highest perf values will be found + * on different cores. On other systems, the highest perf value will be the + * same on all cores. + * + * The result of the detection will be stored in the 'detected' parameter. + * + * Return: 0 for success, negative error code otherwise + */ +int amd_detect_prefcore(bool *detected) +{ + int cpu, count = 0; + u64 highest_perf[2] = {0}; + + if (WARN_ON(!detected)) + return -EINVAL; + + switch (amd_pref_core_detected) { + case AMD_PREF_CORE_SUPPORTED: + *detected = true; + return 0; + case AMD_PREF_CORE_UNSUPPORTED: + *detected = false; + return 0; + default: + break; + } + + for_each_present_cpu(cpu) { + u32 tmp; + int ret; + + ret = amd_get_highest_perf(cpu, &tmp); + if (ret) + return ret; + + if (!count || (count == 1 && tmp != highest_perf[0])) + highest_perf[count++] = tmp; + + if (count == 2) + break; + } + + *detected = (count == 2); + boost_numerator = highest_perf[0]; + + amd_pref_core_detected = *detected ? AMD_PREF_CORE_SUPPORTED : + AMD_PREF_CORE_UNSUPPORTED; + + pr_debug("AMD CPPC preferred core is %ssupported (highest perf: 0x%llx)\n", + *detected ? "" : "un", highest_perf[0]); + + return 0; +} +EXPORT_SYMBOL_GPL(amd_detect_prefcore); + /** * amd_get_boost_ratio_numerator: Get the numerator to use for boost ratio calculation * @cpu: CPU to get numerator for. @@ -155,24 +225,27 @@ EXPORT_SYMBOL_GPL(amd_get_highest_perf); * a CPU. On systems that support preferred cores, this will be a hardcoded * value. On other systems this will the highest performance register value. * + * If booting the system with amd-pstate enabled but preferred cores disabled then + * the correct boost numerator will be returned to match hardware capabilities + * even if the preferred cores scheduling hints are not enabled. + * * Return: 0 for success, negative error code otherwise. */ int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator) { - struct cpuinfo_x86 *c = &boot_cpu_data; + bool prefcore; + int ret; - if (c->x86 == 0x17 && ((c->x86_model >= 0x30 && c->x86_model < 0x40) || - (c->x86_model >= 0x70 && c->x86_model < 0x80))) { - *numerator = 166; - return 0; - } + ret = amd_detect_prefcore(&prefcore); + if (ret) + return ret; - if (c->x86 == 0x19 && ((c->x86_model >= 0x20 && c->x86_model < 0x30) || - (c->x86_model >= 0x40 && c->x86_model < 0x70))) { - *numerator = 166; + /* without preferred cores, return the highest perf register value */ + if (!prefcore) { + *numerator = boost_numerator; return 0; } - *numerator = 255; + *numerator = CPPC_HIGHEST_PERF_PREFCORE; return 0; } diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c index 44df6ef66b5fa..c29cdf2d3882c 100644 --- a/drivers/cpufreq/amd-pstate.c +++ b/drivers/cpufreq/amd-pstate.c @@ -807,32 +807,18 @@ static DECLARE_WORK(sched_prefcore_work, amd_pstste_sched_prefcore_workfn); static void amd_pstate_init_prefcore(struct amd_cpudata *cpudata) { - int ret, prio; - u32 highest_perf; - - ret = amd_get_highest_perf(cpudata->cpu, &highest_perf); - if (ret) + /* user disabled or not detected */ + if (!amd_pstate_prefcore) return; cpudata->hw_prefcore = true; - /* check if CPPC preferred core feature is enabled*/ - if (highest_perf < CPPC_MAX_PERF) - prio = (int)highest_perf; - else { - pr_debug("AMD CPPC preferred core is unsupported!\n"); - cpudata->hw_prefcore = false; - return; - } - - if (!amd_pstate_prefcore) - return; /* * The priorities can be set regardless of whether or not * sched_set_itmt_support(true) has been called and it is valid to * update them at any time after it has been called. */ - sched_set_itmt_core_prio(prio, cpudata->cpu); + sched_set_itmt_core_prio((int)READ_ONCE(cpudata->highest_perf), cpudata->cpu); schedule_work(&sched_prefcore_work); } @@ -998,12 +984,12 @@ static int amd_pstate_cpu_init(struct cpufreq_policy *policy) cpudata->cpu = policy->cpu; - amd_pstate_init_prefcore(cpudata); - ret = amd_pstate_init_perf(cpudata); if (ret) goto free_cpudata1; + amd_pstate_init_prefcore(cpudata); + ret = amd_pstate_init_freq(cpudata); if (ret) goto free_cpudata1; @@ -1453,12 +1439,12 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy) cpudata->cpu = policy->cpu; cpudata->epp_policy = 0; - amd_pstate_init_prefcore(cpudata); - ret = amd_pstate_init_perf(cpudata); if (ret) goto free_cpudata1; + amd_pstate_init_prefcore(cpudata); + ret = amd_pstate_init_freq(cpudata); if (ret) goto free_cpudata1; @@ -1920,6 +1906,12 @@ static int __init amd_pstate_init(void) static_call_update(amd_pstate_update_perf, cppc_update_perf); } + if (amd_pstate_prefcore) { + ret = amd_detect_prefcore(&amd_pstate_prefcore); + if (ret) + return ret; + } + /* enable amd pstate feature */ ret = amd_pstate_enable(true); if (ret) { diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h index f7c7abf2a95e9..67325a9294ba1 100644 --- a/include/acpi/cppc_acpi.h +++ b/include/acpi/cppc_acpi.h @@ -136,6 +136,8 @@ struct cppc_cpudata { cpumask_var_t shared_cpu_map; }; +extern int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf); +extern int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator); #ifdef CONFIG_ACPI_CPPC_LIB extern int cppc_get_desired_perf(int cpunum, u64 *desired_perf); extern int cppc_get_nominal_perf(int cpunum, u64 *nominal_perf); @@ -161,6 +163,7 @@ extern int cppc_get_auto_sel_caps(int cpunum, struct cppc_perf_caps *perf_caps); extern int cppc_set_auto_sel(int cpu, bool enable); extern int amd_get_highest_perf(unsigned int cpu, u32 *highest_perf); extern int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator); +extern int amd_detect_prefcore(bool *detected); #else /* !CONFIG_ACPI_CPPC_LIB */ static inline int cppc_get_desired_perf(int cpunum, u64 *desired_perf) { @@ -242,6 +245,10 @@ static inline int amd_get_boost_ratio_numerator(unsigned int cpu, u64 *numerator { return -EOPNOTSUPP; } +static inline int amd_detect_prefcore(bool *detected) +{ + return -ENODEV; +} #endif /* !CONFIG_ACPI_CPPC_LIB */ #endif /* _CPPC_ACPI_H*/