summaryrefslogtreecommitdiff
path: root/arch/arm/machine/cpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/machine/cpu.c')
-rw-r--r--arch/arm/machine/cpu.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/arch/arm/machine/cpu.c b/arch/arm/machine/cpu.c
index a79200fe..1e7dcb3b 100644
--- a/arch/arm/machine/cpu.c
+++ b/arch/arm/machine/cpu.c
@@ -16,8 +16,14 @@
*/
#include <kern/init.h>
+#include <kern/percpu.h>
#include <machine/cpu.h>
+/*
+ * Processor descriptor, one per CPU.
+ */
+struct cpu cpu_desc __percpu;
+
void cpu_halt_broadcast(void)
{
}
@@ -31,13 +37,48 @@ void cpu_mp_setup(void)
{
}
+static void __init
+cpu_init(struct cpu *cpu, unsigned int id)
+{
+ cpu->id = id;
+}
+
+static void __init
+cpu_set_percpu_area(void *area)
+{
+#ifdef CONFIG_SMP
+ cpu_set_tpidrprw((uintptr_t)area);
+#else /* CONFIG_SMP */
+ /* TODO Single-processor support */
+ cpu_halt();
+#endif /* CONFIG_SMP */
+}
+
+/*
+ * Initialize the given cpu structure for the current processor.
+ */
+static void __init
+cpu_init_local(struct cpu *cpu)
+{
+ cpu_set_percpu_area(percpu_area(cpu->id));
+}
+
static int __init
cpu_setup(void)
{
+ struct cpu *cpu;
+
+ cpu = percpu_ptr(cpu_desc, 0);
+ cpu_init(cpu, 0);
+ cpu_init_local(cpu);
+
+ /* TODO Provide cpu_delay() */
+
return 0;
}
-INIT_OP_DEFINE(cpu_setup);
+INIT_OP_DEFINE(cpu_setup,
+ INIT_OP_DEP(percpu_bootstrap, true));
static int __init
cpu_mp_probe(void)