summaryrefslogtreecommitdiff
path: root/src/arch/i386
diff options
context:
space:
mode:
authorYinghai Lu <yinghai.lu at amd.com>2007-04-06 19:57:42 +0000
committerStefan Reinauer <stepan@openbios.org>2007-04-06 19:57:42 +0000
commit30b4abeedc98db5a607f434af67e2fe2626ef111 (patch)
tree6fde1264fce271e31c48046610106000bd4987cb /src/arch/i386
parenta3cf00e4bab084a231cbd7cafab3c02342c400e0 (diff)
downloadcoreboot-30b4abeedc98db5a607f434af67e2fe2626ef111.tar.xz
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')
-rw-r--r--src/arch/i386/lib/c_start.S4
-rw-r--r--src/arch/i386/lib/console.c8
-rw-r--r--src/arch/i386/lib/cpu.c55
3 files changed, 33 insertions, 34 deletions
diff --git a/src/arch/i386/lib/c_start.S b/src/arch/i386/lib/c_start.S
index 04b5a68676..272209aca9 100644
--- a/src/arch/i386/lib/c_start.S
+++ b/src/arch/i386/lib/c_start.S
@@ -263,9 +263,9 @@ gdt:
.word 0x0000, 0x0000 /* dummy */
.byte 0x00, 0x00, 0x00, 0x00
- /* selgdt 0x10, flat code segment */
+ /* selgdt 0x10, flat code segment */
.word 0xffff, 0x0000
- .byte 0x00, 0x9b, 0xcf, 0x00
+ .byte 0x00, 0x9b, 0xcf, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for limit */
/* selgdt 0x18, flat data segment */
.word 0xffff, 0x0000
diff --git a/src/arch/i386/lib/console.c b/src/arch/i386/lib/console.c
index 071fb2848c..993edb2a35 100644
--- a/src/arch/i386/lib/console.c
+++ b/src/arch/i386/lib/console.c
@@ -9,11 +9,15 @@ static void __console_tx_byte(unsigned char byte)
#include "console_print.c"
#else
-/* CONFIG_USE_INIT == 1 */
+/* CONFIG_USE_PRINTK_IN_CAR == 1 */
#include "console_printk.c"
-#endif /* CONFIG_USE_INIT */
+// do_printk
+#include "../../../console/vtxprintf.c"
+#include "printk_init.c"
+
+#endif /* CONFIG_USE_PRINTK_IN_CAR */
#ifndef LINUXBIOS_EXTRA_VERSION
#define LINUXBIOS_EXTRA_VERSION ""
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;
}