lkml.org 
[lkml]   [2000]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patches in this message
/
Date
From
Subject[PATCH] VIA82C694X based SMP board...
Hi,
after couple of hours of hacking I finally got my VIA82C694X based
SMP board (Gigabyte GA-6VXD7) to work. I had to add 'udelay(300);'
after sending startup ipi, before we print something to screen.

Without this udelay it died at the beginning of second printk
(that is, Startup point 1. was printed, there was one empty line at
the end of screen, but Waiting for send to finish was not visible.
And cursor was sometime at the beginning of last line, sometime
at the end of last line, and sometime invisible :-( ) in couple
of spectacular ways - almost always hard lock, but four times it
except hardlocking also powered down both CPU fans and did not react
even to hard reset (well, it reacted, but BIOS was not able to
initialize machine).

I have no idea whether memory r-m-w cycle killed it, or whether
PCI outb cycle (vgacon cursor move) killed it, or what-where-why...
But it must be something in our secondary CPU kernel initialization,
as if I add some loop into trampoline.S, I must increase delay.

If somebody has access to VIA specs (I asked them, but no answer
yet) and can confirm this in their errata, or if someone sees something
like that in Intel PIII errata (Pentium III Coppermine, BIOS says
CPU ID: 0683, Patch ID: 0010)...

Anyway, without either of two patches below my machine does not
boot. Is there any reason why we cannot add 'udelay(300);' after
sending startup IPI, as first patch does? Both patches are for
2.4.0-test12. I did not tried 2.2.18 yet (should I?).

And another question, is there anybody successfully using
Gigabyte 6VXD7 board with two CPUs under Linux 2.4.0-test12 (Netware
worked without any patch, just FYI) ?
Thanks,
Petr Vandrovec
vandrove@vc.cvut.cz





Variant #1:

diff -urdN linux/arch/i386/kernel/smpboot.c linux/arch/i386/kernel/smpboot.c
--- linux/arch/i386/kernel/smpboot.c Mon Dec 4 01:48:19 2000
+++ linux/arch/i386/kernel/smpboot.c Wed Dec 13 22:30:47 2000
@@ -694,9 +694,22 @@
apic_write_around(APIC_ICR, APIC_DM_STARTUP
| (start_eip >> 12));

+ /*
+ * Petr Vandrovec:
+ *
+ * We must not do I/O operations for at least
+ * 300us... printk does (probably acquiring spinlock
+ * kills it)... Kills VT82C694X based
+ * SMP board. At least mine GA-6VXD7.
+ * 100us is not enough, 200us is enough,
+ * so I use 300us for additional safety.
+ */
+
+ udelay(300);
+
Dprintk("Startup point 1.\n");

Dprintk("Waiting for send to finish...\n");
timeout = 0;
do {
Dprintk("+");

Variant #2:

--- linux/arch/i386/kernel/smpboot.c Mon Dec 4 02:48:19 2000
+++ linux/arch/i386/kernel/smpboot.c Wed Dec 13 23:29:11 2000
@@ -694,9 +694,19 @@
apic_write_around(APIC_ICR, APIC_DM_STARTUP
| (start_eip >> 12));

+ /*
+ * Petr Vandrovec:
+ *
+ * We must not do I/O operations for at least
+ * 300 us... printk does (probably acquiring spinlock
+ * kills it)... Kills VT82C694X based
+ * SMP board. At least mine GA-6VXD7.
+
Dprintk("Startup point 1.\n");

Dprintk("Waiting for send to finish...\n");
+ */
+
timeout = 0;
do {
Dprintk("+");
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 13:28    [W:0.037 / U:0.672 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site