Messages in this thread Patch in this message | | | Subject | [RFC] [PATCH] linux-2.5.56_clock-override_A1 | From | john stultz <> | Date | 21 Mar 2003 16:28:18 -0800 |
| |
All, This patch allows one to manually specify the i386 gettimeofday time-source by passing clock=[pit|tsc|cyclone|...] as a boot argument. The argument will override the default probled selection, and in case the selected time-source not be avalible the code defaults to using the PIT (printing a warning saying so).
The new changes in this release are basically better whitespace and __init usage (thanks Andrew).
I'm still tracking an issue between this and the cpu_freq code, so let me know if it doesn't work or if you see anything terminally stupid.
thanks -john
diff -Nru a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt --- a/Documentation/kernel-parameters.txt Fri Mar 21 16:18:00 2003 +++ b/Documentation/kernel-parameters.txt Fri Mar 21 16:18:00 2003 @@ -207,6 +207,12 @@ chandev= [HW,NET] Generic channel device initialisation + clock= [BUGS=IA-32, HW] gettimeofday timesource override. + Forces specified timesource (if avaliable) to be used + when calculating gettimeofday(). If specicified timesource + is not avalible, it defaults to PIT. + Format: { pit | tsc | cyclone | ... } + cm206= [HW,CD] Format: { auto | [<io>,][<irq>] } diff -Nru a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c --- a/arch/i386/kernel/smpboot.c Fri Mar 21 16:18:00 2003 +++ b/arch/i386/kernel/smpboot.c Fri Mar 21 16:18:00 2003 @@ -422,7 +422,7 @@ /* * Synchronize the TSC with the BP */ - if (cpu_has_tsc) + if (cpu_has_tsc && cpu_khz) synchronize_tsc_ap(); } @@ -1114,7 +1114,7 @@ /* * Synchronize the TSC with the AP */ - if (cpu_has_tsc && cpucount) + if (cpu_has_tsc && cpucount && cpu_khz) synchronize_tsc_bp(); } diff -Nru a/arch/i386/kernel/timers/timer.c b/arch/i386/kernel/timers/timer.c --- a/arch/i386/kernel/timers/timer.c Fri Mar 21 16:18:00 2003 +++ b/arch/i386/kernel/timers/timer.c Fri Mar 21 16:18:00 2003 @@ -1,4 +1,6 @@ +#include <linux/init.h> #include <linux/kernel.h> +#include <linux/string.h> #include <asm/timer.h> /* list of externed timers */ @@ -17,6 +19,17 @@ NULL, }; +static char clock_override[10] __initdata; + +static int __init clock_setup(char* str) +{ + if (str) { + strncpy(clock_override, str,10); + clock_override[9] = '\0'; + } + return 1; +} +__setup("clock=", clock_setup); /* iterates through the list of timers, returning the first * one that initializes successfully. @@ -28,7 +41,7 @@ /* find most preferred working timer */ while (timers[i]) { if (timers[i]->init) - if (timers[i]->init() == 0) + if (timers[i]->init(clock_override) == 0) return timers[i]; ++i; } diff -Nru a/arch/i386/kernel/timers/timer_cyclone.c b/arch/i386/kernel/timers/timer_cyclone.c --- a/arch/i386/kernel/timers/timer_cyclone.c Fri Mar 21 16:18:00 2003 +++ b/arch/i386/kernel/timers/timer_cyclone.c Fri Mar 21 16:18:00 2003 @@ -10,6 +10,7 @@ #include <linux/init.h> #include <linux/timex.h> #include <linux/errno.h> +#include <linux/string.h> #include <asm/timer.h> #include <asm/io.h> @@ -73,7 +74,7 @@ return delay_at_last_interrupt + offset; } -static int init_cyclone(void) +static int __init init_cyclone(char* override) { u32* reg; u32 base; /* saved cyclone base address */ @@ -81,8 +82,11 @@ u32 offset; /* offset from pageaddr to cyclone_timer register */ int i; + /* check clock override */ + if (override[0] && strncmp(override,"cyclone",7)) + return -ENODEV; + /*make sure we're on a summit box*/ - /*XXX need to use proper summit hooks! such as xapic -john*/ if(!use_cyclone) return -ENODEV; printk(KERN_INFO "Summit chipset: Starting Cyclone Counter.\n"); diff -Nru a/arch/i386/kernel/timers/timer_none.c b/arch/i386/kernel/timers/timer_none.c --- a/arch/i386/kernel/timers/timer_none.c Fri Mar 21 16:18:00 2003 +++ b/arch/i386/kernel/timers/timer_none.c Fri Mar 21 16:18:00 2003 @@ -1,6 +1,7 @@ +#include <linux/init.h> #include <asm/timer.h> -static int init_none(void) +static int __init init_none(char* override) { return 0; } diff -Nru a/arch/i386/kernel/timers/timer_pit.c b/arch/i386/kernel/timers/timer_pit.c --- a/arch/i386/kernel/timers/timer_pit.c Fri Mar 21 16:18:00 2003 +++ b/arch/i386/kernel/timers/timer_pit.c Fri Mar 21 16:18:00 2003 @@ -17,8 +17,12 @@ extern spinlock_t i8253_lock; #include "do_timer.h" -static int init_pit(void) +static int __init init_pit(char* override) { + /* check clock override */ + if (override[0] && strncmp(override,"pit",3)) + printk(KERN_ERR "Warning: clock= override failed. Defaulting to PIT\n"); + return 0; } diff -Nru a/arch/i386/kernel/timers/timer_tsc.c b/arch/i386/kernel/timers/timer_tsc.c --- a/arch/i386/kernel/timers/timer_tsc.c Fri Mar 21 16:18:00 2003 +++ b/arch/i386/kernel/timers/timer_tsc.c Fri Mar 21 16:18:00 2003 @@ -8,6 +8,7 @@ #include <linux/timex.h> #include <linux/errno.h> #include <linux/cpufreq.h> +#include <linux/string.h> #include <asm/timer.h> #include <asm/io.h> @@ -244,8 +245,13 @@ #endif -static int init_tsc(void) +static int __init init_tsc(char* override) { + + /* check clock override */ + if (override[0] && strncmp(override,"tsc",3)) + return -ENODEV; + /* * If we have APM enabled or the CPU clock speed is variable * (CPU stops clock on HLT or slows clock to save power) diff -Nru a/include/asm-i386/timer.h b/include/asm-i386/timer.h --- a/include/asm-i386/timer.h Fri Mar 21 16:18:00 2003 +++ b/include/asm-i386/timer.h Fri Mar 21 16:18:00 2003 @@ -4,14 +4,14 @@ /** * struct timer_ops - used to define a timer source * - * @init: Probes and initializes the timer. Returns 0 on success, anything - * else on failure. + * @init: Probes and initializes the timer. Takes clock= override + * string as an argument. Returns 0 on success, anything else on failure. * @mark_offset: called by the timer interrupt * @get_offset: called by gettimeofday(). Returns the number of ms since the * last timer intruupt. */ struct timer_opts{ - int (*init)(void); + int (*init)(char *override); void (*mark_offset)(void); unsigned long (*get_offset)(void); void (*delay)(unsigned long);[unhandled content-type:application/pgp-signature] | |