diff options
Diffstat (limited to 'arch/arm/machine/cpu.c')
-rw-r--r-- | arch/arm/machine/cpu.c | 43 |
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) |