summaryrefslogtreecommitdiffstats
path: root/arch/x86/cpu/cpu.c
diff options
context:
space:
mode:
authorBin Meng <bmeng.cn@gmail.com>2015-06-17 11:15:36 +0800
committerSimon Glass <sjg@chromium.org>2015-07-14 18:03:16 -0600
commit6e6f4ce4f82501e35301322872152fe28846d743 (patch)
treefdd640b83dca49b9468abed45a648284b44ecf96 /arch/x86/cpu/cpu.c
parent946c2b5259823ca6935a62e1a68b6e29a74e33f0 (diff)
downloadtalos-obmc-uboot-6e6f4ce4f82501e35301322872152fe28846d743.tar.gz
talos-obmc-uboot-6e6f4ce4f82501e35301322872152fe28846d743.zip
x86: Move MP initialization codes into a common place
Most of the MP initialization codes in arch/x86/cpu/baytrail/cpu.c is common to all x86 processors, except detect_num_cpus() which varies from cpu to cpu. Move these to arch/x86/cpu/cpu.c and implement the new 'get_count' method for baytrail and cpu_x86 drivers. Now we call cpu_get_count() in mp_init() to get the number of CPUs. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Acked-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'arch/x86/cpu/cpu.c')
-rw-r--r--arch/x86/cpu/cpu.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 1dfd9e6d27..a6e88cfe19 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -21,10 +21,13 @@
#include <common.h>
#include <command.h>
+#include <dm.h>
#include <errno.h>
#include <malloc.h>
#include <asm/control_regs.h>
#include <asm/cpu.h>
+#include <asm/lapic.h>
+#include <asm/mp.h>
#include <asm/post.h>
#include <asm/processor.h>
#include <asm/processor-flags.h>
@@ -621,8 +624,45 @@ int last_stage_init(void)
}
#endif
+#ifdef CONFIG_SMP
+static int enable_smis(struct udevice *cpu, void *unused)
+{
+ return 0;
+}
+
+static struct mp_flight_record mp_steps[] = {
+ MP_FR_BLOCK_APS(mp_init_cpu, NULL, mp_init_cpu, NULL),
+ /* Wait for APs to finish initialization before proceeding */
+ MP_FR_BLOCK_APS(NULL, NULL, enable_smis, NULL),
+};
+
+static int x86_mp_init(void)
+{
+ struct mp_params mp_params;
+
+ lapic_setup();
+
+ mp_params.parallel_microcode_load = 0,
+ mp_params.flight_plan = &mp_steps[0];
+ mp_params.num_records = ARRAY_SIZE(mp_steps);
+ mp_params.microcode_pointer = 0;
+
+ if (mp_init(&mp_params)) {
+ printf("Warning: MP init failure\n");
+ return -EIO;
+ }
+
+ return 0;
+}
+#endif
+
__weak int x86_init_cpus(void)
{
+#ifdef CONFIG_SMP
+ debug("Init additional CPUs\n");
+ x86_mp_init();
+#endif
+
return 0;
}
OpenPOWER on IntegriCloud