Lines Matching +full:disable +full:- +full:hi +full:- +full:speed

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * acpi-cpufreq.c - ACPI Processor P-States Driver
7 * Copyright (C) 2002 - 2004 Dominik Brodowski <linux@brodo.de>
39 MODULE_DESCRIPTION("ACPI Processor P-States Driver");
69 return per_cpu_ptr(acpi_perf_data, data->acpi_perf_cpu); in to_perf_data()
78 u32 lo, hi; in boost_state() local
85 rdmsr_on_cpu(cpu, MSR_IA32_MISC_ENABLE, &lo, &hi); in boost_state()
86 msr = lo | ((u64)hi << 32); in boost_state()
90 rdmsr_on_cpu(cpu, MSR_K7_HWCR, &lo, &hi); in boost_state()
91 msr = lo | ((u64)hi << 32); in boost_state()
115 return -EINVAL; in boost_set_msr()
138 on_each_cpu_mask(policy->cpus, boost_set_msr_each, in set_boost()
141 cpumask_pr_args(policy->cpus), str_enabled_disabled(val)); in set_boost()
148 struct acpi_cpufreq_data *data = policy->driver_data; in show_freqdomain_cpus()
151 return -ENODEV; in show_freqdomain_cpus()
153 return cpufreq_show_cpus(data->freqdomain_cpus, buf); in show_freqdomain_cpus()
166 return -EINVAL; in store_cpb()
170 return -EINVAL; in store_cpb()
203 struct acpi_cpufreq_data *data = policy->driver_data; in extract_io()
209 for (i = 0; i < perf->state_count; i++) { in extract_io()
210 if (value == perf->states[i].status) in extract_io()
211 return policy->freq_table[i].frequency; in extract_io()
218 struct acpi_cpufreq_data *data = policy->driver_data; in extract_msr()
231 cpufreq_for_each_entry(pos, policy->freq_table) in extract_msr()
232 if (msr == perf->states[pos->driver_data].status) in extract_msr()
233 return pos->frequency; in extract_msr()
234 return policy->freq_table[0].frequency; in extract_msr()
239 struct acpi_cpufreq_data *data = policy->driver_data; in extract_freq()
241 switch (data->cpu_feature) { in extract_freq()
262 u32 lo, hi; in cpu_freq_write_intel() local
264 rdmsr(MSR_IA32_PERF_CTL, lo, hi); in cpu_freq_write_intel()
266 wrmsr(MSR_IA32_PERF_CTL, lo, hi); in cpu_freq_write_intel()
286 acpi_os_read_port(reg->address, &val, reg->bit_width); in cpu_freq_read_io()
292 acpi_os_write_port(reg->address, val, reg->bit_width); in cpu_freq_write_io()
309 cmd->val = cmd->func.read(cmd->reg); in do_drv_read()
316 .reg = &perf->control_register, in drv_read()
317 .func.read = data->cpu_freq_read, in drv_read()
331 cmd->func.write(cmd->reg, cmd->val); in do_drv_write()
339 .reg = &perf->control_register, in drv_write()
341 .func.write = data->cpu_freq_write, in drv_write()
380 data = policy->driver_data; in get_cur_freq_on_cpu()
381 if (unlikely(!data || !policy->freq_table)) in get_cur_freq_on_cpu()
384 cached_freq = policy->freq_table[to_perf_data(data)->state].frequency; in get_cur_freq_on_cpu()
391 data->resume = 1; in get_cur_freq_on_cpu()
402 struct acpi_cpufreq_data *data = policy->driver_data; in check_freqs()
418 struct acpi_cpufreq_data *data = policy->driver_data; in acpi_cpufreq_target()
425 return -ENODEV; in acpi_cpufreq_target()
429 next_perf_state = policy->freq_table[index].driver_data; in acpi_cpufreq_target()
430 if (perf->state == next_perf_state) { in acpi_cpufreq_target()
431 if (unlikely(data->resume)) { in acpi_cpufreq_target()
434 data->resume = 0; in acpi_cpufreq_target()
444 * stopped, so we can rely on the stability of policy->cpus. in acpi_cpufreq_target()
446 mask = policy->shared_type == CPUFREQ_SHARED_TYPE_ANY ? in acpi_cpufreq_target()
447 cpumask_of(policy->cpu) : policy->cpus; in acpi_cpufreq_target()
449 drv_write(data, mask, perf->states[next_perf_state].control); in acpi_cpufreq_target()
453 policy->freq_table[index].frequency)) { in acpi_cpufreq_target()
454 pr_debug("%s (%d)\n", __func__, policy->cpu); in acpi_cpufreq_target()
455 result = -EAGAIN; in acpi_cpufreq_target()
460 perf->state = next_perf_state; in acpi_cpufreq_target()
468 struct acpi_cpufreq_data *data = policy->driver_data; in acpi_cpufreq_fast_switch()
476 if (policy->cached_target_freq == target_freq) in acpi_cpufreq_fast_switch()
477 index = policy->cached_resolved_idx; in acpi_cpufreq_fast_switch()
482 entry = &policy->freq_table[index]; in acpi_cpufreq_fast_switch()
483 next_freq = entry->frequency; in acpi_cpufreq_fast_switch()
484 next_perf_state = entry->driver_data; in acpi_cpufreq_fast_switch()
487 if (perf->state == next_perf_state) { in acpi_cpufreq_fast_switch()
488 if (unlikely(data->resume)) in acpi_cpufreq_fast_switch()
489 data->resume = 0; in acpi_cpufreq_fast_switch()
494 data->cpu_freq_write(&perf->control_register, in acpi_cpufreq_fast_switch()
495 perf->states[next_perf_state].control); in acpi_cpufreq_fast_switch()
496 perf->state = next_perf_state; in acpi_cpufreq_fast_switch()
510 unsigned long freqn = perf->states[0].core_frequency * 1000; in acpi_cpufreq_guess_freq()
512 for (i = 0; i < (perf->state_count-1); i++) { in acpi_cpufreq_guess_freq()
514 freqn = perf->states[i+1].core_frequency * 1000; in acpi_cpufreq_guess_freq()
516 perf->state = i; in acpi_cpufreq_guess_freq()
520 perf->state = perf->state_count-1; in acpi_cpufreq_guess_freq()
524 perf->state = 0; in acpi_cpufreq_guess_freq()
525 return perf->states[0].core_frequency * 1000; in acpi_cpufreq_guess_freq()
536 ->shared_cpu_map); in free_acpi_perf_data()
543 * Clear the boost-disable bit on the CPU_DOWN path so that in cpufreq_boost_down_prep()
550 * acpi_cpufreq_early_init - initialize ACPI P-States library
552 * Initialize the ACPI P-States library (drivers/acpi/processor_perflib.c)
565 return -ENOMEM; in acpi_cpufreq_early_init()
569 &per_cpu_ptr(acpi_perf_data, i)->shared_cpu_map, in acpi_cpufreq_early_init()
574 return -ENOMEM; in acpi_cpufreq_early_init()
587 * detected, this has a side effect of making CPU run at a different speed
618 if (c->x86_vendor == X86_VENDOR_INTEL) { in acpi_cpufreq_blacklist()
619 if ((c->x86 == 15) && in acpi_cpufreq_blacklist()
620 (c->x86_model == 6) && in acpi_cpufreq_blacklist()
621 (c->x86_stepping == 8)) { in acpi_cpufreq_blacklist()
622 … Xeon(R) 7100 Errata AL30, processors may lock up on frequency changes: disabling acpi-cpufreq\n"); in acpi_cpufreq_blacklist()
623 return -ENODEV; in acpi_cpufreq_blacklist()
675 unsigned int cpu = policy->cpu; in acpi_cpufreq_cpu_init()
697 return -ENOMEM; in acpi_cpufreq_cpu_init()
699 if (!zalloc_cpumask_var(&data->freqdomain_cpus, GFP_KERNEL)) { in acpi_cpufreq_cpu_init()
700 result = -ENOMEM; in acpi_cpufreq_cpu_init()
705 data->acpi_perf_cpu = cpu; in acpi_cpufreq_cpu_init()
706 policy->driver_data = data; in acpi_cpufreq_cpu_init()
715 policy->shared_type = perf->shared_type; in acpi_cpufreq_cpu_init()
718 * Will let policy->cpus know about dependency only when software in acpi_cpufreq_cpu_init()
721 if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL || in acpi_cpufreq_cpu_init()
722 policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) { in acpi_cpufreq_cpu_init()
723 cpumask_copy(policy->cpus, perf->shared_cpu_map); in acpi_cpufreq_cpu_init()
725 cpumask_copy(data->freqdomain_cpus, perf->shared_cpu_map); in acpi_cpufreq_cpu_init()
730 policy->shared_type = CPUFREQ_SHARED_TYPE_ALL; in acpi_cpufreq_cpu_init()
731 cpumask_copy(policy->cpus, topology_core_cpumask(cpu)); in acpi_cpufreq_cpu_init()
736 cpumask_clear(policy->cpus); in acpi_cpufreq_cpu_init()
737 cpumask_set_cpu(cpu, policy->cpus); in acpi_cpufreq_cpu_init()
738 cpumask_copy(data->freqdomain_cpus, in acpi_cpufreq_cpu_init()
740 policy->shared_type = CPUFREQ_SHARED_TYPE_HW; in acpi_cpufreq_cpu_init()
746 if (perf->state_count <= 1) { in acpi_cpufreq_cpu_init()
747 pr_debug("No P-States\n"); in acpi_cpufreq_cpu_init()
748 result = -ENODEV; in acpi_cpufreq_cpu_init()
752 if (perf->control_register.space_id != perf->status_register.space_id) { in acpi_cpufreq_cpu_init()
753 result = -ENODEV; in acpi_cpufreq_cpu_init()
757 switch (perf->control_register.space_id) { in acpi_cpufreq_cpu_init()
762 result = -ENODEV; in acpi_cpufreq_cpu_init()
766 data->cpu_feature = SYSTEM_IO_CAPABLE; in acpi_cpufreq_cpu_init()
767 data->cpu_freq_read = cpu_freq_read_io; in acpi_cpufreq_cpu_init()
768 data->cpu_freq_write = cpu_freq_write_io; in acpi_cpufreq_cpu_init()
773 data->cpu_feature = SYSTEM_INTEL_MSR_CAPABLE; in acpi_cpufreq_cpu_init()
774 data->cpu_freq_read = cpu_freq_read_intel; in acpi_cpufreq_cpu_init()
775 data->cpu_freq_write = cpu_freq_write_intel; in acpi_cpufreq_cpu_init()
779 data->cpu_feature = SYSTEM_AMD_MSR_CAPABLE; in acpi_cpufreq_cpu_init()
780 data->cpu_freq_read = cpu_freq_read_amd; in acpi_cpufreq_cpu_init()
781 data->cpu_freq_write = cpu_freq_write_amd; in acpi_cpufreq_cpu_init()
784 result = -ENODEV; in acpi_cpufreq_cpu_init()
788 (u32) (perf->control_register.space_id)); in acpi_cpufreq_cpu_init()
789 result = -ENODEV; in acpi_cpufreq_cpu_init()
793 freq_table = kcalloc(perf->state_count + 1, sizeof(*freq_table), in acpi_cpufreq_cpu_init()
796 result = -ENOMEM; in acpi_cpufreq_cpu_init()
801 policy->cpuinfo.transition_latency = 0; in acpi_cpufreq_cpu_init()
802 for (i = 0; i < perf->state_count; i++) { in acpi_cpufreq_cpu_init()
803 if ((perf->states[i].transition_latency * 1000) > in acpi_cpufreq_cpu_init()
804 policy->cpuinfo.transition_latency) in acpi_cpufreq_cpu_init()
805 policy->cpuinfo.transition_latency = in acpi_cpufreq_cpu_init()
806 perf->states[i].transition_latency * 1000; in acpi_cpufreq_cpu_init()
810 if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE && in acpi_cpufreq_cpu_init()
811 policy->cpuinfo.transition_latency > 20 * 1000) { in acpi_cpufreq_cpu_init()
812 policy->cpuinfo.transition_latency = 20 * 1000; in acpi_cpufreq_cpu_init()
813 pr_info_once("P-state transition latency capped at 20 uS\n"); in acpi_cpufreq_cpu_init()
817 for (i = 0; i < perf->state_count; i++) { in acpi_cpufreq_cpu_init()
818 if (i > 0 && perf->states[i].core_frequency >= in acpi_cpufreq_cpu_init()
819 freq_table[valid_states-1].frequency / 1000) in acpi_cpufreq_cpu_init()
824 perf->states[i].core_frequency * 1000; in acpi_cpufreq_cpu_init()
839 policy->cpuinfo.max_freq = freq * max_boost_ratio >> SCHED_CAPACITY_SHIFT; in acpi_cpufreq_cpu_init()
843 * scale-invariance code to use the "nominal" performance for in acpi_cpufreq_cpu_init()
850 policy->freq_table = freq_table; in acpi_cpufreq_cpu_init()
851 perf->state = 0; in acpi_cpufreq_cpu_init()
853 switch (perf->control_register.space_id) { in acpi_cpufreq_cpu_init()
856 * The core will not set policy->cur, because in acpi_cpufreq_cpu_init()
857 * cpufreq_driver->get is NULL, so we need to set it here. in acpi_cpufreq_cpu_init()
858 * However, we have to guess it, because the current speed is in acpi_cpufreq_cpu_init()
861 policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu); in acpi_cpufreq_cpu_init()
873 pr_debug("CPU%u - ACPI performance management activated.\n", cpu); in acpi_cpufreq_cpu_init()
874 for (i = 0; i < perf->state_count; i++) in acpi_cpufreq_cpu_init()
876 (i == perf->state ? '*' : ' '), i, in acpi_cpufreq_cpu_init()
877 (u32) perf->states[i].core_frequency, in acpi_cpufreq_cpu_init()
878 (u32) perf->states[i].power, in acpi_cpufreq_cpu_init()
879 (u32) perf->states[i].transition_latency); in acpi_cpufreq_cpu_init()
882 * the first call to ->target() should result in us actually in acpi_cpufreq_cpu_init()
885 data->resume = 1; in acpi_cpufreq_cpu_init()
887 policy->fast_switch_possible = !acpi_pstate_strict && in acpi_cpufreq_cpu_init()
888 !(policy_is_shared(policy) && policy->shared_type != CPUFREQ_SHARED_TYPE_ANY); in acpi_cpufreq_cpu_init()
890 if (perf->states[0].core_frequency * 1000 != freq_table[0].frequency) in acpi_cpufreq_cpu_init()
891 pr_warn(FW_WARN "P-state 0 is not max freq\n"); in acpi_cpufreq_cpu_init()
901 free_cpumask_var(data->freqdomain_cpus); in acpi_cpufreq_cpu_init()
904 policy->driver_data = NULL; in acpi_cpufreq_cpu_init()
911 struct acpi_cpufreq_data *data = policy->driver_data; in acpi_cpufreq_cpu_exit()
915 cpufreq_boost_down_prep(policy->cpu); in acpi_cpufreq_cpu_exit()
916 policy->fast_switch_possible = false; in acpi_cpufreq_cpu_exit()
917 policy->driver_data = NULL; in acpi_cpufreq_cpu_exit()
918 acpi_processor_unregister_performance(data->acpi_perf_cpu); in acpi_cpufreq_cpu_exit()
919 free_cpumask_var(data->freqdomain_cpus); in acpi_cpufreq_cpu_exit()
920 kfree(policy->freq_table); in acpi_cpufreq_cpu_exit()
928 struct acpi_cpufreq_data *data = policy->driver_data; in acpi_cpufreq_resume()
932 data->resume = 1; in acpi_cpufreq_resume()
954 .name = "acpi-cpufreq",
974 return -ENODEV; in acpi_cpufreq_probe()
978 return -ENODEV; in acpi_cpufreq_probe()
988 * semantic - per CPU instantiation, but system global effect. in acpi_cpufreq_probe()
1025 .name = "acpi-cpufreq",
1042 "value 0 or non-zero. non-zero -> strict ACPI checks are "
1048 MODULE_ALIAS("platform:acpi-cpufreq");