Revert "Use broadcast SIPI to startup siblings"
This reverts commit 042c1461fb
.
It turned out that sending IPIs via broadcast doesn't work on
Sandybridge. We tried to come up with a solution, but didn't
found any so far. So revert the code for now until we have
a working solution.
Change-Id: I7dd1cba5a4c1e4b0af366b20e8263b1f6f4b9714
Signed-off-by: Sven Schnelle <svens@stackframe.org>
Reviewed-on: http://review.coreboot.org/1381
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
committed by
Ronald G. Minnich
parent
a2701c6005
commit
51676b14e8
@@ -3,6 +3,10 @@ menu "Architecture (x86)"
|
||||
# This is an SMP option. It relates to starting up APs.
|
||||
# It is usually set in mainboard/*/Kconfig.
|
||||
# TODO: Improve description.
|
||||
config AP_IN_SIPI_WAIT
|
||||
bool
|
||||
default n
|
||||
depends on ARCH_X86
|
||||
|
||||
# Aligns 16bit entry code in bootblock so that hyper-threading CPUs
|
||||
# can boot AP CPUs to enable their shared caches.
|
||||
|
@@ -158,6 +158,30 @@ struct cpu_driver {
|
||||
struct device;
|
||||
struct cpu_driver *find_cpu_driver(struct device *cpu);
|
||||
|
||||
struct cpu_info {
|
||||
device_t cpu;
|
||||
unsigned long index;
|
||||
};
|
||||
|
||||
static inline struct cpu_info *cpu_info(void)
|
||||
{
|
||||
struct cpu_info *ci;
|
||||
__asm__("andl %%esp,%0; "
|
||||
"orl %2, %0 "
|
||||
:"=r" (ci)
|
||||
: "0" (~(CONFIG_STACK_SIZE - 1)),
|
||||
"r" (CONFIG_STACK_SIZE - sizeof(struct cpu_info))
|
||||
);
|
||||
return ci;
|
||||
}
|
||||
|
||||
static inline unsigned long cpu_index(void)
|
||||
{
|
||||
struct cpu_info *ci;
|
||||
ci = cpu_info();
|
||||
return ci->index;
|
||||
}
|
||||
|
||||
struct cpuinfo_x86 {
|
||||
uint8_t x86; /* CPU family */
|
||||
uint8_t x86_vendor; /* CPU vendor */
|
||||
|
@@ -9,7 +9,6 @@
|
||||
#include <device/path.h>
|
||||
#include <device/device.h>
|
||||
#include <smp/spinlock.h>
|
||||
#include <cpu/x86/lapic.h>
|
||||
|
||||
/* Standard macro to see if a specific flag is changeable */
|
||||
static inline int flag_is_changeable_p(uint32_t flag)
|
||||
@@ -235,7 +234,7 @@ static void set_cpu_ops(struct device *cpu)
|
||||
cpu->ops = driver ? driver->ops : NULL;
|
||||
}
|
||||
|
||||
void cpu_initialize(struct bus *cpu_bus, int index)
|
||||
void cpu_initialize(void)
|
||||
{
|
||||
/* Because we busy wait at the printk spinlock.
|
||||
* It is important to keep the number of printed messages
|
||||
@@ -243,17 +242,17 @@ void cpu_initialize(struct bus *cpu_bus, int index)
|
||||
* disabled.
|
||||
*/
|
||||
struct device *cpu;
|
||||
struct cpu_info *info;
|
||||
struct cpuinfo_x86 c;
|
||||
struct device_path cpu_path;
|
||||
unsigned char id = lapicid();
|
||||
|
||||
cpu_path.type = DEVICE_PATH_APIC;
|
||||
cpu_path.apic.apic_id = id;
|
||||
info = cpu_info();
|
||||
|
||||
cpu = alloc_find_dev(cpu_bus, &cpu_path);
|
||||
cpu->path.apic.index = index;
|
||||
printk(BIOS_INFO, "Initializing CPU #%ld\n", info->index);
|
||||
|
||||
printk(BIOS_DEBUG, "Initializing CPU #%d\n", id);
|
||||
cpu = info->cpu;
|
||||
if (!cpu) {
|
||||
die("CPU: missing cpu device structure");
|
||||
}
|
||||
|
||||
/* Find what type of cpu we are dealing with */
|
||||
identify_cpu(cpu);
|
||||
@@ -277,6 +276,7 @@ void cpu_initialize(struct bus *cpu_bus, int index)
|
||||
printk(BIOS_DEBUG, "Using generic cpu ops (good)\n");
|
||||
}
|
||||
|
||||
|
||||
/* Initialize the cpu */
|
||||
if (cpu->ops && cpu->ops->init) {
|
||||
cpu->enabled = 1;
|
||||
@@ -284,7 +284,7 @@ void cpu_initialize(struct bus *cpu_bus, int index)
|
||||
cpu->ops->init(cpu);
|
||||
}
|
||||
|
||||
printk(BIOS_INFO, "CPU #%d initialized\n", id);
|
||||
printk(BIOS_INFO, "CPU #%ld initialized\n", info->index);
|
||||
|
||||
return;
|
||||
}
|
||||
|
Reference in New Issue
Block a user