Based
on the mainboard config files I see, it looks like the only purpose of
SERIAL_CPU_INIT is to work around the nested spinlock issue with Intel
hyperthreaded CPUs. I don't think this is the best solution to the problem. To
me, 'SERIAL_CPU_INIT' implies a free choice - I can choose whether my CPUs are
initialized serially or concurrently, and either choice is acceptable. But
that's not the way it works; making the wrong choice on Intel systems causes the
system to hang.
I think a
better solution will do away with SERIAL_CPU_INIT, but might keep the spinlock
bracket around cpu_initialize(). The question is how to reconcile the
differences between AMD and Intel SMP startup. Can you provide any suggestions
from the AMD viewpoint?
Steve
You need
to keep SERIAL_CPU_INIT.
reason is for AMD K8 cpu_init regarding
init_ecc there maybe some conflict on console.
You can disable it by
set it to 0.
YH
On 9/9/05, Steven J.
Magnani <steve@digidescorp.com>
wrote:
This
patch resolves the issue identified in
http://openbios.org/pipermail/linuxbios/2005-July/011903.html.
Changes:
*
Remove spinlock bracketing of cpu_initialize() call
* Drop
SERIAL_CPU_INIT option
* (Unrelated) Attempt more descriptive comments
for various config
options
PATCH:
---
src/cpu/x86/lapic/lapic_cpu_init.c.orig
2005-09-09
09:29:25.156250000 -0500
+++
src/cpu/x86/lapic/lapic_cpu_init.c 2005-09-09
09:31:59.109375000
-0500
@@ -230,17 +230,16 @@
void
secondary_cpu_init(void)
{
atomic_inc(&active_cpus);
-#if
SERIAL_CPU_INIT == 1
- #if
CONFIG_MAX_CPUS>2
-
spin_lock(&start_cpu_lock);
- #endif
-#endif
+
+
// NOTE: The call to cpu_initialize() used to be bracketed
by
+
// calls to lock and unlock the
start_cpu_lock spin lock.
+
// These were removed to resolve a hang
due to nested spin
locking
+
// when secondary CPUs go to initialize
their siblings.
+
// See
http://openbios.org/pipermail/linuxbios/2005-July/011903.html.
+
// It's possible that some other form of
concurrency
control
+
// is needed at this
level.
cpu_initialize();
-#if
SERIAL_CPU_INIT == 1
- #if
CONFIG_MAX_CPUS>2
-
spin_unlock(&start_cpu_lock);
- #endif
-#endif
+
atomic_dec(&active_cpus);
stop_this_cpu();
}
@@
-265,11 +264,9
@@
printk_err("CPU %u
would not
start!\n",
cpu->path.u.apic.apic_id);
}
-#if
SERIAL_CPU_INIT == 1
#if
CONFIG_MAX_CPUS>2
udelay(10);
#endif
-#endif
}
/*
Now loop until the other cpus have finished initializing */
---
src/config/Options.lb.orig 2005-09-09 09:36:27.562500000
-0500
+++ src/config/Options.lb
2005-09-09 09:35:17.125000000 -0500
@@ -188,37 +188,37
@@
default
65536
format
"0x%x"
export
used
- comment "Default fallback
image size"
+ comment
"ROM_SECTION_SIZE to use for the fallback build."
end
define
ROM_SIZE
default
none
format
"0x%x"
export
used
- comment "Size of your
ROM"
+ comment "Total number of bytes
allocated for normal and fallback
LinuxBIOS images and payloads. Note
that the fallback image goes at the
end of the ROM, and the normal image
at the beginning."
end
define
ROM_IMAGE_SIZE
default
65535
format "0x%x"
export
always
- comment "Default image
size"
+ comment "Maximum number of
bytes allowed for a LinuxBIOS image.
Does not include the
payload."
end
define ROM_SECTION_SIZE
default
{FALLBACK_SIZE}
format
"0x%x"
export
used
- comment "Default rom section
size"
+ comment "Default rom section
size. Normally, this is calculated
in mainboard Config.lb and varies between the normal and
fallback
builds."
end
define
ROM_SECTION_OFFSET
default
{ROM_SIZE -
FALLBACK_SIZE}
format
"0x%x"
export
used
- comment "Default rom section
offset"
+ comment "Number of bytes
from the beginning of the ROM to the
start of the section containing this
build (normal or fallback).
Normally, this is calculated in mainboard Config.lb."
end
define
PAYLOAD_SIZE
default
{ROM_SECTION_SIZE -
ROM_IMAGE_SIZE}
format
"0x%x"
export always
- comment "Default payload
size"
+ comment "Maximum number of
bytes allowed for a payload.
Normally, this is calculated as
above."
end
define
_ROMBASE
default
{PAYLOAD_SIZE}
@@ -479,7 +479,7
@@
export
used
comment "System
clock frequency in
MHz"
end
-
+
###############################################
#
SMP options
###############################################
@@
-509,11 +509,6 @@
export
used
comment "Define to
build an MP table"
end
-define
SERIAL_CPU_INIT
- default
1
- export
always
- comment
"Serialize CPU init"
-end
###############################################
# Boot
options
@@ -533,7 +528,7
@@
default {0xffffffff -
ROM_SIZE + ROM_SECTION_OFFSET +
1}
format
"0x%x"
export always
- comment "ROM stream start
location"
+ comment "Memory address
of this (normal or fallback) build's
payload in ROM. Normally, this is
calculated as above."
end
define CONFIG_FS_STREAM
default 0
---
src/mainboard/tyan/s2735/Options.lb.orig 2005-09-08
13:35:22.453125000
-0500
+++ src/mainboard/tyan/s2735/Options.lb 2005-09-09
09:21:21.531250000
-0500
@@ -8,7 +8,6 @@
uses
CONFIG_MAX_CPUS
uses CONFIG_MAX_PHYSICAL_CPUS
uses
CONFIG_LOGICAL_CPUS
-uses SERIAL_CPU_INIT
uses CONFIG_IOAPIC
uses
CONFIG_SMP
uses FALLBACK_SIZE
@@ -127,8 +126,6 @@
default
CONFIG_MAX_PHYSICAL_CPUS=2
default CONFIG_LOGICAL_CPUS=1
-default
SERIAL_CPU_INIT=0
-
#BTEXT Console
#default
CONFIG_CONSOLE_BTEXT=1
------------------------------------------------------------------------
Steven
J.
Magnani
"I claim this network for MARS!
www.digidescorp.com Earthling,
return my space modulator!"
#include
<standard.disclaimer>
--
LinuxBIOS
mailing list
LinuxBIOS@openbios.org
http://www.openbios.org/mailman/listinfo/linuxbios