In order to better support future Intel processors, intel_pstate changes to use percentage values to tune P-states. The intel_pstate driver uses its own internal governor, and it is recorded in the "policy->policy" field. The setpolicy driver interface is used to configure the intel_pstate internal policy. The __cpufreq_set_policy needs to be intercepted to use the setpolicy driver if it exists.
Signed-off-by: Wei Wang <wei.w.w...@intel.com> --- xen/drivers/cpufreq/utility.c | 5 +++++ xen/include/acpi/cpufreq/cpufreq.h | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/xen/drivers/cpufreq/utility.c b/xen/drivers/cpufreq/utility.c index 519f862..04f88c2 100644 --- a/xen/drivers/cpufreq/utility.c +++ b/xen/drivers/cpufreq/utility.c @@ -456,6 +456,11 @@ int __cpufreq_set_policy(struct cpufreq_policy *data, data->min = policy->min; data->max = policy->max; + data->min_perf_pct = policy->min_perf_pct; + data->max_perf_pct = policy->max_perf_pct; + + if (cpufreq_driver->setpolicy) + return cpufreq_driver->setpolicy(data); if (policy->governor != data->governor) { /* save old, working values */ diff --git a/xen/include/acpi/cpufreq/cpufreq.h b/xen/include/acpi/cpufreq/cpufreq.h index f96c3e4..67c9be2 100644 --- a/xen/include/acpi/cpufreq/cpufreq.h +++ b/xen/include/acpi/cpufreq/cpufreq.h @@ -52,6 +52,10 @@ struct cpufreq_policy { unsigned int max; /* in kHz */ unsigned int cur; /* in kHz, only needed if cpufreq * governors are used */ + int min_perf_pct; /* min performance in percentage */ + int max_perf_pct; /* max performance in percentage */ + int turbo_pct; + unsigned int policy; struct cpufreq_governor *governor; bool_t resume; /* flag for cpufreq 1st run @@ -87,6 +91,12 @@ struct cpufreq_freqs { * CPUFREQ GOVERNORS * *********************************************************************/ +/* the four internal governors used in intel_pstate */ +#define CPUFREQ_POLICY_POWERSAVE (1) +#define CPUFREQ_POLICY_PERFORMANCE (2) +#define CPUFREQ_POLICY_USERSPACE (3) +#define CPUFREQ_POLICY_ONDEMAND (4) + #define CPUFREQ_GOV_START 1 #define CPUFREQ_GOV_STOP 2 #define CPUFREQ_GOV_LIMITS 3 @@ -145,6 +155,7 @@ struct cpufreq_driver { char name[CPUFREQ_NAME_LEN]; int (*init)(struct cpufreq_policy *policy); int (*verify)(struct cpufreq_policy *policy); + int (*setpolicy)(struct cpufreq_policy *policy); int (*update)(int cpuid, struct cpufreq_policy *policy); int (*target)(struct cpufreq_policy *policy, unsigned int target_freq, -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel