[init][smp] have secondary init run in arch code up to threading, and complete in secondary thread

-move the per-cpu initialization of the gic and cortex-a9 timer into an init hook.
  This removes the hard coded call in arm/arch.c
-make sure the timer initialization happens in the pre-threading callback, in case
  a secondary init hook needs the timer.
This commit is contained in:
Travis Geiselbrecht
2015-03-27 14:08:32 -07:00
parent ccb073b98b
commit f0fad1590b
7 changed files with 24 additions and 15 deletions

View File

@@ -34,6 +34,7 @@
#include <platform.h>
#include <platform/interrupts.h>
#include <platform/timer.h>
#include <lk/init.h>
/* driver for cortex-a9's private timer */
#define LOCAL_TRACE 0
@@ -79,6 +80,8 @@ static struct fp_32_64 timer_freq_msec_conversion;
static struct fp_32_64 timer_freq_usec_conversion_inverse;
static struct fp_32_64 timer_freq_msec_conversion_inverse;
static void arm_cortex_a9_timer_init_percpu(uint level);
uint64_t get_global_val(void)
{
uint32_t lo, hi;
@@ -189,7 +192,7 @@ void arm_cortex_a9_timer_init(addr_t _scu_control_base, uint32_t freq)
{
scu_control_base = _scu_control_base;
arm_cortex_a9_timer_init_percpu();
arm_cortex_a9_timer_init_percpu(0);
/* save the timer frequency for later calculations */
timer_freq = freq;
@@ -200,7 +203,7 @@ void arm_cortex_a9_timer_init(addr_t _scu_control_base, uint32_t freq)
fp_32_64_div_32_32(&timer_freq_msec_conversion_inverse, 1000, timer_freq);
}
void arm_cortex_a9_timer_init_percpu(void)
static void arm_cortex_a9_timer_init_percpu(uint level)
{
/* disable timer */
TIMREG(TIMER_CONTROL) = 0;
@@ -216,4 +219,9 @@ void arm_cortex_a9_timer_init_percpu(void)
unmask_interrupt(CPU_PRIV_TIMER_INT);
}
/* secondary cpu initialize the timer just before the kernel starts with interrupts enabled */
LK_INIT_HOOK_FLAGS(arm_cortex_a9_timer_init_percpu,
arm_cortex_a9_timer_init_percpu,
LK_INIT_LEVEL_THREADING - 1, LK_INIT_FLAG_SECONDARY_CPUS);
/* vim: set ts=4 sw=4 expandtab: */

View File

@@ -25,4 +25,3 @@
#include <sys/types.h>
void arm_cortex_a9_timer_init(addr_t scu_control_base, uint32_t freq);
void arm_cortex_a9_timer_init_percpu(void);

View File

@@ -362,9 +362,10 @@ static void arm_generic_timer_init_secondary_cpu(uint level)
unmask_interrupt(timer_irq);
}
/* secondary cpu initialize the timer just before the kernel starts with interrupts enabled */
LK_INIT_HOOK_FLAGS(arm_generic_timer_init_secondary_cpu,
arm_generic_timer_init_secondary_cpu,
LK_INIT_LEVEL_PLATFORM, LK_INIT_FLAG_SECONDARY_CPUS);
LK_INIT_LEVEL_THREADING - 1, LK_INIT_FLAG_SECONDARY_CPUS);
static void arm_generic_timer_resume_cpu(uint level)
{