]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/bcm/rebootcode.s
merge
[plan9front.git] / sys / src / 9 / bcm / rebootcode.s
1 /*
2  * armv6/armv7 reboot code
3  */
4 #include "arm.s"
5
6 #define WFI     WORD    $0xe320f003     /* wait for interrupt */
7 #define WFE     WORD    $0xe320f002     /* wait for event */
8
9 TEXT    main(SB), 1, $-4
10         MOVW    $setR12(SB), R12
11
12         MOVW    R0, entry+0(FP)
13         CMP     $0, R0
14         BEQ     shutdown
15
16         MOVW    entry+0(FP), R8
17         MOVW    code+4(FP), R9
18         MOVW    size+8(FP), R6  
19
20         /* round to words */
21         BIC     $3, R8
22         BIC     $3, R9
23         ADD     $3, R6
24         BIC     $3, R6
25
26 memloop:
27         MOVM.IA.W       (R9), [R1]
28         MOVM.IA.W       [R1], (R8)
29         SUB.S   $4, R6
30         BNE     memloop
31
32 shutdown:
33         /* clean dcache using appropriate code for armv6 or armv7 */
34         MRC     CpSC, 0, R1, C(CpID), C(CpIDfeat), 7    /* Memory Model Feature Register 3 */
35         TST     $0xF, R1        /* hierarchical cache maintenance? */
36         BNE     l2wb
37         DSB
38         MOVW    $0, R0
39         MCR     CpSC, 0, R0, C(CpCACHE), C(CpCACHEwb), CpCACHEall
40         B       l2wbx
41 l2wb:
42         BL      cachedwb(SB)
43         BL      l2cacheuwb(SB)
44 l2wbx:
45         /* load entry before turning off mmu */
46         MOVW    entry+0(FP), R8
47
48         /* disable caches */
49         MRC     CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl
50         BIC     $(CpCdcache|CpCicache|CpCpredict), R1
51         MCR     CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl
52         BARRIERS
53
54         /* invalidate icache */
55         MOVW    $0, R0
56         MCR     CpSC, 0, R0, C(CpCACHE), C(CpCACHEinvi), CpCACHEall
57         BARRIERS
58
59         /* turn off mmu */
60         MRC     CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl
61         BIC     $CpCmmu, R1
62         MCR     CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl
63         BARRIERS
64
65         /* turn SMP off */
66         MRC     CpSC, 0, R1, C(CpCONTROL), C(0), CpAuxctl
67         BIC     $CpACsmp, R1
68         MCR     CpSC, 0, R1, C(CpCONTROL), C(0), CpAuxctl
69         ISB
70         DSB
71
72         /* have entry? */
73         CMP     $0, R8
74         BNE     bootcpu
75
76         /* other cpus wait for inter processor interrupt */
77         CPUID(R2)
78 dowfi:
79         WFE                     /* wait for event signal */
80         MOVW    $0x400000CC, R1 /* inter-core .startcpu mailboxes */
81         ADD     R2<<4, R1       /* mailbox for this core */
82         MOVW    0(R1), R8       /* content of mailbox */
83         CMP     $0, R8          
84         BEQ     dowfi           /* if zero, wait again */
85
86 bootcpu:
87         BIC     $KSEGM, R8      /* entry to physical */
88         ORR     $PHYSDRAM, R8
89         BL      (R8)
90         B       dowfi
91
92 #define ICACHELINESZ    32
93 #include "cache.v7.s"