Lines Matching +full:lo +full:- +full:freq +full:- +full:khz
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
40 * -1 -> cpufreq low level drivers not initialized -> _PSS, etc. not called yet
42 * 0 -> cpufreq low level drivers initialized -> consider _PPC values
43 * 1 -> ignore _PPC totally -> forced by user through boot param
45 static int ignore_ppc = -1;
61 return -EINVAL; in acpi_processor_get_platform_limit()
67 status = acpi_evaluate_integer(pr->handle, "_PPC", NULL, &ppc); in acpi_processor_get_platform_limit()
72 acpi_evaluation_failure_warn(pr->handle, "_PPC", status); in acpi_processor_get_platform_limit()
73 return -ENODEV; in acpi_processor_get_platform_limit()
79 if (pr->performance_platform_limit == index || in acpi_processor_get_platform_limit()
80 ppc >= pr->performance->state_count) in acpi_processor_get_platform_limit()
83 pr_debug("CPU %d: _PPC is %d - frequency %s limited\n", pr->id, in acpi_processor_get_platform_limit()
86 pr->performance_platform_limit = index; in acpi_processor_get_platform_limit()
88 if (unlikely(!freq_qos_request_active(&pr->perflib_req))) in acpi_processor_get_platform_limit()
98 qos_value = pr->performance->states[index].core_frequency * 1000; in acpi_processor_get_platform_limit()
100 ret = freq_qos_update_request(&pr->perflib_req, qos_value); in acpi_processor_get_platform_limit()
102 pr_warn("Failed to update perflib freq constraint: CPU%d (%d)\n", in acpi_processor_get_platform_limit()
103 pr->id, ret); in acpi_processor_get_platform_limit()
115 * 1: failure. OSPM has not changed the number of P-states in use
128 if (ignore_ppc || !pr->performance) { in acpi_processor_ppc_has_changed()
134 acpi_processor_ppc_ost(pr->handle, 1); in acpi_processor_ppc_has_changed()
145 acpi_processor_ppc_ost(pr->handle, 1); in acpi_processor_ppc_has_changed()
147 acpi_processor_ppc_ost(pr->handle, 0); in acpi_processor_ppc_has_changed()
150 cpufreq_update_limits(pr->id); in acpi_processor_ppc_has_changed()
158 if (!pr || !pr->performance || !pr->performance->state_count) in acpi_processor_get_bios_limit()
159 return -ENODEV; in acpi_processor_get_bios_limit()
161 *limit = pr->performance->states[pr->performance_platform_limit]. in acpi_processor_get_bios_limit()
177 for_each_cpu(cpu, policy->related_cpus) { in acpi_processor_ppc_init()
189 pr->performance_platform_limit = 0; in acpi_processor_ppc_init()
191 ret = freq_qos_add_request(&policy->constraints, in acpi_processor_ppc_init()
192 &pr->perflib_req, FREQ_QOS_MAX, in acpi_processor_ppc_init()
195 pr_err("Failed to add freq constraint for CPU%d (%d)\n", in acpi_processor_ppc_init()
204 for_each_cpu(cpu, policy->related_cpus) { in acpi_processor_ppc_exit()
208 freq_qos_remove_request(&pr->perflib_req); in acpi_processor_ppc_exit()
220 status = acpi_evaluate_object(pr->handle, "_PCT", NULL, &buffer); in acpi_processor_get_performance_control()
222 acpi_evaluation_failure_warn(pr->handle, "_PCT", status); in acpi_processor_get_performance_control()
223 return -ENODEV; in acpi_processor_get_performance_control()
227 if (!pct || pct->type != ACPI_TYPE_PACKAGE || pct->package.count != 2) { in acpi_processor_get_performance_control()
229 result = -EFAULT; in acpi_processor_get_performance_control()
237 obj = pct->package.elements[0]; in acpi_processor_get_performance_control()
242 result = -EFAULT; in acpi_processor_get_performance_control()
245 memcpy(&pr->performance->control_register, obj.buffer.pointer, in acpi_processor_get_performance_control()
252 obj = pct->package.elements[1]; in acpi_processor_get_performance_control()
257 result = -EFAULT; in acpi_processor_get_performance_control()
261 memcpy(&pr->performance->status_register, obj.buffer.pointer, in acpi_processor_get_performance_control()
277 u32 hi, lo, fid, did; in amd_fixup_frequency() local
278 int index = px->control & 0x00000007; in amd_fixup_frequency()
285 rdmsr(MSR_AMD_PSTATE_DEF_BASE + index, lo, hi); in amd_fixup_frequency()
288 * Bit 63: PstateEn. Read-write. If set, the P-state is valid. in amd_fixup_frequency()
293 fid = lo & 0x3f; in amd_fixup_frequency()
294 did = (lo >> 6) & 7; in amd_fixup_frequency()
296 px->core_frequency = (100 * (fid + 0x10)) >> did; in amd_fixup_frequency()
298 px->core_frequency = (100 * (fid + 8)) >> did; in amd_fixup_frequency()
314 int last_invalid = -1; in acpi_processor_get_performance_states()
316 status = acpi_evaluate_object(pr->handle, "_PSS", NULL, &buffer); in acpi_processor_get_performance_states()
318 acpi_evaluation_failure_warn(pr->handle, "_PSS", status); in acpi_processor_get_performance_states()
319 return -ENODEV; in acpi_processor_get_performance_states()
323 if (!pss || pss->type != ACPI_TYPE_PACKAGE) { in acpi_processor_get_performance_states()
325 result = -EFAULT; in acpi_processor_get_performance_states()
329 acpi_handle_debug(pr->handle, "Found %d performance states\n", in acpi_processor_get_performance_states()
330 pss->package.count); in acpi_processor_get_performance_states()
332 pr->performance->state_count = pss->package.count; in acpi_processor_get_performance_states()
333 pr->performance->states = in acpi_processor_get_performance_states()
334 kmalloc_array(pss->package.count, in acpi_processor_get_performance_states()
337 if (!pr->performance->states) { in acpi_processor_get_performance_states()
338 result = -ENOMEM; in acpi_processor_get_performance_states()
342 for (i = 0; i < pr->performance->state_count; i++) { in acpi_processor_get_performance_states()
344 struct acpi_processor_px *px = &(pr->performance->states[i]); in acpi_processor_get_performance_states()
349 acpi_handle_debug(pr->handle, "Extracting state %d\n", i); in acpi_processor_get_performance_states()
351 status = acpi_extract_package(&(pss->package.elements[i]), in acpi_processor_get_performance_states()
354 acpi_handle_warn(pr->handle, "Invalid _PSS data: %s\n", in acpi_processor_get_performance_states()
356 result = -EFAULT; in acpi_processor_get_performance_states()
357 kfree(pr->performance->states); in acpi_processor_get_performance_states()
363 acpi_handle_debug(pr->handle, in acpi_processor_get_performance_states()
366 (u32) px->core_frequency, in acpi_processor_get_performance_states()
367 (u32) px->power, in acpi_processor_get_performance_states()
368 (u32) px->transition_latency, in acpi_processor_get_performance_states()
369 (u32) px->bus_master_latency, in acpi_processor_get_performance_states()
370 (u32) px->control, (u32) px->status); in acpi_processor_get_performance_states()
373 * Check that ACPI's u64 MHz will be valid as u32 KHz in cpufreq in acpi_processor_get_performance_states()
375 if (!px->core_frequency || in acpi_processor_get_performance_states()
376 (u32)(px->core_frequency * 1000) != px->core_frequency * 1000) { in acpi_processor_get_performance_states()
379 pr->id, px->core_frequency); in acpi_processor_get_performance_states()
380 if (last_invalid == -1) in acpi_processor_get_performance_states()
383 if (last_invalid != -1) { in acpi_processor_get_performance_states()
387 memcpy(&(pr->performance->states[last_invalid]), in acpi_processor_get_performance_states()
396 "No valid BIOS _PSS frequency found for processor %d\n", pr->id); in acpi_processor_get_performance_states()
397 result = -EFAULT; in acpi_processor_get_performance_states()
398 kfree(pr->performance->states); in acpi_processor_get_performance_states()
399 pr->performance->states = NULL; in acpi_processor_get_performance_states()
403 pr->performance->state_count = last_invalid; in acpi_processor_get_performance_states()
415 if (!pr || !pr->performance || !pr->handle) in acpi_processor_get_performance_info()
416 return -EINVAL; in acpi_processor_get_performance_info()
418 if (!acpi_has_method(pr->handle, "_PCT")) { in acpi_processor_get_performance_info()
419 acpi_handle_debug(pr->handle, in acpi_processor_get_performance_info()
420 "ACPI-based processor performance control unavailable\n"); in acpi_processor_get_performance_info()
421 return -ENODEV; in acpi_processor_get_performance_info()
444 if (acpi_has_method(pr->handle, "_PPC")) { in acpi_processor_get_performance_info()
472 return -EIO; in acpi_processor_pstate_control()
481 return -EBUSY; in acpi_processor_notify_smm()
484 return -EINVAL; in acpi_processor_notify_smm()
534 return -ENODEV; in acpi_processor_get_psd()
538 if (!psd || psd->type != ACPI_TYPE_PACKAGE) { in acpi_processor_get_psd()
540 result = -EFAULT; in acpi_processor_get_psd()
544 if (psd->package.count != 1) { in acpi_processor_get_psd()
546 result = -EFAULT; in acpi_processor_get_psd()
553 status = acpi_extract_package(&(psd->package.elements[0]), &format, &state); in acpi_processor_get_psd()
556 result = -EFAULT; in acpi_processor_get_psd()
560 if (pdomain->num_entries != ACPI_PSD_REV0_ENTRIES) { in acpi_processor_get_psd()
562 result = -EFAULT; in acpi_processor_get_psd()
566 if (pdomain->revision != ACPI_PSD_REV0_REVISION) { in acpi_processor_get_psd()
568 result = -EFAULT; in acpi_processor_get_psd()
572 if (pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ALL && in acpi_processor_get_psd()
573 pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ANY && in acpi_processor_get_psd()
574 pdomain->coord_type != DOMAIN_COORD_TYPE_HW_ALL) { in acpi_processor_get_psd()
576 result = -EFAULT; in acpi_processor_get_psd()
598 return -ENOMEM; in acpi_processor_preregister_performance()
604 * changing pr->performance if it has. Check input data as well. in acpi_processor_preregister_performance()
613 if (pr->performance) { in acpi_processor_preregister_performance()
614 retval = -EBUSY; in acpi_processor_preregister_performance()
619 retval = -EINVAL; in acpi_processor_preregister_performance()
630 pr->performance = per_cpu_ptr(performance, i); in acpi_processor_preregister_performance()
631 pdomain = &(pr->performance->domain_info); in acpi_processor_preregister_performance()
632 if (acpi_processor_get_psd(pr->handle, pdomain)) { in acpi_processor_preregister_performance()
633 retval = -EINVAL; in acpi_processor_preregister_performance()
641 * Now that we have _PSD data from all CPUs, lets setup P-state in acpi_processor_preregister_performance()
652 pdomain = &(pr->performance->domain_info); in acpi_processor_preregister_performance()
653 cpumask_set_cpu(i, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
655 if (pdomain->num_processors <= 1) in acpi_processor_preregister_performance()
659 count_target = pdomain->num_processors; in acpi_processor_preregister_performance()
660 if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ALL) in acpi_processor_preregister_performance()
661 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_ALL; in acpi_processor_preregister_performance()
662 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_HW_ALL) in acpi_processor_preregister_performance()
663 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_HW; in acpi_processor_preregister_performance()
664 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ANY) in acpi_processor_preregister_performance()
665 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_ANY; in acpi_processor_preregister_performance()
675 match_pdomain = &(match_pr->performance->domain_info); in acpi_processor_preregister_performance()
676 if (match_pdomain->domain != pdomain->domain) in acpi_processor_preregister_performance()
681 if (match_pdomain->num_processors != count_target) { in acpi_processor_preregister_performance()
682 retval = -EINVAL; in acpi_processor_preregister_performance()
686 if (pdomain->coord_type != match_pdomain->coord_type) { in acpi_processor_preregister_performance()
687 retval = -EINVAL; in acpi_processor_preregister_performance()
692 cpumask_set_cpu(j, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
703 match_pdomain = &(match_pr->performance->domain_info); in acpi_processor_preregister_performance()
704 if (match_pdomain->domain != pdomain->domain) in acpi_processor_preregister_performance()
707 match_pr->performance->shared_type = in acpi_processor_preregister_performance()
708 pr->performance->shared_type; in acpi_processor_preregister_performance()
709 cpumask_copy(match_pr->performance->shared_cpu_map, in acpi_processor_preregister_performance()
710 pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
717 if (!pr || !pr->performance) in acpi_processor_preregister_performance()
722 cpumask_clear(pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
723 cpumask_set_cpu(i, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
724 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_NONE; in acpi_processor_preregister_performance()
726 pr->performance = NULL; /* Will be set for real in register */ in acpi_processor_preregister_performance()
742 return -EINVAL; in acpi_processor_register_performance()
749 return -ENODEV; in acpi_processor_register_performance()
752 if (pr->performance) { in acpi_processor_register_performance()
754 return -EBUSY; in acpi_processor_register_performance()
759 pr->performance = performance; in acpi_processor_register_performance()
762 pr->performance = NULL; in acpi_processor_register_performance()
764 return -EIO; in acpi_processor_register_performance()
782 if (pr->performance) in acpi_processor_unregister_performance()
783 kfree(pr->performance->states); in acpi_processor_unregister_performance()
785 pr->performance = NULL; in acpi_processor_unregister_performance()