Re: IO-APIC on nforce2 [PATCH] + [PATCH] for nmi_debug=1 + [PATCH]

From: Ian Kumlien
Date: Mon May 10 2004 - 07:24:40 EST


On Mon, 2004-05-10 at 13:37, Ross Dickson wrote:
> Craig Bradney wrote
>
> >Well.. 2.6.6 is released.. and THANK YOU Linus and all the patch
> > writers.. we have nforce2 fixes in the released kernel now. I'm just
> > waiting for a gentoo-dev-sources release now..
> >
> >Craig
>
> MOMENT PLEASE.
> ALMOST complete nforce2 support. Job not done yet.

Damn =)

> Unfortunately 2.6.6 still has the old check_timer code which inhibits
> nmi_watchdog=1 on all nforce2 from working by having timer_ack=1
> when checking io-apic pit routing.
>
> It is a hardware issue - NOT A BUGGY BIOS ISSUE inside the integrated
> nforce2 interrupt routing.

So it should be in.

> To my understanding IT WILL NEVER BE FIXED BY A BIOS REVISION and
> after reading the 8259 datasheets I think it is a mistake within the
> existing code to have the timer_ack on there in the first place.

The "breaking" machine could be blacklisted instead.

> I would still like to see Maciej's check_timer patch in the kernel. It was
> pulled after only a single user mobo complaint was posted yet it helps
> both nforce2 and ibm bios pc's. To my knowledge little effort was made
> by that user to accomodate the patch - it was just outright pulled in spite
> of its benefit to others?

Hummm, and now ppl seem to be forcing 4k stacks that breaks my laptop to
a level of non usability.. =P

> Who do we ask to revisit this? Linus? the io-apic.c maintainer? or the one
> user with a complaint?

Perhaps there should be a workaround option, ie like acpi=force etc.

> That patch that was dropped by Linus? after appearing in 2.6.3-mm3.
> For those nforce2 users with problems of clock skew with the timer into pin0
> routing, that patch gave a virtual wire timer routing which worked well.

> It also works around serious problems for ibm users who also want it in.
> http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-04/4421.html

Rediffed it against 2.6.6
But i don't see how the virtual wire mode was done, i just rediffed the
patch that i found.

--
Ian Kumlien <pomac () vapor ! com> -- http://pomac.netswarm.net
--- linux/arch/i386/kernel/io_apic.c.orig 2004-05-10 14:08:00.000000000 +0200
+++ linux/arch/i386/kernel/io_apic.c 2004-05-10 14:12:17.000000000 +0200
@@ -2159,6 +2159,10 @@
{
int pin1, pin2;
int vector;
+ unsigned int ver;
+
+ ver = apic_read(APIC_LVR);
+ ver = GET_APIC_VERSION(ver);

/*
* get/set the timer IRQ vector:
@@ -2172,11 +2176,15 @@
* mode for the 8259A whenever interrupts are routed
* through I/O APICs. Also IRQ0 has to be enabled in
* the 8259A which implies the virtual wire has to be
- * disabled in the local APIC.
+ * disabled in the local APIC. Finally timer interrupts
+ * need to be acknowledged manually in the 8259A for
+ * do_slow_timeoffset() and for the i82489DX when using
+ * the NMI watchdog.
*/
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
init_8259A(1);
- timer_ack = 1;
+ timer_ack = !cpu_has_tsc;
+ timer_ack |= nmi_watchdog == NMI_IO_APIC && !APIC_INTEGRATED(ver);
enable_8259A_irq(0);

pin1 = find_isa_irq_pin(0, mp_INT);
@@ -2194,7 +2202,8 @@
disable_8259A_irq(0);
setup_nmi();
enable_8259A_irq(0);
- check_nmi_watchdog();
+ if (check_nmi_watchdog() < 0)
+ timer_ack = !cpu_has_tsc;
}
return;
}
@@ -2217,7 +2226,8 @@
add_pin_to_irq(0, 0, pin2);
if (nmi_watchdog == NMI_IO_APIC) {
setup_nmi();
- check_nmi_watchdog();
+ if (check_nmi_watchdog() < 0)
+ timer_ack = !cpu_has_tsc;
}
return;
}

Attachment: signature.asc
Description: This is a digitally signed message part