Re: 2.6.14-rc1 on ATI hangs when executing _STA and _INI methods

Linus Torvalds
2005-09-14T22:28:20Z

On Wed, 15 Sep 2005, Peter Osterlund wrote:
>
> My Compaq Presario R3057EA hangs during ACPI initialization. The last
> message is "Executing all Device _STA and _INI methods". git bisect
> told me that:
>
> 66759a01adbfe8828dd063e32cf5ed3f46696181 is first bad commit
> diff-tree 66759a01adbfe8828dd063e32cf5ed3f46696181 (from 049cdefe19f95b67b06b70915cd8e4ae7173337a)
> Author: Chuck Ebbert <76306.1226@compuserve.com>
> Date: Mon Sep 12 18:49:25 2005 +0200
>
> [PATCH] x86-64: i386/x86-64: Fix time going twice as fast problem on ATI Xpress chipsets
>
> Passing enable_timer_pin_1 as a kernel boot parameter doesn't help,
> but this patch does:

Ok. That patch has been one big pain, and was clearly totally half-baked.
I think I'll disable the automated checks, since they are clearly wrong.
You can still enable it manually with a kernel command line.

So something like this.. I assume this works for you?

Linus

----
diff --git a/arch/i386/kernel/acpi/earlyquirk.c b/arch/i386/kernel/acpi/earlyquirk.c
--- a/arch/i386/kernel/acpi/earlyquirk.c
+++ b/arch/i386/kernel/acpi/earlyquirk.c
@@ -7,7 +7,6 @@
#include <linux/pci.h>
#include <asm/pci-direct.h>
#include <asm/acpi.h>
-#include <asm/apic.h>

static int __init check_bridge(int vendor, int device)
{
@@ -16,15 +15,6 @@ static int __init check_bridge(int vendo
if (vendor == PCI_VENDOR_ID_NVIDIA) {
acpi_skip_timer_override = 1;
}
-#ifdef CONFIG_X86_LOCAL_APIC
- /*
- * 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;
-#endif
return 0;
}

diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c
--- a/arch/x86_64/kernel/io_apic.c
+++ b/arch/x86_64/kernel/io_apic.c
@@ -299,15 +299,6 @@ 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? */