Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 8637
b: refs/heads/master
c: 66759a0
h: refs/heads/master
i:
  8635: 525d5f5
v: v3
  • Loading branch information
Chuck Ebbert authored and Linus Torvalds committed Sep 12, 2005
1 parent 6bef34a commit 3d86383
Show file tree
Hide file tree
Showing 9 changed files with 48 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 049cdefe19f95b67b06b70915cd8e4ae7173337a
refs/heads/master: 66759a01adbfe8828dd063e32cf5ed3f46696181
9 changes: 9 additions & 0 deletions trunk/Documentation/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,15 @@ running once the system is up.
over-ride platform specific driver.
See also Documentation/acpi-hotkey.txt.

enable_timer_pin_1 [i386,x86-64]
Enable PIN 1 of APIC timer
Can be useful to work around chipset bugs (in particular on some ATI chipsets)
The kernel tries to set a reasonable default.

disable_timer_pin_1 [i386,x86-64]
Disable PIN 1 of APIC timer
Can be useful to work around chipset bugs.

ad1816= [HW,OSS]
Format: <io>,<irq>,<dma>,<dma2>
See also Documentation/sound/oss/AD1816.
Expand Down
7 changes: 7 additions & 0 deletions trunk/arch/i386/kernel/acpi/earlyquirk.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ static int __init check_bridge(int vendor, int device)
if (vendor == PCI_VENDOR_ID_NVIDIA) {
acpi_skip_timer_override = 1;
}
/*
* ATI IXP chipsets get double timer interrupts.
* For now just do this for all ATI chipsets.
* FIXME: this needs to be checked for the non ACPI case too.
*/
if (vendor == PCI_VENDOR_ID_ATI)
disable_timer_pin_1 = 1;
return 0;
}

Expand Down
4 changes: 4 additions & 0 deletions trunk/arch/i386/kernel/io_apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ int sis_apic_bug = -1;
*/
int nr_ioapic_registers[MAX_IO_APICS];

int disable_timer_pin_1 __initdata;

/*
* Rough estimation of how many shared IRQs there are, can
* be changed anytime.
Expand Down Expand Up @@ -2211,6 +2213,8 @@ static inline void check_timer(void)
setup_nmi();
enable_8259A_irq(0);
}
if (disable_timer_pin_1 > 0)
clear_IO_APIC_pin(0, pin1);
return;
}
clear_IO_APIC_pin(0, pin1);
Expand Down
5 changes: 5 additions & 0 deletions trunk/arch/i386/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -851,6 +851,11 @@ static void __init parse_cmdline_early (char ** cmdline_p)
#endif

#ifdef CONFIG_X86_LOCAL_APIC
if (!memcmp(from, "disable_timer_pin_1", 19))
disable_timer_pin_1 = 1;
if (!memcmp(from, "enable_timer_pin_1", 18))
disable_timer_pin_1 = -1;

/* disable IO-APIC */
else if (!memcmp(from, "noapic", 6))
disable_ioapic_setup();
Expand Down
13 changes: 13 additions & 0 deletions trunk/arch/x86_64/kernel/io_apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ int sis_apic_bug; /* not actually supported, dummy for compile */

static int no_timer_check;

int disable_timer_pin_1 __initdata;

static DEFINE_SPINLOCK(ioapic_lock);

/*
Expand Down Expand Up @@ -297,6 +299,15 @@ void __init check_ioapic(void)
#endif
/* RED-PEN skip them on mptables too? */
return;
case PCI_VENDOR_ID_ATI:
/* All timer interrupts on atiixp
are doubled. Disable one. */
if (disable_timer_pin_1 == 0) {
disable_timer_pin_1 = 1;
printk(KERN_INFO
"ATI board detected. Disabling timer pin 1.\n");
}
return;
}

/* No multi-function device? */
Expand Down Expand Up @@ -1658,6 +1669,8 @@ static inline void check_timer(void)
setup_nmi();
enable_8259A_irq(0);
}
if (disable_timer_pin_1 > 0)
clear_IO_APIC_pin(0, pin1);
return;
}
clear_IO_APIC_pin(0, pin1);
Expand Down
5 changes: 5 additions & 0 deletions trunk/arch/x86_64/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,11 @@ static __init void parse_cmdline_early (char ** cmdline_p)
#endif
#endif

if (!memcmp(from, "disable_timer_pin_1", 19))
disable_timer_pin_1 = 1;
if (!memcmp(from, "enable_timer_pin_1", 18))
disable_timer_pin_1 = -1;

if (!memcmp(from, "nolapic", 7) ||
!memcmp(from, "disableapic", 11))
disable_apic = 1;
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/asm-i386/apic.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ extern unsigned int nmi_watchdog;
#define NMI_LOCAL_APIC 2
#define NMI_INVALID 3

extern int disable_timer_pin_1;

#else /* !CONFIG_X86_LOCAL_APIC */
static inline void lapic_shutdown(void) { }

Expand Down
2 changes: 2 additions & 0 deletions trunk/include/asm-x86_64/apic.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,8 @@ extern unsigned int nmi_watchdog;
#define NMI_LOCAL_APIC 2
#define NMI_INVALID 3

extern int disable_timer_pin_1;

#endif /* CONFIG_X86_LOCAL_APIC */

extern unsigned boot_cpu_id;
Expand Down

0 comments on commit 3d86383

Please sign in to comment.