[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20080208113638.GA4745@one.firstfloor.org>
Date: Fri, 8 Feb 2008 12:36:38 +0100
From: Andi Kleen <andi@...stfloor.org>
To: Prakash Punnoor <prakash@...noor.de>
Cc: Andi Kleen <andi@...stfloor.org>, mingo@...e.hu,
tglx@...utronix.de, lenb@...nel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] Replace nvidia timer override quirk with pci id list
On Thu, Feb 07, 2008 at 10:21:18PM +0100, Prakash Punnoor wrote:
> On the day of Thursday 07 February 2008 Andi Kleen hast written:
>
> > 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.
>
> > + QBRIDGE(PCI_VENDOR_ID_NVIDIA, 0x02f0, nvidia_timer), /* mcp 51/nf4 ? */
>
> If you want to skip timer override on this board, this is a *NAK* from me. I
> told you the last time, it only works reliably here on MCP51 with timer
Hmm, if you told me it got lost somewhere, sorry.
> override working. Even before Asus released a bios which had an option to
> enable the hpet, I needed the override or I got irratic behaviour. Since I
> got hpet enabled I gave up on arguing as the wrongly triggered quirk didn't
> bug me anymore.
Ok we can keep the HPET check if that makes you more happy.
>
> IIRC my nforce2 needed the override. I didn't see that in the list.
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@...nel.org
Signed-off-by: Andi Kleen <ak@...e.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,
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists