#include <linux/cpufreq.h>
#include <linux/delay.h>
#include <linux/ktime.h>
#include <linux/math64.h>
#include <linux/percpu.h>
#include <linux/rcupdate.h>
#include <linux/sched/isolation.h>
#include <linux/sched/topology.h>
#include <linux/smp.h>
#include <linux/syscore_ops.h>
#include <asm/cpu.h>
#include <asm/cpu_device_id.h>
#include <asm/intel-family.h>
#include "cpu.h"
struct aperfmperf { … };
static DEFINE_PER_CPU_SHARED_ALIGNED(struct aperfmperf, cpu_samples) = …;
static void init_counter_refs(void)
{ … }
#if defined(CONFIG_X86_64) && defined(CONFIG_SMP)
DEFINE_STATIC_KEY_FALSE(arch_scale_freq_key);
static u64 arch_turbo_freq_ratio = …;
static u64 arch_max_freq_ratio = …;
void arch_set_max_freq_ratio(bool turbo_disabled)
{ … }
EXPORT_SYMBOL_GPL(…);
static bool __init turbo_disabled(void)
{ … }
static bool __init slv_set_max_freq_ratio(u64 *base_freq, u64 *turbo_freq)
{ … }
#define X86_MATCH(vfm) …
static const struct x86_cpu_id has_knl_turbo_ratio_limits[] __initconst = …;
static const struct x86_cpu_id has_skx_turbo_ratio_limits[] __initconst = …;
static const struct x86_cpu_id has_glm_turbo_ratio_limits[] __initconst = …;
static bool __init knl_set_max_freq_ratio(u64 *base_freq, u64 *turbo_freq,
int num_delta_fratio)
{ … }
static bool __init skx_set_max_freq_ratio(u64 *base_freq, u64 *turbo_freq, int size)
{ … }
static bool __init core_set_max_freq_ratio(u64 *base_freq, u64 *turbo_freq)
{ … }
static bool __init intel_set_max_freq_ratio(void)
{ … }
#ifdef CONFIG_PM_SLEEP
static struct syscore_ops freq_invariance_syscore_ops = …;
static void register_freq_invariance_syscore_ops(void)
{ … }
#else
static inline void register_freq_invariance_syscore_ops(void) {}
#endif
static void freq_invariance_enable(void)
{ … }
void freq_invariance_set_perf_ratio(u64 ratio, bool turbo_disabled)
{ … }
static void __init bp_init_freq_invariance(void)
{ … }
static void disable_freq_invariance_workfn(struct work_struct *work)
{ … }
static DECLARE_WORK(disable_freq_invariance_work,
disable_freq_invariance_workfn);
DEFINE_PER_CPU(unsigned long, arch_freq_scale) = …;
EXPORT_PER_CPU_SYMBOL_GPL(…);
static DEFINE_STATIC_KEY_FALSE(arch_hybrid_cap_scale_key);
struct arch_hybrid_cpu_scale { … };
static struct arch_hybrid_cpu_scale __percpu *arch_cpu_scale;
bool arch_enable_hybrid_capacity_scale(void)
{ … }
void arch_set_cpu_capacity(int cpu, unsigned long cap, unsigned long max_cap,
unsigned long cap_freq, unsigned long base_freq)
{ … }
unsigned long arch_scale_cpu_capacity(int cpu)
{ … }
EXPORT_SYMBOL_GPL(…);
static void scale_freq_tick(u64 acnt, u64 mcnt)
{ … }
#else
static inline void bp_init_freq_invariance(void) { }
static inline void scale_freq_tick(u64 acnt, u64 mcnt) { }
#endif
void arch_scale_freq_tick(void)
{ … }
#define MAX_SAMPLE_AGE …
unsigned int arch_freq_get_on_cpu(int cpu)
{ … }
static int __init bp_init_aperfmperf(void)
{ … }
early_initcall(bp_init_aperfmperf);
void ap_init_aperfmperf(void)
{ … }