* [PATCH 2.5] cpufreq: x86 per-CPU loops_per_jiffy notifier
@ 2002-12-21 17:47 Dominik Brodowski
0 siblings, 0 replies; only message in thread
From: Dominik Brodowski @ 2002-12-21 17:47 UTC (permalink / raw)
To: torvalds; +Cc: linux-kernel, cpufreq
The per-CPU loops_per_jiffy value should be adjusted on frequency transitions.
To get rid of accumulating rounding errors, some reference values are
stored.
Dominik
diff -ruN linux-original/arch/i386/kernel/cpu/common.c linux/arch/i386/kernel/cpu/common.c
--- linux-original/arch/i386/kernel/cpu/common.c 2002-12-21 14:53:44.000000000 +0100
+++ linux/arch/i386/kernel/cpu/common.c 2002-12-21 18:34:34.000000000 +0100
@@ -1,5 +1,7 @@
#include <linux/init.h>
#include <linux/string.h>
+#include <linux/cpufreq.h>
+#include <linux/notifier.h>
#include <linux/delay.h>
#include <linux/smp.h>
#include <asm/semaphore.h>
@@ -61,6 +63,41 @@
#endif
__setup("notsc", tsc_setup);
+#ifdef CONFIG_CPU_FREQ
+static unsigned long loops_per_jiffy_ref = 0;
+static unsigned int ref_freq = 0;
+
+static int
+loops_per_jiffy_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
+ void *data)
+{
+ struct cpufreq_freqs *freq = data;
+
+ if (!loops_per_jiffy_ref) {
+ loops_per_jiffy_ref = cpu_data[freq->cpu].loops_per_jiffy;
+ ref_freq = freq->old;
+ }
+
+ switch (val) {
+ case CPUFREQ_PRECHANGE:
+ if (freq->old < freq->new)
+ cpu_data[freq->cpu].loops_per_jiffy = cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new);
+ break;
+ case CPUFREQ_POSTCHANGE:
+ if (freq->new < freq->old)
+ cpu_data[freq->cpu].loops_per_jiffy = cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new);
+ break;
+ }
+
+ return 0;
+}
+
+static struct notifier_block loops_per_jiffy_cpufreq_notifier_block = {
+ .notifier_call = loops_per_jiffy_cpufreq_notifier
+};
+#endif
+
+
int __init get_model_name(struct cpuinfo_x86 *c)
{
unsigned int *v;
@@ -350,6 +387,9 @@
for ( i = 0 ; i < NCAPINTS ; i++ )
boot_cpu_data.x86_capability[i] &= c->x86_capability[i];
}
+ if (c == &boot_cpu_data) {
+ cpufreq_register_notifier(&loops_per_jiffy_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
+ }
printk(KERN_DEBUG "CPU: Common caps: %08lx %08lx %08lx %08lx\n",
boot_cpu_data.x86_capability[0],
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2002-12-21 17:38 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-12-21 17:47 [PATCH 2.5] cpufreq: x86 per-CPU loops_per_jiffy notifier Dominik Brodowski
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.