示例#1
0
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);
}
示例#2
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
}
示例#3
0
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); /* 更新调度策略 */
}
示例#5
0
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;
}