Lines Matching +full:cpu +full:- +full:capacity
1 // SPDX-License-Identifier: GPL-2.0-only
20 #include <asm/cpu.h>
22 #include <asm/intel-family.h>
24 #include "cpu.h"
58 * Since the frequency freq_curr on x86 is controlled by micro-controller and
59 * our P-state setting is little more than a request/hint, we need to observe
65 * where freq_base is the max non-turbo P-state.
178 fratio -= delta_fratio; in knl_set_max_freq_ratio()
234 /* The CPU may have less than 4 cores */ in core_set_max_freq_ratio()
274 …pr_debug("Couldn't determine cpu base or turbo frequency, necessary for scale-invariant accounting… in intel_set_max_freq_ratio()
280 pr_debug("Non-zero turbo and base frequencies led to a 0 ratio.\n"); in intel_set_max_freq_ratio()
334 int cpu; in disable_freq_invariance_workfn() local
342 for_each_possible_cpu(cpu) in disable_freq_invariance_workfn()
343 per_cpu(arch_freq_scale, cpu) = SCHED_CAPACITY_SCALE; in disable_freq_invariance_workfn()
355 unsigned long capacity; member
362 * arch_enable_hybrid_capacity_scale() - Enable hybrid CPU capacity scaling
364 * Allocate memory for per-CPU data used by hybrid CPU capacity scaling,
371 int cpu; in arch_enable_hybrid_capacity_scale() local
374 WARN_ONCE(1, "Hybrid CPU capacity scaling already enabled"); in arch_enable_hybrid_capacity_scale()
382 for_each_possible_cpu(cpu) { in arch_enable_hybrid_capacity_scale()
383 per_cpu_ptr(arch_cpu_scale, cpu)->capacity = SCHED_CAPACITY_SCALE; in arch_enable_hybrid_capacity_scale()
384 per_cpu_ptr(arch_cpu_scale, cpu)->freq_ratio = arch_max_freq_ratio; in arch_enable_hybrid_capacity_scale()
389 pr_info("Hybrid CPU capacity scaling enabled\n"); in arch_enable_hybrid_capacity_scale()
395 * arch_set_cpu_capacity() - Set scale-invariance parameters for a CPU
396 * @cpu: Target CPU.
397 * @cap: Capacity of @cpu at its maximum frequency, relative to @max_cap.
398 * @max_cap: System-wide maximum CPU capacity.
399 * @cap_freq: Frequency of @cpu corresponding to @cap.
400 * @base_freq: Frequency of @cpu at which MPERF counts.
407 * to let the scheduler know that capacity-aware scheduling can be used going
410 void arch_set_cpu_capacity(int cpu, unsigned long cap, unsigned long max_cap, in arch_set_cpu_capacity() argument
414 WRITE_ONCE(per_cpu_ptr(arch_cpu_scale, cpu)->capacity, in arch_set_cpu_capacity()
416 WRITE_ONCE(per_cpu_ptr(arch_cpu_scale, cpu)->freq_ratio, in arch_set_cpu_capacity()
419 WARN_ONCE(1, "Hybrid CPU capacity scaling not enabled"); in arch_set_cpu_capacity()
423 unsigned long arch_scale_cpu_capacity(int cpu) in arch_scale_cpu_capacity() argument
426 return READ_ONCE(per_cpu_ptr(arch_cpu_scale, cpu)->capacity); in arch_scale_cpu_capacity()
443 freq_ratio = READ_ONCE(this_cpu_ptr(arch_cpu_scale)->freq_ratio); in scale_freq_tick()
479 acnt = aperf - s->aperf; in arch_scale_freq_tick()
480 mcnt = mperf - s->mperf; in arch_scale_freq_tick()
482 s->aperf = aperf; in arch_scale_freq_tick()
483 s->mperf = mperf; in arch_scale_freq_tick()
485 raw_write_seqcount_begin(&s->seq); in arch_scale_freq_tick()
486 s->last_update = jiffies; in arch_scale_freq_tick()
487 s->acnt = acnt; in arch_scale_freq_tick()
488 s->mcnt = mcnt; in arch_scale_freq_tick()
489 raw_write_seqcount_end(&s->seq); in arch_scale_freq_tick()
497 * not running then the CPU is either idle or isolated.
501 unsigned int arch_freq_get_on_cpu(int cpu) in arch_freq_get_on_cpu() argument
503 struct aperfmperf *s = per_cpu_ptr(&cpu_samples, cpu); in arch_freq_get_on_cpu()
512 seq = raw_read_seqcount_begin(&s->seq); in arch_freq_get_on_cpu()
513 last = s->last_update; in arch_freq_get_on_cpu()
514 acnt = s->acnt; in arch_freq_get_on_cpu()
515 mcnt = s->mcnt; in arch_freq_get_on_cpu()
516 } while (read_seqcount_retry(&s->seq, seq)); in arch_freq_get_on_cpu()
522 if (!mcnt || (jiffies - last) > MAX_SAMPLE_AGE) in arch_freq_get_on_cpu()
528 freq = cpufreq_quick_get(cpu); in arch_freq_get_on_cpu()