Re: [PATCH] Replace nvidia timer override quirk with pci id list

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Prakash Punnoor <prakash@...>
Cc: Andi Kleen <andi@...>, <mingo@...>, <tglx@...>, <lenb@...>, <linux-kernel@...>
Date: Friday, February 8, 2008 - 7:36 am

On Thu, Feb 07, 2008 at 10:21:18PM +0100, Prakash Punnoor wrote:

Hmm, if you told me it got lost somewhere, sorry.


Ok we can keep the HPET check if that makes you more happy.


The list only contains IDs where the override should be ignored; so
if it has a correct one and it's not there everything is fine.

I'm appending a revised patch. Does it work for you?

-Andi

---

Replace nvidia timer override quirk with pci id list v2

[This patch was originally in the old ff tree and was intended for .24; but
somehow got lost in the arch merge. Has also shipped with OpenSUSE 10.3.
I think it should go into .25] 

This replaces the old NF3/NF4 reference BIOS timer override quirk with a device 
ID list. We need to ignore the timer override on these systems, but not 
ignore it on NF5 based systems. Previously this was distingushed by checking
for HPET, but a lot of BIOS vendors didn't enable HPET in their pre Vista 
BIOSes.

Replace the old "for all of nvidia" quirk with a quirk containing pci device
ID. I goobled this list together from pci.ids and googling and it may be 
incomplete, but so far I haven't had complaints.

I also straightened out the ifdef jungle a bit.

v1->v2: Readd the HPET check to handle a NF4 system of Prakash Punnoor.
	This means with HPET we always assume timer overrides are ok.

Cc: lenb@kernel.org

Signed-off-by: Andi Kleen <ak@suse.de>

---
 arch/x86/kernel/early-quirks.c |   43 ++++++++++++++++-------------------------
 1 file changed, 17 insertions(+), 26 deletions(-)

Index: linux/arch/x86/kernel/early-quirks.c
===================================================================
--- linux.orig/arch/x86/kernel/early-quirks.c
+++ linux/arch/x86/kernel/early-quirks.c
@@ -67,37 +67,30 @@ static int __init nvidia_hpet_check(stru
 {
 	return 0;
 }
-#endif /* CONFIG_X86_IO_APIC */
-#endif /* CONFIG_ACPI */
 
-static void __init nvidia_bugs(int num, int slot, int func)
+static void __init nvidia_timer(int num, int slot, int func)
 {
-#ifdef CONFIG_ACPI
-#ifdef CONFIG_X86_IO_APIC
-	/*
-	 * All timer overrides on Nvidia are
-	 * wrong unless HPET is enabled.
-	 * Unfortunately that's not true on many Asus boards.
-	 * We don't know yet how to detect this automatically, but
-	 * at least allow a command line override.
-	 */
 	if (acpi_use_timer_override)
 		return;
-
-	if (acpi_table_parse(ACPI_SIG_HPET, nvidia_hpet_check)) {
-		acpi_skip_timer_override = 1;
-		printk(KERN_INFO "Nvidia board "
-		       "detected. Ignoring ACPI "
-		       "timer override.\n");
-		printk(KERN_INFO "If you got timer trouble "
-			"try acpi_use_timer_override\n");
+
+	/* When the board has HPET assume timer override is ok */
+	if (!acpi_table_parse(ACPI_SIG_HPET, nvidia_hpet_check)) {
+		printk(KERN_INFO "Pre Nforce5 Nvidia board detected with HPET.\n"
+		       KERN_INFO "Assuming timer override is ok. If you have trouble\n"
+		       KERN_INFO "please try booting with acpi_skip_timer_override\n");
+		return;
 	}
-#endif
-#endif
-	/* RED-PEN skip them on mptables too? */
 
+	acpi_skip_timer_override = 1;
+	printk(KERN_INFO "Pre NForce5 Nvidia board "
+	       "detected. Ignoring ACPI timer override.\n");
+	printk(KERN_INFO "If you got timer trouble "
+		"try acpi_use_timer_override\n");
 }
 
+#endif
+#endif
+
 static void __init ati_bugs(int num, int slot, int func)
 {
 #ifdef CONFIG_X86_IO_APIC
@@ -121,9 +114,21 @@ struct chipset {
 	void (*f)(int num, int slot, int func);
 };
 
+#define QBRIDGE(vendor, device, func) { \
+	vendor, device, PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, \
+	QFLAG_APPLY_ONCE, func }
+
 static struct chipset early_qrk[] __initdata = {
-	{ PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
-	  PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, nvidia_bugs },
+#if defined(CONFIG_ACPI) && defined(CONFIG_X86_IO_APIC)
+	/* This list should cover at least one PCI ID from each NF3 or NF4
+	   mainboard to handle bogus timer overrides in their reference BIOS. */
+	QBRIDGE(PCI_VENDOR_ID_NVIDIA, 0x00e1, nvidia_timer), /* nforce 3 */
+	QBRIDGE(PCI_VENDOR_ID_NVIDIA, 0x00ed, nvidia_timer), /* nforce 3 */
+	QBRIDGE(PCI_VENDOR_ID_NVIDIA, 0x003d, nvidia_timer), /* mcp 04 ?? */
+	QBRIDGE(PCI_VENDOR_ID_NVIDIA, 0x02f0, nvidia_timer), /* mcp 51/nf4 ? */
+	QBRIDGE(PCI_VENDOR_ID_NVIDIA, 0x026f, nvidia_timer), /* mcp 51/nf4 ? */
+	QBRIDGE(PCI_VENDOR_ID_NVIDIA, 0x005c, nvidia_timer), /* ck 804 */
+#endif
 	{ PCI_VENDOR_ID_VIA, PCI_ANY_ID,
 	  PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, via_bugs },
 	{ PCI_VENDOR_ID_ATI, PCI_ANY_ID,
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Re: [PATCH] Replace nvidia timer override quirk with pci id ..., Andi Kleen, (Fri Feb 8, 7:36 am)