Fixes and Sandybridge support for lapic cpu init

- preprocessor macros should not use defined(CONFIG_*) but
  just CONFIG_*
- drop AMD CPU model 14XXX config variable use. Those do not exist.
- skip some delays on Sandybridge systems
- Count how long we're waiting for each AP to stop
- Skip speedstep specific CPU entries

Change-Id: I13db384ba4e28acbe7f0f8c9cd169954b39f167d
Signed-off-by: Stefan Reinauer <reinauer@google.com>
Signed-off-by: Duncan Laurie <dlaurie@google.com>
Reviewed-on: http://review.coreboot.org/871
Tested-by: build bot (Jenkins)
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
This commit is contained in:
Stefan Reinauer 2012-04-03 16:17:11 -07:00 committed by Stefan Reinauer
parent f8c7c2396e
commit 2bdfb48b13
2 changed files with 14 additions and 4 deletions

View File

@ -14,6 +14,7 @@
#include <smp/atomic.h> #include <smp/atomic.h>
#include <smp/spinlock.h> #include <smp/spinlock.h>
#include <cpu/cpu.h> #include <cpu/cpu.h>
#include <cpu/intel/speedstep.h>
#if CONFIG_SMP == 1 #if CONFIG_SMP == 1
/* This is a lot more paranoid now, since Linux can NOT handle /* This is a lot more paranoid now, since Linux can NOT handle
@ -108,7 +109,7 @@ static int lapic_start_cpu(unsigned long apicid)
} }
return 0; return 0;
} }
#if !defined (CONFIG_CPU_AMD_MODEL_10XXX) && !defined (CONFIG_CPU_AMD_MODEL_14XXX) #if !CONFIG_CPU_AMD_MODEL_10XXX && !CONFIG_CPU_INTEL_MODEL_206AX
mdelay(10); mdelay(10);
#endif #endif
@ -136,7 +137,7 @@ static int lapic_start_cpu(unsigned long apicid)
start_eip = get_valid_start_eip((unsigned long)_secondary_start); start_eip = get_valid_start_eip((unsigned long)_secondary_start);
#if !defined (CONFIG_CPU_AMD_MODEL_10XXX) && !defined (CONFIG_CPU_AMD_MODEL_14XXX) #if !CONFIG_CPU_AMD_MODEL_10XXX
num_starts = 2; num_starts = 2;
#else #else
num_starts = 1; num_starts = 1;
@ -446,6 +447,8 @@ static void wait_other_cpus_stop(struct bus *cpu_bus)
{ {
device_t cpu; device_t cpu;
int old_active_count, active_count; int old_active_count, active_count;
long loopcount = 0;
/* Now loop until the other cpus have finished initializing */ /* Now loop until the other cpus have finished initializing */
old_active_count = 1; old_active_count = 1;
active_count = atomic_read(&active_cpus); active_count = atomic_read(&active_cpus);
@ -456,17 +459,21 @@ static void wait_other_cpus_stop(struct bus *cpu_bus)
} }
udelay(10); udelay(10);
active_count = atomic_read(&active_cpus); active_count = atomic_read(&active_cpus);
loopcount++;
} }
for(cpu = cpu_bus->children; cpu; cpu = cpu->sibling) { for(cpu = cpu_bus->children; cpu; cpu = cpu->sibling) {
if (cpu->path.type != DEVICE_PATH_APIC) { if (cpu->path.type != DEVICE_PATH_APIC) {
continue; continue;
} }
if (cpu->path.apic.apic_id == SPEEDSTEP_APIC_MAGIC) {
continue;
}
if (!cpu->initialized) { if (!cpu->initialized) {
printk(BIOS_ERR, "CPU 0x%02x did not initialize!\n", printk(BIOS_ERR, "CPU 0x%02x did not initialize!\n",
cpu->path.apic.apic_id); cpu->path.apic.apic_id);
} }
} }
printk(BIOS_DEBUG, "All AP CPUs stopped\n"); printk(BIOS_DEBUG, "All AP CPUs stopped (%ld loops)\n", loopcount);
} }
#else /* CONFIG_SMP */ #else /* CONFIG_SMP */

View File

@ -19,6 +19,9 @@
* MA 02110-1301 USA * MA 02110-1301 USA
*/ */
/* Magic value used to locate speedstep configuration in the device tree */
#define SPEEDSTEP_APIC_MAGIC 0xACAC
/* MWAIT coordination I/O base address. This must match /* MWAIT coordination I/O base address. This must match
* the \_PR_.CPU0 PM base address. * the \_PR_.CPU0 PM base address.
*/ */