# HG changeset patch
# User mark.langsdorf@xxxxxxx
# Date 1270010993 18000
# Node ID 9da598418e6da7758a799e116dc8bf3c3ed2f473
# Parent ebd84be3420a4453b3024d3378d8d84b81f44118
Refactor the existing code that supports the Intel Turbo feature to
move all the driver specific bits in the cpufreq driver. Create
a tri-state interface for the Turbo feature that can distinguish
amongst enabled Turbo, disabled Turbo, and processors that don't
support Turbo at all.
Signed-off-by: Mark Langsdorf <mark.langsdorf@xxxxxxx>
diff -r ebd84be3420a -r 9da598418e6d tools/libxc/xc_pm.c
--- a/tools/libxc/xc_pm.c Tue Mar 30 18:31:39 2010 +0100
+++ b/tools/libxc/xc_pm.c Tue Mar 30 23:49:53 2010 -0500
@@ -247,6 +247,7 @@
user_para->scaling_cur_freq = sys_para->scaling_cur_freq;
user_para->scaling_max_freq = sys_para->scaling_max_freq;
user_para->scaling_min_freq = sys_para->scaling_min_freq;
+ user_para->turbo_enabled = sys_para->turbo_enabled;
memcpy(user_para->scaling_driver,
sys_para->scaling_driver, CPUFREQ_NAME_LEN);
diff -r ebd84be3420a -r 9da598418e6d tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Tue Mar 30 18:31:39 2010 +0100
+++ b/tools/libxc/xenctrl.h Tue Mar 30 23:49:53 2010 -0500
@@ -1276,6 +1276,7 @@
char scaling_governor[CPUFREQ_NAME_LEN];
uint32_t scaling_max_freq;
uint32_t scaling_min_freq;
+ int32_t turbo_enabled;
/* for specific governor */
union {
diff -r ebd84be3420a -r 9da598418e6d tools/misc/xenpm.c
--- a/tools/misc/xenpm.c Tue Mar 30 18:31:39 2010 +0100
+++ b/tools/misc/xenpm.c Tue Mar 30 23:49:53 2010 -0500
@@ -30,6 +30,10 @@
#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
+#define CPUFREQ_TURBO_DISABLED -1
+#define CPUFREQ_TURBO_UNSUPPORTED 0
+#define CPUFREQ_TURBO_ENABLED 1
+
static int xc_fd;
static int max_cpu_nr;
@@ -62,8 +66,8 @@
" set-max-cstate <num> set the C-State limitation
(<num> >= 0)\n"
" start [seconds] start collect Cx/Px
statistics,\n"
" output after CTRL-C or
SIGINT or several seconds.\n"
- " enable-turbo-mode [cpuid] enable Turbo Mode in DBS
governor.\n"
- " disable-turbo-mode [cpuid] disable Turbo Mode in DBS
governor.\n"
+ " enable-turbo-mode [cpuid] enable Turbo Mode for
processors that support it.\n"
+ " disable-turbo-mode [cpuid] disable Turbo Mode for
processors that support it.\n"
);
}
/* wrapper function */
@@ -529,8 +533,6 @@
p_cpufreq->u.ondemand.sampling_rate);
printf(" up_threshold : %u\n",
p_cpufreq->u.ondemand.up_threshold);
- printf(" turbo mode : %s\n",
- p_cpufreq->u.ondemand.turbo_enabled ? "enabled" : "disabled");
}
printf("scaling_avail_freq :");
@@ -546,6 +548,13 @@
p_cpufreq->scaling_max_freq,
p_cpufreq->scaling_min_freq,
p_cpufreq->scaling_cur_freq);
+ if (p_cpufreq->turbo_enabled != CPUFREQ_TURBO_UNSUPPORTED) {
+ printf("turbo mode : ");
+ if (p_cpufreq->turbo_enabled == CPUFREQ_TURBO_ENABLED)
+ printf("enabled\n");
+ else
+ printf("disabled\n");
+ }
printf("\n");
}
@@ -561,6 +570,7 @@
p_cpufreq->affected_cpus = NULL;
p_cpufreq->scaling_available_frequencies = NULL;
p_cpufreq->scaling_available_governors = NULL;
+ p_cpufreq->turbo_enabled = 0;
do
{
diff -r ebd84be3420a -r 9da598418e6d xen/arch/x86/acpi/cpufreq/cpufreq.c
--- a/xen/arch/x86/acpi/cpufreq/cpufreq.c Tue Mar 30 18:31:39 2010 +0100
+++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c Tue Mar 30 23:49:53 2010 -0500
@@ -410,6 +410,10 @@
return -ENODEV;
}
+ if (policy->turbo == -1)
+ if (target_freq > policy->cpuinfo.second_max_freq)
+ target_freq = policy->cpuinfo.second_max_freq;
+
perf = data->acpi_data;
result = cpufreq_frequency_table_target(policy,
data->freq_table,
@@ -610,12 +614,19 @@
break;
}
- /* Check for APERF/MPERF support in hardware */
+ /* Check for APERF/MPERF support in hardware
+ * also check for boost support */
if (c->x86_vendor == X86_VENDOR_INTEL && c->cpuid_level >= 6) {
unsigned int ecx;
+ unsigned int eax;
ecx = cpuid_ecx(6);
if (ecx & CPUID_6_ECX_APERFMPERF_CAPABILITY)
acpi_cpufreq_driver.getavg = get_measured_perf;
+ eax = cpuid_eax(6);
+ if ( eax & 0x2 ) {
+ policy->turbo = 1;
+ printk(XENLOG_INFO "Turbo Mode detected and enabled!\n");
+ }
}
/*
diff -r ebd84be3420a -r 9da598418e6d xen/drivers/acpi/pmstat.c
--- a/xen/drivers/acpi/pmstat.c Tue Mar 30 18:31:39 2010 +0100
+++ b/xen/drivers/acpi/pmstat.c Tue Mar 30 23:49:53 2010 -0500
@@ -299,9 +299,8 @@
&op->u.get_para.u.ondemand.sampling_rate_min,
&op->u.get_para.u.ondemand.sampling_rate,
&op->u.get_para.u.ondemand.up_threshold);
- op->u.get_para.u.ondemand.turbo_enabled =
- cpufreq_dbs_get_turbo_status(op->cpuid);
}
+ op->u.get_para.turbo_enabled = cpufreq_get_turbo_status(op->cpuid);
return ret;
}
@@ -553,13 +552,13 @@
case XEN_SYSCTL_pm_op_enable_turbo:
{
- cpufreq_dbs_enable_turbo(op->cpuid);
+ cpufreq_enable_turbo(op->cpuid);
break;
}
case XEN_SYSCTL_pm_op_disable_turbo:
{
- cpufreq_dbs_disable_turbo(op->cpuid);
+ cpufreq_disable_turbo(op->cpuid);
break;
}
diff -r ebd84be3420a -r 9da598418e6d xen/drivers/cpufreq/cpufreq_ondemand.c
--- a/xen/drivers/cpufreq/cpufreq_ondemand.c Tue Mar 30 18:31:39 2010 +0100
+++ b/xen/drivers/cpufreq/cpufreq_ondemand.c Tue Mar 30 23:49:53 2010 -0500
@@ -58,9 +58,6 @@
static struct timer dbs_timer[NR_CPUS];
-/* Turbo Mode */
-static int turbo_detected = 0;
-
int write_ondemand_sampling_rate(unsigned int sampling_rate)
{
if ( (sampling_rate > MAX_SAMPLING_RATE / MICROSECS(1)) ||
@@ -111,10 +108,6 @@
policy = this_dbs_info->cur_policy;
max = policy->max;
- if (turbo_detected && !this_dbs_info->turbo_enabled) {
- if (max > policy->cpuinfo.second_max_freq)
- max = policy->cpuinfo.second_max_freq;
- }
if (unlikely(policy->resume)) {
__cpufreq_driver_target(policy, max,CPUFREQ_RELATION_H);
@@ -276,7 +269,6 @@
} else
dbs_tuners_ins.sampling_rate = usr_sampling_rate;
}
- this_dbs_info->turbo_enabled = 1;
dbs_timer_init(this_dbs_info);
break;
@@ -353,13 +345,6 @@
static int __init cpufreq_gov_dbs_init(void)
{
-#ifdef CONFIG_X86
- unsigned int eax = cpuid_eax(6);
- if ( eax & 0x2 ) {
- turbo_detected = 1;
- printk(XENLOG_INFO "Turbo Mode detected!\n");
- }
-#endif
return cpufreq_register_governor(&cpufreq_gov_dbs);
}
__initcall(cpufreq_gov_dbs_init);
@@ -404,19 +389,3 @@
}
}
}
-
-void cpufreq_dbs_enable_turbo(int cpuid)
-{
- per_cpu(cpu_dbs_info, cpuid).turbo_enabled = 1;
-}
-
-void cpufreq_dbs_disable_turbo(int cpuid)
-{
- per_cpu(cpu_dbs_info, cpuid).turbo_enabled = 0;
-}
-
-unsigned int cpufreq_dbs_get_turbo_status(int cpuid)
-{
- return turbo_detected && per_cpu(cpu_dbs_info, cpuid).turbo_enabled;
-}
-
diff -r ebd84be3420a -r 9da598418e6d xen/drivers/cpufreq/utility.c
--- a/xen/drivers/cpufreq/utility.c Tue Mar 30 18:31:39 2010 +0100
+++ b/xen/drivers/cpufreq/utility.c Tue Mar 30 23:49:53 2010 -0500
@@ -394,6 +394,31 @@
return policy->cur;
}
+void cpufreq_enable_turbo(int cpuid)
+{
+ struct cpufreq_policy *policy;
+
+ policy = cpufreq_cpu_policy[cpuid];
+ if (policy->turbo != CPUFREQ_TURBO_UNSUPPORTED)
+ policy->turbo = CPUFREQ_TURBO_ENABLED;
+}
+
+void cpufreq_disable_turbo(int cpuid)
+{
+ struct cpufreq_policy *policy;
+
+ policy = cpufreq_cpu_policy[cpuid];
+ if (policy->turbo != CPUFREQ_TURBO_UNSUPPORTED)
+ policy->turbo = CPUFREQ_TURBO_DISABLED;
+}
+
+int cpufreq_get_turbo_status(int cpuid)
+{
+ struct cpufreq_policy *policy;
+
+ policy = cpufreq_cpu_policy[cpuid];
+ return policy->turbo;
+}
/*********************************************************************
* POLICY *
diff -r ebd84be3420a -r 9da598418e6d xen/include/acpi/cpufreq/cpufreq.h
--- a/xen/include/acpi/cpufreq/cpufreq.h Tue Mar 30 18:31:39 2010 +0100
+++ b/xen/include/acpi/cpufreq/cpufreq.h Tue Mar 30 23:49:53 2010 -0500
@@ -55,6 +55,9 @@
unsigned int resume; /* flag for cpufreq 1st run
* S3 wakeup, hotplug cpu, etc */
+ int turbo; /* tristate flag: 0 for unsupported
+ * -1 for disable, 1 for enabled
+ * See CPUFREQ_TURBO_* below for defines */
};
extern struct cpufreq_policy *cpufreq_cpu_policy[NR_CPUS];
@@ -114,6 +117,15 @@
#define USR_GETAVG 2
extern int cpufreq_driver_getavg(unsigned int cpu, unsigned int flag);
+#define CPUFREQ_TURBO_DISABLED -1
+#define CPUFREQ_TURBO_UNSUPPORTED 0
+#define CPUFREQ_TURBO_ENABLED 1
+
+extern void cpufreq_enable_turbo(int cpuid);
+extern void cpufreq_disable_turbo(int cpuid);
+extern int cpufreq_get_turbo_status(int cpuid);
+
+
static __inline__ int
__cpufreq_governor(struct cpufreq_policy *policy, unsigned int event)
{
@@ -241,7 +253,4 @@
void cpufreq_dbs_timer_suspend(void);
void cpufreq_dbs_timer_resume(void);
-void cpufreq_dbs_enable_turbo(int cpuid);
-void cpufreq_dbs_disable_turbo(int cpuid);
-unsigned int cpufreq_dbs_get_turbo_status(int cpuid);
#endif /* __XEN_CPUFREQ_PM_H__ */
diff -r ebd84be3420a -r 9da598418e6d xen/include/acpi/cpufreq/processor_perf.h
--- a/xen/include/acpi/cpufreq/processor_perf.h Tue Mar 30 18:31:39 2010 +0100
+++ b/xen/include/acpi/cpufreq/processor_perf.h Tue Mar 30 23:49:53 2010 -0500
@@ -9,6 +9,7 @@
int get_cpu_id(u8);
int powernow_cpufreq_init(void);
unsigned int powernow_register_driver(void);
+unsigned int get_measured_perf(unsigned int cpu, unsigned int flag);
void cpufreq_residency_update(unsigned int, uint8_t);
void cpufreq_statistic_update(unsigned int, uint8_t, uint8_t);
diff -r ebd84be3420a -r 9da598418e6d xen/include/public/sysctl.h
--- a/xen/include/public/sysctl.h Tue Mar 30 18:31:39 2010 +0100
+++ b/xen/include/public/sysctl.h Tue Mar 30 23:49:53 2010 -0500
@@ -298,7 +298,6 @@
uint32_t sampling_rate;
uint32_t up_threshold;
- uint32_t turbo_enabled;
};
typedef struct xen_ondemand xen_ondemand_t;
@@ -328,6 +327,7 @@
char scaling_governor[CPUFREQ_NAME_LEN];
uint32_t scaling_max_freq;
uint32_t scaling_min_freq;
+ int32_t turbo_enabled;
/* for specific governor */
union {
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|