lkml.org 
[lkml]   [2003]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Subject[RFC] [PATCH] linux-2.5.56_clock-override_A1
From
Date
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]
\
 
 \ /
  Last update: 2005-03-22 13:34    [W:0.073 / U:0.224 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site