static int acpi_processor_get_performance_info(struct acpi_processor *pr) { int result = 0; acpi_status status = AE_OK; acpi_handle handle = NULL; ACPI_FUNCTION_TRACE("acpi_processor_get_performance_info"); if (!pr || !pr->performance || !pr->handle) return_VALUE(-EINVAL); acpi_processor_set_pdc(pr, pr->performance->pdc); status = acpi_get_handle(pr->handle, "_PCT", &handle); if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "ACPI-based processor performance control unavailable\n")); return_VALUE(-ENODEV); } result = acpi_processor_get_performance_control(pr); if (result) return_VALUE(result); result = acpi_processor_get_performance_states(pr); if (result) return_VALUE(result); result = acpi_processor_get_platform_limit(pr); if (result) return_VALUE(result); return_VALUE(0); }
int acpi_processor_ppc_has_changed(struct acpi_processor *pr) { int ret; #ifdef CONFIG_PROCESSOR_EXTERNAL_CONTROL /* Xen hypervisor can handle cpufreq _PPC event */ if (ignore_ppc < 0 && processor_pmperf_external()) ignore_ppc = 0; #endif if (ignore_ppc) return 0; ret = acpi_processor_get_platform_limit(pr); if (ret < 0) return (ret); else #ifdef CONFIG_CPU_FREQ return cpufreq_update_policy(pr->id); #elif defined(CONFIG_PROCESSOR_EXTERNAL_CONTROL) return processor_notify_external(pr, PROCESSOR_PM_CHANGE, PM_TYPE_PERF); #endif }
int acpi_processor_ppc_has_changed(struct acpi_processor *pr) { int ret = acpi_processor_get_platform_limit(pr); if (ret < 0) return (ret); else return cpufreq_update_policy(pr->id); }
/**ltl * 功能: 更新调度策略 * 参数: * 返回值: * 说明: */ int acpi_processor_ppc_has_changed(struct acpi_processor *pr) { int ret; if (ignore_ppc) return 0; /* 读取_PPC对象 */ ret = acpi_processor_get_platform_limit(pr); if (ret < 0) return (ret); else return cpufreq_update_policy(pr->id); /* 更新调度策略 */ }
static int acpi_processor_ppc_notifier(struct notifier_block *nb, unsigned long event, void *data) { struct cpufreq_policy *policy = data; struct acpi_processor *pr; unsigned int ppc = 0; pr = processors[policy->cpu]; if (event == CPUFREQ_START && ignore_ppc < 1) { ignore_ppc = 0; if (pr) acpi_processor_get_platform_limit(pr); return 0; } if (ignore_ppc) return 0; mutex_lock(&performance_mutex); if (event != CPUFREQ_INCOMPATIBLE) goto out; if (!pr || !pr->performance) goto out; ppc = (unsigned int)pr->performance_platform_limit; if (ppc >= pr->performance->state_count) goto out; cpufreq_verify_within_limits(policy, 0, pr->performance->states[ppc]. core_frequency * 1000); out: mutex_unlock(&performance_mutex); return 0; }