Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 120823
b: refs/heads/master
c: 395628e
h: refs/heads/master
i:
  120821: 09aa04b
  120819: ee29244
  120815: dfee799
v: v3
  • Loading branch information
Alok Kataria authored and H. Peter Anvin committed Nov 2, 2008
1 parent 080c780 commit acdb20c
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: eca0cd028bdf0f6aaceb0d023e9c7501079a7dda
refs/heads/master: 395628ef4ea12ff0748099f145363b5e33c69acb
7 changes: 7 additions & 0 deletions trunk/Documentation/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2267,6 +2267,13 @@ and is between 256 and 4096 characters. It is defined in the file
Format:
<io>,<irq>,<dma>,<dma2>,<sb_io>,<sb_irq>,<sb_dma>,<mpu_io>,<mpu_irq>

tsc= Disable clocksource-must-verify flag for TSC.
Format: <string>
[x86] reliable: mark tsc clocksource as reliable, this
disables clocksource verification at runtime.
Used to enable high-resolution timer mode on older
hardware, and in virtualized environment.

turbografx.map[2|3]= [HW,JOY]
TurboGraFX parallel port interface
Format:
Expand Down
33 changes: 21 additions & 12 deletions trunk/arch/x86/kernel/tsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ static int tsc_unstable;
erroneous rdtsc usage on !cpu_has_tsc processors */
static int tsc_disabled = -1;

static int tsc_clocksource_reliable;
/*
* Scheduler clock - returns current time in nanosec units.
*/
Expand Down Expand Up @@ -99,6 +100,15 @@ int __init notsc_setup(char *str)

__setup("notsc", notsc_setup);

static int __init tsc_setup(char *str)
{
if (!strcmp(str, "reliable"))
tsc_clocksource_reliable = 1;
return 1;
}

__setup("tsc=", tsc_setup);

#define MAX_RETRIES 5
#define SMI_TRESHOLD 50000

Expand Down Expand Up @@ -738,24 +748,21 @@ static struct dmi_system_id __initdata bad_tsc_dmi_table[] = {
{}
};

/*
* Geode_LX - the OLPC CPU has a possibly a very reliable TSC
*/
static void __init check_system_tsc_reliable(void)
{
#ifdef CONFIG_MGEODE_LX
/* RTSC counts during suspend */
/* RTSC counts during suspend */
#define RTSC_SUSP 0x100

static void __init check_geode_tsc_reliable(void)
{
unsigned long res_low, res_high;

rdmsr_safe(MSR_GEODE_BUSCONT_CONF0, &res_low, &res_high);
/* Geode_LX - the OLPC CPU has a possibly a very reliable TSC */
if (res_low & RTSC_SUSP)
clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
}
#else
static inline void check_geode_tsc_reliable(void) { }
tsc_clocksource_reliable = 1;
#endif
if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE))
tsc_clocksource_reliable = 1;
}

/*
* Make an educated guess if the TSC is trustworthy and synchronized
Expand Down Expand Up @@ -790,6 +797,8 @@ static void __init init_tsc_clocksource(void)
{
clocksource_tsc.mult = clocksource_khz2mult(tsc_khz,
clocksource_tsc.shift);
if (tsc_clocksource_reliable)
clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
/* lower the rating if we already know its unstable: */
if (check_tsc_unstable()) {
clocksource_tsc.rating = 0;
Expand Down Expand Up @@ -850,7 +859,7 @@ void __init tsc_init(void)
if (unsynchronized_tsc())
mark_tsc_unstable("TSCs unsynchronized");

check_geode_tsc_reliable();
check_system_tsc_reliable();
init_tsc_clocksource();
}

0 comments on commit acdb20c

Please sign in to comment.