diff options
author | Chuck Ebbert <76306.1226@compuserve.com> | 2005-09-12 12:49:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-12 13:50:58 -0400 |
commit | 66759a01adbfe8828dd063e32cf5ed3f46696181 (patch) | |
tree | 9d34afafa1e4e5371a0e732a3f949ef8ac533ab5 /arch/x86_64 | |
parent | 049cdefe19f95b67b06b70915cd8e4ae7173337a (diff) |
[PATCH] x86-64: i386/x86-64: Fix time going twice as fast problem on ATI Xpress chipsets
Original patch from Bertro Simul
This is probably still not quite correct, but seems to be
the best solution so far.
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/x86_64')
-rw-r--r-- | arch/x86_64/kernel/io_apic.c | 13 | ||||
-rw-r--r-- | arch/x86_64/kernel/setup.c | 5 |
2 files changed, 18 insertions, 0 deletions
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c index 961b519bda56..522944a000ad 100644 --- a/arch/x86_64/kernel/io_apic.c +++ b/arch/x86_64/kernel/io_apic.c | |||
@@ -44,6 +44,8 @@ int sis_apic_bug; /* not actually supported, dummy for compile */ | |||
44 | 44 | ||
45 | static int no_timer_check; | 45 | static int no_timer_check; |
46 | 46 | ||
47 | int disable_timer_pin_1 __initdata; | ||
48 | |||
47 | static DEFINE_SPINLOCK(ioapic_lock); | 49 | static DEFINE_SPINLOCK(ioapic_lock); |
48 | 50 | ||
49 | /* | 51 | /* |
@@ -297,6 +299,15 @@ void __init check_ioapic(void) | |||
297 | #endif | 299 | #endif |
298 | /* RED-PEN skip them on mptables too? */ | 300 | /* RED-PEN skip them on mptables too? */ |
299 | return; | 301 | return; |
302 | case PCI_VENDOR_ID_ATI: | ||
303 | /* All timer interrupts on atiixp | ||
304 | are doubled. Disable one. */ | ||
305 | if (disable_timer_pin_1 == 0) { | ||
306 | disable_timer_pin_1 = 1; | ||
307 | printk(KERN_INFO | ||
308 | "ATI board detected. Disabling timer pin 1.\n"); | ||
309 | } | ||
310 | return; | ||
300 | } | 311 | } |
301 | 312 | ||
302 | /* No multi-function device? */ | 313 | /* No multi-function device? */ |
@@ -1658,6 +1669,8 @@ static inline void check_timer(void) | |||
1658 | setup_nmi(); | 1669 | setup_nmi(); |
1659 | enable_8259A_irq(0); | 1670 | enable_8259A_irq(0); |
1660 | } | 1671 | } |
1672 | if (disable_timer_pin_1 > 0) | ||
1673 | clear_IO_APIC_pin(0, pin1); | ||
1661 | return; | 1674 | return; |
1662 | } | 1675 | } |
1663 | clear_IO_APIC_pin(0, pin1); | 1676 | clear_IO_APIC_pin(0, pin1); |
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c index 869770da2933..351d8d64c2fb 100644 --- a/arch/x86_64/kernel/setup.c +++ b/arch/x86_64/kernel/setup.c | |||
@@ -336,6 +336,11 @@ static __init void parse_cmdline_early (char ** cmdline_p) | |||
336 | #endif | 336 | #endif |
337 | #endif | 337 | #endif |
338 | 338 | ||
339 | if (!memcmp(from, "disable_timer_pin_1", 19)) | ||
340 | disable_timer_pin_1 = 1; | ||
341 | if (!memcmp(from, "enable_timer_pin_1", 18)) | ||
342 | disable_timer_pin_1 = -1; | ||
343 | |||
339 | if (!memcmp(from, "nolapic", 7) || | 344 | if (!memcmp(from, "nolapic", 7) || |
340 | !memcmp(from, "disableapic", 11)) | 345 | !memcmp(from, "disableapic", 11)) |
341 | disable_apic = 1; | 346 | disable_apic = 1; |