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
38 * -1 -> cpufreq low level drivers not initialized -> _PSS, etc. not called yet
40 * 0 -> cpufreq low level drivers initialized -> consider _PPC values
41 * 1 -> ignore _PPC totally -> forced by user through boot param
43 static int ignore_ppc = -1;
59 return -EINVAL; in acpi_processor_get_platform_limit()
63 * (e.g. 0 = states 0..n; 1 = states 1..n; etc. in acpi_processor_get_platform_limit()
65 status = acpi_evaluate_integer(pr->handle, "_PPC", NULL, &ppc); in acpi_processor_get_platform_limit()
70 acpi_evaluation_failure_warn(pr->handle, "_PPC", status); in acpi_processor_get_platform_limit()
71 return -ENODEV; in acpi_processor_get_platform_limit()
77 if (pr->performance_platform_limit == index || in acpi_processor_get_platform_limit()
78 ppc >= pr->performance->state_count) in acpi_processor_get_platform_limit()
81 pr_debug("CPU %d: _PPC is %d - frequency %s limited\n", pr->id, in acpi_processor_get_platform_limit()
84 pr->performance_platform_limit = index; in acpi_processor_get_platform_limit()
86 if (unlikely(!freq_qos_request_active(&pr->perflib_req))) in acpi_processor_get_platform_limit()
90 * If _PPC returns 0, it means that all of the available states can be in acpi_processor_get_platform_limit()
96 qos_value = pr->performance->states[index].core_frequency * 1000; in acpi_processor_get_platform_limit()
98 ret = freq_qos_update_request(&pr->perflib_req, qos_value); in acpi_processor_get_platform_limit()
101 pr->id, ret); in acpi_processor_get_platform_limit()
113 * 1: failure. OSPM has not changed the number of P-states in use
126 if (ignore_ppc || !pr->performance) { in acpi_processor_ppc_has_changed()
132 acpi_processor_ppc_ost(pr->handle, 1); in acpi_processor_ppc_has_changed()
143 acpi_processor_ppc_ost(pr->handle, 1); in acpi_processor_ppc_has_changed()
145 acpi_processor_ppc_ost(pr->handle, 0); in acpi_processor_ppc_has_changed()
148 cpufreq_update_limits(pr->id); in acpi_processor_ppc_has_changed()
156 if (!pr || !pr->performance || !pr->performance->state_count) in acpi_processor_get_bios_limit()
157 return -ENODEV; in acpi_processor_get_bios_limit()
159 *limit = pr->performance->states[pr->performance_platform_limit]. in acpi_processor_get_bios_limit()
175 for_each_cpu(cpu, policy->related_cpus) { in acpi_processor_ppc_init()
187 pr->performance_platform_limit = 0; in acpi_processor_ppc_init()
189 ret = freq_qos_add_request(&policy->constraints, in acpi_processor_ppc_init()
190 &pr->perflib_req, FREQ_QOS_MAX, in acpi_processor_ppc_init()
202 for_each_cpu(cpu, policy->related_cpus) { in acpi_processor_ppc_exit()
206 freq_qos_remove_request(&pr->perflib_req); in acpi_processor_ppc_exit()
222 status = acpi_evaluate_object(pr->handle, "_PCT", NULL, &buffer); in acpi_processor_get_performance_control()
224 acpi_evaluation_failure_warn(pr->handle, "_PCT", status); in acpi_processor_get_performance_control()
225 return -ENODEV; in acpi_processor_get_performance_control()
229 if (!pct || pct->type != ACPI_TYPE_PACKAGE || pct->package.count != 2) { in acpi_processor_get_performance_control()
231 result = -EFAULT; in acpi_processor_get_performance_control()
239 obj = pct->package.elements[0]; in acpi_processor_get_performance_control()
244 result = -EFAULT; in acpi_processor_get_performance_control()
247 memcpy(&pr->performance->control_register, obj.buffer.pointer, in acpi_processor_get_performance_control()
254 obj = pct->package.elements[1]; in acpi_processor_get_performance_control()
259 result = -EFAULT; in acpi_processor_get_performance_control()
263 memcpy(&pr->performance->status_register, obj.buffer.pointer, in acpi_processor_get_performance_control()
279 int index = px->control & 0x00000007; in amd_fixup_frequency()
289 * Bit 63: PstateEn. Read-write. If set, the P-state is valid. in amd_fixup_frequency()
297 px->core_frequency = (100 * (fid + 0x10)) >> did; in amd_fixup_frequency()
299 px->core_frequency = (100 * (fid + 8)) >> did; in amd_fixup_frequency()
312 int last_invalid = -1; in acpi_processor_get_performance_states()
314 status = acpi_evaluate_object(pr->handle, "_PSS", NULL, &buffer); in acpi_processor_get_performance_states()
316 acpi_evaluation_failure_warn(pr->handle, "_PSS", status); in acpi_processor_get_performance_states()
317 return -ENODEV; in acpi_processor_get_performance_states()
321 if (!pss || pss->type != ACPI_TYPE_PACKAGE) { in acpi_processor_get_performance_states()
323 result = -EFAULT; in acpi_processor_get_performance_states()
327 acpi_handle_debug(pr->handle, "Found %d performance states\n", in acpi_processor_get_performance_states()
328 pss->package.count); in acpi_processor_get_performance_states()
330 pr->performance->state_count = pss->package.count; in acpi_processor_get_performance_states()
331 pr->performance->states = in acpi_processor_get_performance_states()
332 kmalloc_array(pss->package.count, in acpi_processor_get_performance_states()
335 if (!pr->performance->states) { in acpi_processor_get_performance_states()
336 result = -ENOMEM; in acpi_processor_get_performance_states()
340 for (i = 0; i < pr->performance->state_count; i++) { in acpi_processor_get_performance_states()
342 struct acpi_processor_px *px = &(pr->performance->states[i]); in acpi_processor_get_performance_states()
347 acpi_handle_debug(pr->handle, "Extracting state %d\n", i); in acpi_processor_get_performance_states()
349 status = acpi_extract_package(&(pss->package.elements[i]), in acpi_processor_get_performance_states()
352 acpi_handle_warn(pr->handle, "Invalid _PSS data: %s\n", in acpi_processor_get_performance_states()
354 result = -EFAULT; in acpi_processor_get_performance_states()
355 kfree(pr->performance->states); in acpi_processor_get_performance_states()
361 acpi_handle_debug(pr->handle, in acpi_processor_get_performance_states()
364 (u32) px->core_frequency, in acpi_processor_get_performance_states()
365 (u32) px->power, in acpi_processor_get_performance_states()
366 (u32) px->transition_latency, in acpi_processor_get_performance_states()
367 (u32) px->bus_master_latency, in acpi_processor_get_performance_states()
368 (u32) px->control, (u32) px->status); in acpi_processor_get_performance_states()
373 if (!px->core_frequency || in acpi_processor_get_performance_states()
374 (u32)(px->core_frequency * 1000) != px->core_frequency * 1000) { in acpi_processor_get_performance_states()
377 pr->id, px->core_frequency); in acpi_processor_get_performance_states()
378 if (last_invalid == -1) in acpi_processor_get_performance_states()
381 if (last_invalid != -1) { in acpi_processor_get_performance_states()
385 memcpy(&(pr->performance->states[last_invalid]), in acpi_processor_get_performance_states()
394 "No valid BIOS _PSS frequency found for processor %d\n", pr->id); in acpi_processor_get_performance_states()
395 result = -EFAULT; in acpi_processor_get_performance_states()
396 kfree(pr->performance->states); in acpi_processor_get_performance_states()
397 pr->performance->states = NULL; in acpi_processor_get_performance_states()
401 pr->performance->state_count = last_invalid; in acpi_processor_get_performance_states()
413 if (!pr || !pr->performance || !pr->handle) in acpi_processor_get_performance_info()
414 return -EINVAL; in acpi_processor_get_performance_info()
416 if (!acpi_has_method(pr->handle, "_PCT")) { in acpi_processor_get_performance_info()
417 acpi_handle_debug(pr->handle, in acpi_processor_get_performance_info()
418 "ACPI-based processor performance control unavailable\n"); in acpi_processor_get_performance_info()
419 return -ENODEV; in acpi_processor_get_performance_info()
441 if (acpi_has_method(pr->handle, "_PPC")) { in acpi_processor_get_performance_info()
468 return -EIO; in acpi_processor_pstate_control()
477 return -EBUSY; in acpi_processor_notify_smm()
480 return -EINVAL; in acpi_processor_notify_smm()
530 return -ENODEV; in acpi_processor_get_psd()
534 if (!psd || psd->type != ACPI_TYPE_PACKAGE) { in acpi_processor_get_psd()
536 result = -EFAULT; in acpi_processor_get_psd()
540 if (psd->package.count != 1) { in acpi_processor_get_psd()
542 result = -EFAULT; in acpi_processor_get_psd()
549 status = acpi_extract_package(&(psd->package.elements[0]), &format, &state); in acpi_processor_get_psd()
552 result = -EFAULT; in acpi_processor_get_psd()
556 if (pdomain->num_entries != ACPI_PSD_REV0_ENTRIES) { in acpi_processor_get_psd()
558 result = -EFAULT; in acpi_processor_get_psd()
562 if (pdomain->revision != ACPI_PSD_REV0_REVISION) { in acpi_processor_get_psd()
564 result = -EFAULT; in acpi_processor_get_psd()
568 if (pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ALL && in acpi_processor_get_psd()
569 pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ANY && in acpi_processor_get_psd()
570 pdomain->coord_type != DOMAIN_COORD_TYPE_HW_ALL) { in acpi_processor_get_psd()
572 result = -EFAULT; in acpi_processor_get_psd()
594 return -ENOMEM; in acpi_processor_preregister_performance()
600 * changing pr->performance if it has. Check input data as well. in acpi_processor_preregister_performance()
609 if (pr->performance) { in acpi_processor_preregister_performance()
610 retval = -EBUSY; in acpi_processor_preregister_performance()
615 retval = -EINVAL; in acpi_processor_preregister_performance()
626 pr->performance = per_cpu_ptr(performance, i); in acpi_processor_preregister_performance()
627 pdomain = &(pr->performance->domain_info); in acpi_processor_preregister_performance()
628 if (acpi_processor_get_psd(pr->handle, pdomain)) { in acpi_processor_preregister_performance()
629 retval = -EINVAL; in acpi_processor_preregister_performance()
637 * Now that we have _PSD data from all CPUs, lets setup P-state in acpi_processor_preregister_performance()
648 pdomain = &(pr->performance->domain_info); in acpi_processor_preregister_performance()
649 cpumask_set_cpu(i, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
651 if (pdomain->num_processors <= 1) in acpi_processor_preregister_performance()
655 count_target = pdomain->num_processors; in acpi_processor_preregister_performance()
656 if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ALL) in acpi_processor_preregister_performance()
657 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_ALL; in acpi_processor_preregister_performance()
658 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_HW_ALL) in acpi_processor_preregister_performance()
659 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_HW; in acpi_processor_preregister_performance()
660 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ANY) in acpi_processor_preregister_performance()
661 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_ANY; in acpi_processor_preregister_performance()
671 match_pdomain = &(match_pr->performance->domain_info); in acpi_processor_preregister_performance()
672 if (match_pdomain->domain != pdomain->domain) in acpi_processor_preregister_performance()
677 if (match_pdomain->num_processors != count_target) { in acpi_processor_preregister_performance()
678 retval = -EINVAL; in acpi_processor_preregister_performance()
682 if (pdomain->coord_type != match_pdomain->coord_type) { in acpi_processor_preregister_performance()
683 retval = -EINVAL; in acpi_processor_preregister_performance()
688 cpumask_set_cpu(j, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
699 match_pdomain = &(match_pr->performance->domain_info); in acpi_processor_preregister_performance()
700 if (match_pdomain->domain != pdomain->domain) in acpi_processor_preregister_performance()
703 match_pr->performance->shared_type = in acpi_processor_preregister_performance()
704 pr->performance->shared_type; in acpi_processor_preregister_performance()
705 cpumask_copy(match_pr->performance->shared_cpu_map, in acpi_processor_preregister_performance()
706 pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
713 if (!pr || !pr->performance) in acpi_processor_preregister_performance()
718 cpumask_clear(pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
719 cpumask_set_cpu(i, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
720 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_NONE; in acpi_processor_preregister_performance()
722 pr->performance = NULL; /* Will be set for real in register */ in acpi_processor_preregister_performance()
738 return -EINVAL; in acpi_processor_register_performance()
745 return -ENODEV; in acpi_processor_register_performance()
748 if (pr->performance) { in acpi_processor_register_performance()
750 return -EBUSY; in acpi_processor_register_performance()
755 pr->performance = performance; in acpi_processor_register_performance()
758 pr->performance = NULL; in acpi_processor_register_performance()
760 return -EIO; in acpi_processor_register_performance()
778 if (pr->performance) in acpi_processor_unregister_performance()
779 kfree(pr->performance->states); in acpi_processor_unregister_performance()
781 pr->performance = NULL; in acpi_processor_unregister_performance()