summaryrefslogtreecommitdiff
path: root/src/arch/arm64
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/arm64')
-rw-r--r--src/arch/arm64/c_entry.c32
-rw-r--r--src/arch/arm64/include/armv8/arch/cpu.h13
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__ */