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
@@ -13,6 +13,7 @@ config CPU_SPECIFIC_OPTIONS
|
||||
select UDELAY_LAPIC
|
||||
select SMM_TSEG
|
||||
select MICROCODE_IN_CBFS
|
||||
#select AP_IN_SIPI_WAIT
|
||||
|
||||
config BOOTBLOCK_CPU_INIT
|
||||
string
|
||||
|
@@ -26,7 +26,6 @@
|
||||
#include <arch/acpigen.h>
|
||||
#include <arch/cpu.h>
|
||||
#include <cpu/x86/msr.h>
|
||||
#include <cpu/x86/lapic.h>
|
||||
#include <cpu/intel/acpi.h>
|
||||
#include <cpu/intel/speedstep.h>
|
||||
#include <cpu/intel/turbo.h>
|
||||
@@ -89,8 +88,8 @@ static int generate_cstate_entries(acpi_cstate_t *cstates,
|
||||
|
||||
static int generate_C_state_entries(void)
|
||||
{
|
||||
struct cpu_info *info;
|
||||
struct cpu_driver *cpu;
|
||||
struct device *cpu_dev;
|
||||
int len, lenif;
|
||||
device_t lapic;
|
||||
struct cpu_intel_model_206ax_config *conf = NULL;
|
||||
@@ -104,10 +103,10 @@ static int generate_C_state_entries(void)
|
||||
return 0;
|
||||
|
||||
/* Find CPU map of supported C-states */
|
||||
cpu_dev = dev_find_lapic(lapicid());
|
||||
if (!cpu_dev)
|
||||
info = cpu_info();
|
||||
if (!info)
|
||||
return 0;
|
||||
cpu = find_cpu_driver(cpu_dev);
|
||||
cpu = find_cpu_driver(info->cpu);
|
||||
if (!cpu || !cpu->cstates)
|
||||
return 0;
|
||||
|
||||
|
@@ -430,6 +430,58 @@ static void configure_mca(void)
|
||||
static unsigned ehci_debug_addr;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Initialize any extra cores/threads in this package.
|
||||
*/
|
||||
static void intel_cores_init(device_t cpu)
|
||||
{
|
||||
struct cpuid_result result;
|
||||
unsigned cores, threads, i;
|
||||
|
||||
result = cpuid_ext(0xb, 0); /* Threads per core */
|
||||
threads = result.ebx & 0xff;
|
||||
|
||||
result = cpuid_ext(0xb, 1); /* Cores per package */
|
||||
cores = result.ebx & 0xff;
|
||||
|
||||
/* Only initialize extra cores from BSP */
|
||||
if (cpu->path.apic.apic_id)
|
||||
return;
|
||||
|
||||
printk(BIOS_DEBUG, "CPU: %u has %u cores %u threads\n",
|
||||
cpu->path.apic.apic_id, cores, threads);
|
||||
|
||||
for (i = 1; i < cores; ++i) {
|
||||
struct device_path cpu_path;
|
||||
device_t new;
|
||||
|
||||
/* Build the cpu device path */
|
||||
cpu_path.type = DEVICE_PATH_APIC;
|
||||
cpu_path.apic.apic_id =
|
||||
cpu->path.apic.apic_id + i;
|
||||
|
||||
/* Update APIC ID if no hyperthreading */
|
||||
if (threads == 1)
|
||||
cpu_path.apic.apic_id <<= 1;
|
||||
|
||||
/* Allocate the new cpu device structure */
|
||||
new = alloc_dev(cpu->bus, &cpu_path);
|
||||
if (!new)
|
||||
continue;
|
||||
|
||||
printk(BIOS_DEBUG, "CPU: %u has core %u\n",
|
||||
cpu->path.apic.apic_id,
|
||||
new->path.apic.apic_id);
|
||||
|
||||
/* Start the new cpu */
|
||||
if (!start_cpu(new)) {
|
||||
/* Record the error in cpu? */
|
||||
printk(BIOS_ERR, "CPU %u would not start!\n",
|
||||
new->path.apic.apic_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void model_206ax_init(device_t cpu)
|
||||
{
|
||||
char processor_name[49];
|
||||
@@ -491,6 +543,9 @@ static void model_206ax_init(device_t cpu)
|
||||
|
||||
/* Enable Turbo */
|
||||
enable_turbo();
|
||||
|
||||
/* Start up extra cores */
|
||||
intel_cores_init(cpu);
|
||||
}
|
||||
|
||||
static struct device_operations cpu_dev_ops = {
|
||||
|
Reference in New Issue
Block a user