lkml.org 
[lkml]   [2002]   [Dec]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 2.5] cpufreq: x86 per-CPU loops_per_jiffy notifier
    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],
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2005-03-22 13:31    [W:0.023 / U:123.200 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site