diff options
-rw-r--r-- | src/arch/arm64/c_entry.c | 32 | ||||
-rw-r--r-- | src/arch/arm64/include/armv8/arch/cpu.h | 13 |
2 files changed, 43 insertions, 2 deletions
diff --git a/src/arch/arm64/c_entry.c b/src/arch/arm64/c_entry.c index 3e9d44e4af..869518785b 100644 --- a/src/arch/arm64/c_entry.c +++ b/src/arch/arm64/c_entry.c @@ -17,9 +17,11 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include <arch/stages.h> +#include <arch/cache.h> #include <arch/cpu.h> - +#include <arch/exception.h> +#include <arch/mmu.h> +#include <arch/stages.h> /* * This variable holds entry point for CPUs starting up. Before the other @@ -33,6 +35,11 @@ void __attribute__((weak)) arm64_soc_init(void) /* Default weak implementation does nothing. */ } +void __attribute__((weak)) soc_secondary_cpu_init(void) +{ + /* Default weak implementation does nothing. */ +} + static void seed_stack(void) { char *stack_begin; @@ -57,3 +64,24 @@ void arm64_init(void) arm64_soc_init(); main(); } + +static void secondary_cpu_start(void) +{ + mmu_enable(); + exception_hwinit(); + soc_secondary_cpu_init(); + /* + * TODO(adurbin): need a proper place to park the CPUs. Currently + * assuming SoC code does the appropriate thing. + */ + while (1); +} + +extern void arm64_cpu_startup(void); +void *prepare_secondary_cpu_startup(void) +{ + c_entry = &secondary_cpu_start; + dcache_clean_invalidate_by_mva(c_entry, sizeof(c_entry)); + + return &arm64_cpu_startup; +} diff --git a/src/arch/arm64/include/armv8/arch/cpu.h b/src/arch/arm64/include/armv8/arch/cpu.h index e80e739133..5ce9ba3ab5 100644 --- a/src/arch/arm64/include/armv8/arch/cpu.h +++ b/src/arch/arm64/include/armv8/arch/cpu.h @@ -58,4 +58,17 @@ void *cpu_get_stack(unsigned int cpu); /* Return the top of the exception stack for the specified cpu. */ void *cpu_get_exception_stack(unsigned int cpu); +/* + * Do the necessary work to prepare for secondary CPUs coming up. The + * SoC will call this function before bringing up the other CPUs. The + * entry point for the seoncdary CPUs is returned. + */ +void *prepare_secondary_cpu_startup(void); + +/* + * Function provided by the SoC code that is called for each secondary + * CPU startup. + */ +void soc_secondary_cpu_init(void); + #endif /* __ARCH_CPU_H__ */ |