summaryrefslogtreecommitdiff
path: root/sys/src/9/imx8/main.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2022-05-08 20:26:56 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2022-05-08 20:26:56 +0000
commit7aa8c6d47ede0a8d419ba0c9695933f67f01ffda (patch)
tree007c1624127e3a32539fd9ad25bc93b4a4414ca8 /sys/src/9/imx8/main.c
parentcac30a565ebcd596c83f78c07da5d1a35f67f6b6 (diff)
imx8: implement psci calls for system reset and multicore startup
Diffstat (limited to 'sys/src/9/imx8/main.c')
-rw-r--r--sys/src/9/imx8/main.c36
1 files changed, 32 insertions, 4 deletions
diff --git a/sys/src/9/imx8/main.c b/sys/src/9/imx8/main.c
index 6f9406564..01e4ce20c 100644
--- a/sys/src/9/imx8/main.c
+++ b/sys/src/9/imx8/main.c
@@ -8,6 +8,7 @@
#include "pool.h"
#include "io.h"
#include "sysreg.h"
+#include "ureg.h"
Conf conf;
@@ -46,7 +47,7 @@ confinit(void)
char *p;
int i;
- conf.nmach = 1;
+ conf.nmach = MAXMACH;
if(p = getconf("service")){
if(strcmp(p, "cpu") == 0)
@@ -117,6 +118,29 @@ machinit(void)
}
void
+mpinit(void)
+{
+ extern void _start(void);
+ int i;
+
+ splhi();
+ for(i = 1; i < conf.nmach; i++){
+ Ureg u = {0};
+
+ MACHP(i)->machno = i;
+ cachedwbinvse(MACHP(i), MACHSIZE);
+
+ u.r0 = 0x84000003;
+ u.r1 = (sysrd(MPIDR_EL1) & ~0xFF) | i;
+ u.r2 = PADDR(_start);
+ u.r3 = i;
+ smccall(&u);
+ }
+ synccycles();
+ spllo();
+}
+
+void
main(void)
{
machinit();
@@ -125,7 +149,7 @@ main(void)
fpuinit();
intrinit();
clockinit();
- // cpuidprint();
+ print("cpu%d: UP!\n", m->machno);
synccycles();
timersinit();
flushtlb();
@@ -152,7 +176,7 @@ main(void)
links();
chandevreset();
userinit();
-// mpinit();
+ mpinit();
mmu0clear((uintptr*)L1);
flushtlb();
mmu1init();
@@ -162,9 +186,13 @@ main(void)
void
exit(int)
{
+ Ureg u = { .r0 = 0x84000009 };
+
cpushutdown();
splfhi();
- for(;;);
+
+ /* system reset */
+ smccall(&u);
}
int