Lines Matching +full:performance +full:- +full:domain
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
26 #define ACPI_PROCESSOR_FILE_PERFORMANCE "performance"
43 * -1 -> cpufreq low level drivers not initialized -> _PSS, etc. not called yet
45 * 0 -> cpufreq low level drivers initialized -> consider _PPC values
46 * 1 -> ignore _PPC totally -> forced by user through boot param
48 static int ignore_ppc = -1;
64 return -EINVAL; in acpi_processor_get_platform_limit()
70 status = acpi_evaluate_integer(pr->handle, "_PPC", NULL, &ppc); in acpi_processor_get_platform_limit()
77 return -ENODEV; in acpi_processor_get_platform_limit()
82 if (pr->performance_platform_limit == index || in acpi_processor_get_platform_limit()
83 ppc >= pr->performance->state_count) in acpi_processor_get_platform_limit()
86 pr_debug("CPU %d: _PPC is %d - frequency %s limited\n", pr->id, in acpi_processor_get_platform_limit()
89 pr->performance_platform_limit = index; in acpi_processor_get_platform_limit()
91 if (unlikely(!freq_qos_request_active(&pr->perflib_req))) in acpi_processor_get_platform_limit()
101 qos_value = pr->performance->states[index].core_frequency * 1000; in acpi_processor_get_platform_limit()
103 ret = freq_qos_update_request(&pr->perflib_req, qos_value); in acpi_processor_get_platform_limit()
106 pr->id, ret); in acpi_processor_get_platform_limit()
117 * 0: success. OSPM is now using the performance state specificed.
118 * 1: failure. OSPM has not changed the number of P-states in use
131 if (ignore_ppc || !pr->performance) { in acpi_processor_ppc_has_changed()
137 acpi_processor_ppc_ost(pr->handle, 1); in acpi_processor_ppc_has_changed()
148 acpi_processor_ppc_ost(pr->handle, 1); in acpi_processor_ppc_has_changed()
150 acpi_processor_ppc_ost(pr->handle, 0); in acpi_processor_ppc_has_changed()
153 cpufreq_update_limits(pr->id); in acpi_processor_ppc_has_changed()
161 if (!pr || !pr->performance || !pr->performance->state_count) in acpi_processor_get_bios_limit()
162 return -ENODEV; in acpi_processor_get_bios_limit()
163 *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()
206 for_each_cpu(cpu, policy->related_cpus) { in acpi_processor_ppc_exit()
210 freq_qos_remove_request(&pr->perflib_req); in acpi_processor_ppc_exit()
223 status = acpi_evaluate_object(pr->handle, "_PCT", NULL, &buffer); in acpi_processor_get_performance_control()
226 return -ENODEV; in acpi_processor_get_performance_control()
230 if (!pct || (pct->type != ACPI_TYPE_PACKAGE) in acpi_processor_get_performance_control()
231 || (pct->package.count != 2)) { in acpi_processor_get_performance_control()
233 result = -EFAULT; in acpi_processor_get_performance_control()
241 obj = pct->package.elements[0]; in acpi_processor_get_performance_control()
247 result = -EFAULT; in acpi_processor_get_performance_control()
250 memcpy(&pr->performance->control_register, obj.buffer.pointer, in acpi_processor_get_performance_control()
257 obj = pct->package.elements[1]; in acpi_processor_get_performance_control()
263 result = -EFAULT; in acpi_processor_get_performance_control()
267 memcpy(&pr->performance->status_register, obj.buffer.pointer, in acpi_processor_get_performance_control()
284 int index = px->control & 0x00000007; in amd_fixup_frequency()
294 * Bit 63: PstateEn. Read-write. If set, the P-state is valid. in amd_fixup_frequency()
302 px->core_frequency = (100 * (fid + 0x10)) >> did; in amd_fixup_frequency()
304 px->core_frequency = (100 * (fid + 8)) >> did; in amd_fixup_frequency()
320 int last_invalid = -1; in acpi_processor_get_performance_states()
323 status = acpi_evaluate_object(pr->handle, "_PSS", NULL, &buffer); in acpi_processor_get_performance_states()
326 return -ENODEV; in acpi_processor_get_performance_states()
330 if (!pss || (pss->type != ACPI_TYPE_PACKAGE)) { in acpi_processor_get_performance_states()
332 result = -EFAULT; in acpi_processor_get_performance_states()
336 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d performance states\n", in acpi_processor_get_performance_states()
337 pss->package.count)); in acpi_processor_get_performance_states()
339 pr->performance->state_count = pss->package.count; in acpi_processor_get_performance_states()
340 pr->performance->states = in acpi_processor_get_performance_states()
341 kmalloc_array(pss->package.count, in acpi_processor_get_performance_states()
344 if (!pr->performance->states) { in acpi_processor_get_performance_states()
345 result = -ENOMEM; in acpi_processor_get_performance_states()
349 for (i = 0; i < pr->performance->state_count; i++) { in acpi_processor_get_performance_states()
351 struct acpi_processor_px *px = &(pr->performance->states[i]); in acpi_processor_get_performance_states()
358 status = acpi_extract_package(&(pss->package.elements[i]), in acpi_processor_get_performance_states()
362 result = -EFAULT; in acpi_processor_get_performance_states()
363 kfree(pr->performance->states); in acpi_processor_get_performance_states()
372 (u32) px->core_frequency, in acpi_processor_get_performance_states()
373 (u32) px->power, in acpi_processor_get_performance_states()
374 (u32) px->transition_latency, in acpi_processor_get_performance_states()
375 (u32) px->bus_master_latency, in acpi_processor_get_performance_states()
376 (u32) px->control, (u32) px->status)); in acpi_processor_get_performance_states()
381 if (!px->core_frequency || in acpi_processor_get_performance_states()
382 ((u32)(px->core_frequency * 1000) != in acpi_processor_get_performance_states()
383 (px->core_frequency * 1000))) { in acpi_processor_get_performance_states()
386 pr->id, px->core_frequency); in acpi_processor_get_performance_states()
387 if (last_invalid == -1) in acpi_processor_get_performance_states()
390 if (last_invalid != -1) { in acpi_processor_get_performance_states()
394 memcpy(&(pr->performance->states[last_invalid]), in acpi_processor_get_performance_states()
403 "No valid BIOS _PSS frequency found for processor %d\n", pr->id); in acpi_processor_get_performance_states()
404 result = -EFAULT; in acpi_processor_get_performance_states()
405 kfree(pr->performance->states); in acpi_processor_get_performance_states()
406 pr->performance->states = NULL; in acpi_processor_get_performance_states()
410 pr->performance->state_count = last_invalid; in acpi_processor_get_performance_states()
422 if (!pr || !pr->performance || !pr->handle) in acpi_processor_get_performance_info()
423 return -EINVAL; in acpi_processor_get_performance_info()
425 if (!acpi_has_method(pr->handle, "_PCT")) { in acpi_processor_get_performance_info()
427 "ACPI-based processor performance control unavailable\n")); in acpi_processor_get_performance_info()
428 return -ENODEV; in acpi_processor_get_performance_info()
451 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()
507 is_done = -EIO; in acpi_processor_notify_smm()
543 return -ENODEV; in acpi_processor_get_psd()
547 if (!psd || (psd->type != ACPI_TYPE_PACKAGE)) { in acpi_processor_get_psd()
549 result = -EFAULT; in acpi_processor_get_psd()
553 if (psd->package.count != 1) { in acpi_processor_get_psd()
555 result = -EFAULT; in acpi_processor_get_psd()
562 status = acpi_extract_package(&(psd->package.elements[0]), in acpi_processor_get_psd()
566 result = -EFAULT; in acpi_processor_get_psd()
570 if (pdomain->num_entries != ACPI_PSD_REV0_ENTRIES) { in acpi_processor_get_psd()
572 result = -EFAULT; in acpi_processor_get_psd()
576 if (pdomain->revision != ACPI_PSD_REV0_REVISION) { in acpi_processor_get_psd()
578 result = -EFAULT; in acpi_processor_get_psd()
582 if (pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ALL && in acpi_processor_get_psd()
583 pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ANY && in acpi_processor_get_psd()
584 pdomain->coord_type != DOMAIN_COORD_TYPE_HW_ALL) { in acpi_processor_get_psd()
586 result = -EFAULT; in acpi_processor_get_psd()
596 struct acpi_processor_performance __percpu *performance) in acpi_processor_preregister_performance() argument
608 return -ENOMEM; in acpi_processor_preregister_performance()
614 * changing pr->performance if it has. Check input data as well. in acpi_processor_preregister_performance()
623 if (pr->performance) { in acpi_processor_preregister_performance()
624 retval = -EBUSY; in acpi_processor_preregister_performance()
628 if (!performance || !per_cpu_ptr(performance, i)) { in acpi_processor_preregister_performance()
629 retval = -EINVAL; in acpi_processor_preregister_performance()
640 pr->performance = per_cpu_ptr(performance, i); in acpi_processor_preregister_performance()
641 cpumask_set_cpu(i, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
642 pdomain = &(pr->performance->domain_info); in acpi_processor_preregister_performance()
643 if (acpi_processor_get_psd(pr->handle, pdomain)) { in acpi_processor_preregister_performance()
644 retval = -EINVAL; in acpi_processor_preregister_performance()
652 * Now that we have _PSD data from all CPUs, lets setup P-state in acpi_processor_preregister_performance()
653 * domain info. in acpi_processor_preregister_performance()
663 pdomain = &(pr->performance->domain_info); in acpi_processor_preregister_performance()
664 cpumask_set_cpu(i, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
666 if (pdomain->num_processors <= 1) in acpi_processor_preregister_performance()
669 /* Validate the Domain info */ in acpi_processor_preregister_performance()
670 count_target = pdomain->num_processors; in acpi_processor_preregister_performance()
671 if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ALL) in acpi_processor_preregister_performance()
672 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_ALL; in acpi_processor_preregister_performance()
673 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_HW_ALL) in acpi_processor_preregister_performance()
674 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_HW; in acpi_processor_preregister_performance()
675 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ANY) in acpi_processor_preregister_performance()
676 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_ANY; in acpi_processor_preregister_performance()
686 match_pdomain = &(match_pr->performance->domain_info); in acpi_processor_preregister_performance()
687 if (match_pdomain->domain != pdomain->domain) in acpi_processor_preregister_performance()
690 /* Here i and j are in the same domain */ in acpi_processor_preregister_performance()
692 if (match_pdomain->num_processors != count_target) { in acpi_processor_preregister_performance()
693 retval = -EINVAL; in acpi_processor_preregister_performance()
697 if (pdomain->coord_type != match_pdomain->coord_type) { in acpi_processor_preregister_performance()
698 retval = -EINVAL; in acpi_processor_preregister_performance()
703 cpumask_set_cpu(j, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
714 match_pdomain = &(match_pr->performance->domain_info); in acpi_processor_preregister_performance()
715 if (match_pdomain->domain != pdomain->domain) in acpi_processor_preregister_performance()
718 match_pr->performance->shared_type = in acpi_processor_preregister_performance()
719 pr->performance->shared_type; in acpi_processor_preregister_performance()
720 cpumask_copy(match_pr->performance->shared_cpu_map, in acpi_processor_preregister_performance()
721 pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
728 if (!pr || !pr->performance) in acpi_processor_preregister_performance()
731 /* Assume no coordination on any error parsing domain info */ in acpi_processor_preregister_performance()
733 cpumask_clear(pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
734 cpumask_set_cpu(i, pr->performance->shared_cpu_map); in acpi_processor_preregister_performance()
735 pr->performance->shared_type = CPUFREQ_SHARED_TYPE_ALL; in acpi_processor_preregister_performance()
737 pr->performance = NULL; /* Will be set for real in register */ in acpi_processor_preregister_performance()
749 *performance, unsigned int cpu) in acpi_processor_register_performance()
754 return -EINVAL; in acpi_processor_register_performance()
761 return -ENODEV; in acpi_processor_register_performance()
764 if (pr->performance) { in acpi_processor_register_performance()
766 return -EBUSY; in acpi_processor_register_performance()
769 WARN_ON(!performance); in acpi_processor_register_performance()
771 pr->performance = performance; in acpi_processor_register_performance()
774 pr->performance = NULL; in acpi_processor_register_performance()
776 return -EIO; in acpi_processor_register_performance()
797 if (pr->performance) in acpi_processor_unregister_performance()
798 kfree(pr->performance->states); in acpi_processor_unregister_performance()
799 pr->performance = NULL; in acpi_processor_unregister_performance()