diff options
author | Yinghai Lu <yinghai.lu at amd.com> | 2007-04-06 19:57:42 +0000 |
---|---|---|
committer | Stefan Reinauer <stepan@openbios.org> | 2007-04-06 19:57:42 +0000 |
commit | 30b4abeedc98db5a607f434af67e2fe2626ef111 (patch) | |
tree | 6fde1264fce271e31c48046610106000bd4987cb /src/arch/i386/lib/cpu.c | |
parent | a3cf00e4bab084a231cbd7cafab3c02342c400e0 (diff) |
Part III of YhLu's patch from January 18th
Signed-off-by: Yinghai Lu <yinghai.lu at amd.com>
Signed-off-by: Ed Swierk <eswierk at arastra.com>
Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Ward Vandewege <ward at gnu.org>
Acked-by: Stefan Reinauer <stepan@coresystems.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2590 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'src/arch/i386/lib/cpu.c')
-rw-r--r-- | src/arch/i386/lib/cpu.c | 55 |
1 files changed, 25 insertions, 30 deletions
diff --git a/src/arch/i386/lib/cpu.c b/src/arch/i386/lib/cpu.c index aee230d075..c1b2e5fbf1 100644 --- a/src/arch/i386/lib/cpu.c +++ b/src/arch/i386/lib/cpu.c @@ -207,7 +207,6 @@ static void set_cpu_ops(struct device *cpu) } } } - die("Unknown cpu"); return; found: cpu->ops = driver->ops; @@ -223,7 +222,7 @@ void cpu_initialize(void) struct device *cpu; struct cpu_info *info; struct cpuinfo_x86 c; - + info = cpu_info(); printk_notice("Initializing CPU #%d\n", info->index); @@ -233,41 +232,37 @@ void cpu_initialize(void) die("CPU: missing cpu device structure"); } - // Check that we haven't been passed bad information as the result of a race - // (i.e. BSP timed out while waiting for us to load secondary_stack) - -#if CONFIG_SMP || CONFIG_IOPIC - if (cpu->path.u.apic.apic_id != lapicid()) { - printk_err("CPU #%d Initialization FAILED: APIC ID mismatch (%u != %u)\n", - info->index, cpu->path.u.apic.apic_id, lapicid()); - // return without setting initialized flag - } else { -#endif - /* Find what type of cpu we are dealing with */ - identify_cpu(cpu); - printk_debug("CPU: vendor %s device %x\n", - cpu_vendor_name(cpu->vendor), cpu->device); + /* Find what type of cpu we are dealing with */ + identify_cpu(cpu); + printk_debug("CPU: vendor %s device %x\n", + cpu_vendor_name(cpu->vendor), cpu->device); - get_fms(&c, cpu->device); + get_fms(&c, cpu->device); - printk_debug("CPU: family %02x, model %02x, stepping %02x\n", c.x86, c.x86_model, c.x86_mask); + printk_debug("CPU: family %02x, model %02x, stepping %02x\n", c.x86, c.x86_model, c.x86_mask); + + /* Lookup the cpu's operations */ + set_cpu_ops(cpu); - - /* Lookup the cpu's operations */ + if(!cpu->ops) { + /* mask out the stepping and try again */ + cpu->device -= c.x86_mask; set_cpu_ops(cpu); + cpu->device += c.x86_mask; + if(!cpu->ops) die("Unknown cpu"); + printk_debug("WARNING: Using generic cpu ops\n"); + } + - /* Initialize the cpu */ - if (cpu->ops && cpu->ops->init) { - cpu->enabled = 1; - cpu->initialized = 1; - cpu->ops->init(cpu); - } + /* Initialize the cpu */ + if (cpu->ops && cpu->ops->init) { + cpu->enabled = 1; + cpu->initialized = 1; + cpu->ops->init(cpu); + } - printk_info("CPU #%d Initialized\n", info->index); -#if CONFIG_SMP || CONFIG_IOPIC + printk_info("CPU #%d Initialized\n", info->index); - } -#endif return; } |