[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:
@@ -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: */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user