aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>2006-10-03 15:38:45 -0400
committerDave Jones <davej@redhat.com>2006-10-15 19:57:11 -0400
commitdfde5d62ed9b28b0bda676c16e8cb635df244ef2 (patch)
tree12c690189fcc7155389860beae554199456b7d3e /include
parenta6f6e6e6ab464c9d1dff66570b78be2f66d8ba3d (diff)
[CPUFREQ][8/8] acpi-cpufreq: Add support for freq feedback from hardware
Enable ondemand governor and acpi-cpufreq to use IA32_APERF and IA32_MPERF MSR to get active frequency feedback for the last sampling interval. This will make ondemand take right frequency decisions when hardware coordination of frequency is going on. Without APERF/MPERF, ondemand can take wrong decision at times due to underlying hardware coordination or TM2. Example: * CPU 0 and CPU 1 are hardware cooridnated. * CPU 1 running at highest frequency. * CPU 0 was running at highest freq. Now ondemand reduces it to some intermediate frequency based on utilization. * Due to underlying hardware coordination with other CPU 1, CPU 0 continues to run at highest frequency (as long as other CPU is at highest). * When ondemand samples CPU 0 again next time, without actual frequency feedback from APERF/MPERF, it will think that previous frequency change was successful and can go to wrong target frequency. This is because it thinks that utilization it has got this sampling interval is when running at intermediate frequency, rather than actual highest frequency. More information about IA32_APERF IA32_MPERF MSR: Refer to IA-32 IntelĀ® Architecture Software Developer's Manual at http://developer.intel.com Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Signed-off-by: Dave Jones <davej@redhat.com>
Diffstat (limited to 'include')
-rw-r--r--include/asm-i386/msr.h3
-rw-r--r--include/asm-x86_64/msr.h3
-rw-r--r--include/linux/cpufreq.h3
3 files changed, 9 insertions, 0 deletions
diff --git a/include/asm-i386/msr.h b/include/asm-i386/msr.h
index 62b76cd96957..0aa15fc8d918 100644
--- a/include/asm-i386/msr.h
+++ b/include/asm-i386/msr.h
@@ -125,6 +125,9 @@ static inline void wrmsrl (unsigned long msr, unsigned long long val)
125#define MSR_IA32_PERF_STATUS 0x198 125#define MSR_IA32_PERF_STATUS 0x198
126#define MSR_IA32_PERF_CTL 0x199 126#define MSR_IA32_PERF_CTL 0x199
127 127
128#define MSR_IA32_MPERF 0xE7
129#define MSR_IA32_APERF 0xE8
130
128#define MSR_IA32_THERM_CONTROL 0x19a 131#define MSR_IA32_THERM_CONTROL 0x19a
129#define MSR_IA32_THERM_INTERRUPT 0x19b 132#define MSR_IA32_THERM_INTERRUPT 0x19b
130#define MSR_IA32_THERM_STATUS 0x19c 133#define MSR_IA32_THERM_STATUS 0x19c
diff --git a/include/asm-x86_64/msr.h b/include/asm-x86_64/msr.h
index 37e194169fac..e61582288737 100644
--- a/include/asm-x86_64/msr.h
+++ b/include/asm-x86_64/msr.h
@@ -307,6 +307,9 @@ static inline unsigned int cpuid_edx(unsigned int op)
307#define MSR_IA32_PERF_STATUS 0x198 307#define MSR_IA32_PERF_STATUS 0x198
308#define MSR_IA32_PERF_CTL 0x199 308#define MSR_IA32_PERF_CTL 0x199
309 309
310#define MSR_IA32_MPERF 0xE7
311#define MSR_IA32_APERF 0xE8
312
310#define MSR_IA32_THERM_CONTROL 0x19a 313#define MSR_IA32_THERM_CONTROL 0x19a
311#define MSR_IA32_THERM_INTERRUPT 0x19b 314#define MSR_IA32_THERM_INTERRUPT 0x19b
312#define MSR_IA32_THERM_STATUS 0x19c 315#define MSR_IA32_THERM_STATUS 0x19c
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index 4ea39fee99c7..7f008f6bfdc3 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -172,6 +172,8 @@ extern int __cpufreq_driver_target(struct cpufreq_policy *policy,
172 unsigned int relation); 172 unsigned int relation);
173 173
174 174
175extern int cpufreq_driver_getavg(struct cpufreq_policy *policy);
176
175int cpufreq_register_governor(struct cpufreq_governor *governor); 177int cpufreq_register_governor(struct cpufreq_governor *governor);
176void cpufreq_unregister_governor(struct cpufreq_governor *governor); 178void cpufreq_unregister_governor(struct cpufreq_governor *governor);
177 179
@@ -204,6 +206,7 @@ struct cpufreq_driver {
204 unsigned int (*get) (unsigned int cpu); 206 unsigned int (*get) (unsigned int cpu);
205 207
206 /* optional */ 208 /* optional */
209 unsigned int (*getavg) (unsigned int cpu);
207 int (*exit) (struct cpufreq_policy *policy); 210 int (*exit) (struct cpufreq_policy *policy);
208 int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg); 211 int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg);
209 int (*resume) (struct cpufreq_policy *policy); 212 int (*resume) (struct cpufreq_policy *policy);