Lines Matching +full:p +full:- +full:states

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * processor_perflib.c - ACPI Processor P-States Library ($Revision: 71 $)
9 * - Added processor hotplug support
39 * -1 -> cpufreq low level drivers not initialized -> _PSS, etc. not called yet
41 * 0 -> cpufreq low level drivers initialized -> consider _PPC values
42 * 1 -> ignore _PPC totally -> forced by user through boot param
44 static int ignore_ppc = -1;
60 return -EINVAL; in acpi_processor_get_platform_limit()
64 * (e.g. 0 = states 0..n; 1 = states 1..n; etc. in acpi_processor_get_platform_limit()
66 status = acpi_evaluate_integer(pr->handle, "_PPC", NULL, &ppc); in acpi_processor_get_platform_limit()
71 acpi_evaluation_failure_warn(pr->handle, "_PPC", status); in acpi_processor_get_platform_limit()
72 return -ENODEV; in acpi_processor_get_platform_limit()
78 if (pr->performance_platform_limit == index || in acpi_processor_get_platform_limit()
79 ppc >= pr->performance->state_count) in acpi_processor_get_platform_limit()
82 pr_debug("CPU %d: _PPC is %d - frequency %s limited\n", pr->id, in acpi_processor_get_platform_limit()
85 pr->performance_platform_limit = index; in acpi_processor_get_platform_limit()
87 if (unlikely(!freq_qos_request_active(&pr->perflib_req))) in acpi_processor_get_platform_limit()
91 * If _PPC returns 0, it means that all of the available states can be in acpi_processor_get_platform_limit()
97 qos_value = pr->performance->states[index].core_frequency * 1000; in acpi_processor_get_platform_limit()
99 ret = freq_qos_update_request(&pr->perflib_req, qos_value); in acpi_processor_get_platform_limit()
102 pr->id, ret); in acpi_processor_get_platform_limit()
114 * 1: failure. OSPM has not changed the number of P-states in use
127 if (ignore_ppc || !pr->performance) { in acpi_processor_ppc_has_changed()
133 acpi_processor_ppc_ost(pr->handle, 1); in acpi_processor_ppc_has_changed()
144 acpi_processor_ppc_ost(pr->handle, 1); in acpi_processor_ppc_has_changed()
146 acpi_processor_ppc_ost(pr->handle, 0); in acpi_processor_ppc_has_changed()
149 cpufreq_update_limits(pr->id); in acpi_processor_ppc_has_changed()
157 if (!pr || !pr->performance || !pr->performance->state_count) in acpi_processor_get_bios_limit()
158 return -ENODEV; in acpi_processor_get_bios_limit()
160 *limit = pr->performance->states[pr->performance_platform_limit]. in acpi_processor_get_bios_limit()
179 for_each_cpu(cpu, policy->related_cpus) { in acpi_processor_ppc_init()
191 pr->performance_platform_limit = 0; in acpi_processor_ppc_init()
193 ret = freq_qos_add_request(&policy->constraints, in acpi_processor_ppc_init()
194 &pr->perflib_req, FREQ_QOS_MAX, in acpi_processor_ppc_init()
200 if (!pr->performance) in acpi_processor_ppc_init()
214 for_each_cpu(cpu, policy->related_cpus) { in acpi_processor_ppc_exit()
218 freq_qos_remove_request(&pr->perflib_req); in acpi_processor_ppc_exit()
234 status = acpi_evaluate_object(pr->handle, "_PCT", NULL, &buffer); in acpi_processor_get_performance_control()
236 acpi_evaluation_failure_warn(pr->handle, "_PCT", status); in acpi_processor_get_performance_control()
237 return -ENODEV; in acpi_processor_get_performance_control()
241 if (!pct || pct->type != ACPI_TYPE_PACKAGE || pct->package.count != 2) { in acpi_processor_get_performance_control()
243 result = -EFAULT; in acpi_processor_get_performance_control()
251 obj = pct->package.elements[0]; in acpi_processor_get_performance_control()
256 result = -EFAULT; in acpi_processor_get_performance_control()
259 memcpy(&pr->performance->control_register, obj.buffer.pointer, in acpi_processor_get_performance_control()
266 obj = pct->package.elements[1]; in acpi_processor_get_performance_control()
271 result = -EFAULT; in acpi_processor_get_performance_control()
275 memcpy(&pr->performance->status_register, obj.buffer.pointer, in acpi_processor_get_performance_control()
291 int index = px->control & 0x00000007; in amd_fixup_frequency()
301 * Bit 63: PstateEn. Read-write. If set, the P-state is valid. in amd_fixup_frequency()
309 px->core_frequency = (100 * (fid + 0x10)) >> did; in amd_fixup_frequency()
311 px->core_frequency = (100 * (fid + 8)) >> did; in amd_fixup_frequency()
324 int last_invalid = -1; in acpi_processor_get_performance_states()
326 status = acpi_evaluate_object(pr->handle, "_PSS", NULL, &buffer); in acpi_processor_get_performance_states()
328 acpi_evaluation_failure_warn(pr->handle, "_PSS", status); in acpi_processor_get_performance_states()
329 return -ENODEV; in acpi_processor_get_performance_states()
333 if (!pss || pss->type != ACPI_TYPE_PACKAGE) { in acpi_processor_get_performance_states()
335 result = -EFAULT; in acpi_processor_get_performance_states()
339 acpi_handle_debug(pr->handle, "Found %d performance states\n", in acpi_processor_get_performance_states()
340 pss->package.count); in acpi_processor_get_performance_states()
342 pr->performance->state_count = pss->package.count; in acpi_processor_get_performance_states()
343 pr->performance->states = in acpi_processor_get_performance_states()
344 kmalloc_array(pss->package.count, in acpi_processor_get_performance_states()
347 if (!pr->performance->states) { in acpi_processor_get_performance_states()
348 result = -ENOMEM; in acpi_processor_get_performance_states()
352 for (i = 0; i < pr->performance->state_count; i++) { in acpi_processor_get_performance_states()
354 struct acpi_processor_px *px = &(pr->performance->states[i]); in acpi_processor_get_performance_states()
359 acpi_handle_debug(pr->handle, "Extracting state %d\n", i); in acpi_processor_get_performance_states()
361 status = acpi_extract_package(&(pss->package.elements[i]), in acpi_processor_get_performance_states()
364 acpi_handle_warn(pr->handle, "Invalid _PSS data: %s\n", in acpi_processor_get_performance_states()
366 result = -EFAULT; in acpi_processor_get_performance_states()
367 kfree(pr->performance->states); in acpi_processor_get_performance_states()
373 acpi_handle_debug(pr->handle, in acpi_processor_get_performance_states()
376 (u32) px->core_frequency, in acpi_processor_get_performance_states()
377 (u32) px->power, in acpi_processor_get_performance_states()
378 (u32) px->transition_latency, in acpi_processor_get_performance_states()
379 (u32) px->bus_master_latency, in acpi_processor_get_performance_states()
380 (u32) px->control, (u32) px->status); in acpi_processor_get_performance_states()
385 if (!px->core_frequency || in acpi_processor_get_performance_states()
386 (u32)(px->core_frequency * 1000) != px->core_frequency * 1000) { in acpi_processor_get_performance_states()
389 pr->id, px->core_frequency); in acpi_processor_get_performance_states()
390 if (last_invalid == -1) in acpi_processor_get_performance_states()
393 if (last_invalid != -1) { in acpi_processor_get_performance_states()
397 memcpy(&(pr->performance->states[last_invalid]), in acpi_processor_get_performance_states()
406 "No valid BIOS _PSS frequency found for processor %d\n", pr->id); in acpi_processor_get_performance_states()
407 result = -EFAULT; in acpi_processor_get_performance_states()
408 kfree(pr->performance->states); in acpi_processor_get_performance_states()
409 pr->performance->states = NULL; in acpi_processor_get_performance_states()
413 pr->performance->state_count = last_invalid; in acpi_processor_get_performance_states()
425 if (!pr || !pr->performance || !pr->handle) in acpi_processor_get_performance_info()
426 return -EINVAL; in acpi_processor_get_performance_info()
428 if (!acpi_has_method(pr->handle, "_PCT")) { in acpi_processor_get_performance_info()
429 acpi_handle_debug(pr->handle, in acpi_processor_get_performance_info()
430 "ACPI-based processor performance control unavailable\n"); in acpi_processor_get_performance_info()
431 return -ENODEV; in acpi_processor_get_performance_info()
453 if (acpi_has_method(pr->handle, "_PPC")) { in acpi_processor_get_performance_info()
480 return -EIO; in acpi_processor_pstate_control()
489 return -EBUSY; in acpi_processor_notify_smm()
492 return -EINVAL; in acpi_processor_notify_smm()
542 return -ENODEV; in acpi_processor_get_psd()
546 if (!psd || psd->type != ACPI_TYPE_PACKAGE) { in acpi_processor_get_psd()
548 result = -EFAULT; in acpi_processor_get_psd()
552 if (psd->package.count != 1) { in acpi_processor_get_psd()
554 result = -EFAULT; in acpi_processor_get_psd()
561 status = acpi_extract_package(&(psd->package.elements[0]), &format, &state); in acpi_processor_get_psd()
564 result = -EFAULT; in acpi_processor_get_psd()
568 if (pdomain->num_entries != ACPI_PSD_REV0_ENTRIES) { in acpi_processor_get_psd()
570 result = -EFAULT; in acpi_processor_get_psd()
574 if (pdomain->revision != ACPI_PSD_REV0_REVISION) { in acpi_processor_get_psd()
576 result = -EFAULT; in acpi_processor_get_psd()
580 if (pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ALL && in acpi_processor_get_psd()
581 pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ANY && in acpi_processor_get_psd()
582 pdomain->coord_type != DOMAIN_COORD_TYPE_HW_ALL) { in acpi_processor_get_psd()
584 result = -EFAULT; in acpi_processor_get_psd()
606 return -ENOMEM; in acpi_processor_preregister_performance()
612 * changing pr->performance if it has. Check input data as well. in acpi_processor_preregister_performance()
621 if (pr->performance) { in acpi_processor_preregister_performance()
622 retval = -EBUSY; in acpi_processor_preregister_performance()
627 retval = -EINVAL; in acpi_processor_preregister_performance()
638 pr->performance = per_cpu_ptr(performance, i); in acpi_processor_preregister_performance()
639 pdomain = &(pr->performance->domain_info); in acpi_processor_preregister_performance()
640 if (acpi_processor_get_psd(pr->handle, pdomain)) { in acpi_processor_preregister_performance()
641 retval = -EINVAL; in acpi_processor_preregister_performance()
649 * Now that we have _PSD data from all CPUs, lets setup P-state in acpi_processor_preregister_performance()
660 pdomain = &(pr->performance->domain_info); in acpi_processor_preregister_performance()
661 cpumask_set_cpu(i, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
663 if (pdomain->num_processors <= 1) in acpi_processor_preregister_performance()
667 count_target = pdomain->num_processors; in acpi_processor_preregister_performance()
668 if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ALL) in acpi_processor_preregister_performance()
669 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_ALL; in acpi_processor_preregister_performance()
670 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_HW_ALL) in acpi_processor_preregister_performance()
671 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_HW; in acpi_processor_preregister_performance()
672 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ANY) in acpi_processor_preregister_performance()
673 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_ANY; in acpi_processor_preregister_performance()
683 match_pdomain = &(match_pr->performance->domain_info); in acpi_processor_preregister_performance()
684 if (match_pdomain->domain != pdomain->domain) in acpi_processor_preregister_performance()
689 if (match_pdomain->num_processors != count_target) { in acpi_processor_preregister_performance()
690 retval = -EINVAL; in acpi_processor_preregister_performance()
694 if (pdomain->coord_type != match_pdomain->coord_type) { in acpi_processor_preregister_performance()
695 retval = -EINVAL; in acpi_processor_preregister_performance()
700 cpumask_set_cpu(j, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
711 match_pdomain = &(match_pr->performance->domain_info); in acpi_processor_preregister_performance()
712 if (match_pdomain->domain != pdomain->domain) in acpi_processor_preregister_performance()
715 match_pr->performance->shared_type = in acpi_processor_preregister_performance()
716 pr->performance->shared_type; in acpi_processor_preregister_performance()
717 cpumask_copy(match_pr->performance->shared_cpu_map, in acpi_processor_preregister_performance()
718 pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
725 if (!pr || !pr->performance) in acpi_processor_preregister_performance()
730 cpumask_clear(pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
731 cpumask_set_cpu(i, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
732 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_NONE; in acpi_processor_preregister_performance()
734 pr->performance = NULL; /* Will be set for real in register */ in acpi_processor_preregister_performance()
750 return -EINVAL; in acpi_processor_register_performance()
757 return -ENODEV; in acpi_processor_register_performance()
760 if (pr->performance) { in acpi_processor_register_performance()
762 return -EBUSY; in acpi_processor_register_performance()
767 pr->performance = performance; in acpi_processor_register_performance()
770 pr->performance = NULL; in acpi_processor_register_performance()
772 return -EIO; in acpi_processor_register_performance()
790 if (pr->performance) in acpi_processor_unregister_performance()
791 kfree(pr->performance->states); in acpi_processor_unregister_performance()
793 pr->performance = NULL; in acpi_processor_unregister_performance()