entry.S revision 1.2.4.2 1 1.2.4.2 bouyer /* $NetBSD: entry.S,v 1.2.4.2 2011/03/06 15:07:55 bouyer Exp $ */
2 1.2.4.2 bouyer
3 1.2.4.2 bouyer #include <powerpc/psl.h>
4 1.2.4.2 bouyer #include <powerpc/spr.h>
5 1.2.4.2 bouyer #include <powerpc/oea/spr.h>
6 1.2.4.2 bouyer #include <powerpc/oea/bat.h>
7 1.2.4.2 bouyer #include <powerpc/oea/hid.h>
8 1.2.4.2 bouyer
9 1.2.4.2 bouyer .text
10 1.2.4.2 bouyer .globl _start
11 1.2.4.2 bouyer _start:
12 1.2.4.2 bouyer /*
13 1.2.4.2 bouyer * Save possible argc and argv values from the firmware, usually
14 1.2.4.2 bouyer * passed in r3 and r4.
15 1.2.4.2 bouyer * When started with "bootm", as a Linux kernel module, r6 and r7
16 1.2.4.2 bouyer * point to the start and end address of the bootargs.
17 1.2.4.2 bouyer */
18 1.2.4.2 bouyer mr 30,3
19 1.2.4.2 bouyer mr 31,4
20 1.2.4.2 bouyer mr 28,6
21 1.2.4.2 bouyer mr 29,7
22 1.2.4.2 bouyer
23 1.2.4.2 bouyer /*
24 1.2.4.2 bouyer * U-Boot/PPCBoot forgets to flush the cache when using the "bootm"
25 1.2.4.2 bouyer * command, so we have to do that now.
26 1.2.4.2 bouyer */
27 1.2.4.2 bouyer lis 3,_start@ha
28 1.2.4.2 bouyer addi 3,3,_start@l
29 1.2.4.2 bouyer andi. 3,3,~31@l
30 1.2.4.2 bouyer lis 4,(_edata+31)@ha
31 1.2.4.2 bouyer addi 4,4,(_edata+31)@l
32 1.2.4.2 bouyer mr 5,3
33 1.2.4.2 bouyer 10:
34 1.2.4.2 bouyer dcbst 0,5
35 1.2.4.2 bouyer addi 5,5,32
36 1.2.4.2 bouyer cmplw 5,4
37 1.2.4.2 bouyer ble 10b
38 1.2.4.2 bouyer sync
39 1.2.4.2 bouyer 11:
40 1.2.4.2 bouyer icbi 0,3
41 1.2.4.2 bouyer addi 3,3,32
42 1.2.4.2 bouyer cmplw 3,4
43 1.2.4.2 bouyer ble 11b
44 1.2.4.2 bouyer sync
45 1.2.4.2 bouyer isync
46 1.2.4.2 bouyer
47 1.2.4.2 bouyer mfspr 11,SPR_HID0
48 1.2.4.2 bouyer andi. 0,11,HID0_DCE
49 1.2.4.2 bouyer ori 11,11,HID0_ICE
50 1.2.4.2 bouyer ori 8,11,HID0_ICFI
51 1.2.4.2 bouyer bne 1f /* don't invalidate the D-cache */
52 1.2.4.2 bouyer ori 8,8,HID0_DCFI /* unless it wasn't enabled */
53 1.2.4.2 bouyer 1:
54 1.2.4.2 bouyer mfmsr 0
55 1.2.4.2 bouyer andi. 0,0,PSL_DR
56 1.2.4.2 bouyer beq 2f
57 1.2.4.2 bouyer lis 5, 0xfec00000@ha /* CONFIG_ADDR of PCI */
58 1.2.4.2 bouyer lis 6, 0xfee00000@ha /* CONFIG_DATA of PCI */
59 1.2.4.2 bouyer mfspr 3,SPR_DBAT0U
60 1.2.4.2 bouyer mfspr 4,SPR_DBAT0L
61 1.2.4.2 bouyer bl dbat_sanity_check
62 1.2.4.2 bouyer beq 3f
63 1.2.4.2 bouyer mfspr 3,SPR_DBAT1U
64 1.2.4.2 bouyer mfspr 4,SPR_DBAT1L
65 1.2.4.2 bouyer bl dbat_sanity_check
66 1.2.4.2 bouyer beq 3f
67 1.2.4.2 bouyer mfspr 3,SPR_DBAT2U
68 1.2.4.2 bouyer mfspr 4,SPR_DBAT2L
69 1.2.4.2 bouyer bl dbat_sanity_check
70 1.2.4.2 bouyer beq 3f
71 1.2.4.2 bouyer mfspr 3,SPR_DBAT3U
72 1.2.4.2 bouyer mfspr 4,SPR_DBAT3L
73 1.2.4.2 bouyer bl dbat_sanity_check
74 1.2.4.2 bouyer beq 3f
75 1.2.4.2 bouyer
76 1.2.4.2 bouyer 2: /* Disable D-cache */
77 1.2.4.2 bouyer li 0,HID0_DCE
78 1.2.4.2 bouyer andc 11,11,0
79 1.2.4.2 bouyer b 4f
80 1.2.4.2 bouyer
81 1.2.4.2 bouyer 3: /* Enable D-cache */
82 1.2.4.2 bouyer ori 11,11,HID0_DCE
83 1.2.4.2 bouyer
84 1.2.4.2 bouyer 4:
85 1.2.4.2 bouyer lis 1,BAT123@ha
86 1.2.4.2 bouyer addi 1,1,BAT123@l
87 1.2.4.2 bouyer lwz 3,0(1)
88 1.2.4.2 bouyer lwz 4,4(1)
89 1.2.4.2 bouyer mtdbatl 1,3
90 1.2.4.2 bouyer mtdbatu 1,4
91 1.2.4.2 bouyer lwz 3,8(1)
92 1.2.4.2 bouyer lwz 4,12(1)
93 1.2.4.2 bouyer mtdbatl 2,3
94 1.2.4.2 bouyer mtdbatu 2,4
95 1.2.4.2 bouyer lwz 3,16(1)
96 1.2.4.2 bouyer lwz 4,20(1)
97 1.2.4.2 bouyer mtdbatl 3,3
98 1.2.4.2 bouyer mtdbatu 3,4
99 1.2.4.2 bouyer
100 1.2.4.2 bouyer sync
101 1.2.4.2 bouyer mtspr SPR_HID0,8 /* enable and invalidate caches */
102 1.2.4.2 bouyer sync
103 1.2.4.2 bouyer mtspr SPR_HID0,11 /* enable caches */
104 1.2.4.2 bouyer sync
105 1.2.4.2 bouyer isync
106 1.2.4.2 bouyer
107 1.2.4.2 bouyer /* make sure .bss gets zeroed. */
108 1.2.4.2 bouyer li 0,0
109 1.2.4.2 bouyer lis 8,edata@ha
110 1.2.4.2 bouyer addi 8,8,edata@l
111 1.2.4.2 bouyer lis 9,end@ha
112 1.2.4.2 bouyer addi 9,9,end@l
113 1.2.4.2 bouyer 5: cmpw 0,8,9 /* edata & end are >= word aligned */
114 1.2.4.2 bouyer bge 6f
115 1.2.4.2 bouyer stw 0,0(8)
116 1.2.4.2 bouyer addi 8,8,4
117 1.2.4.2 bouyer b 5b
118 1.2.4.2 bouyer
119 1.2.4.2 bouyer 6:
120 1.2.4.2 bouyer /* prepare stack at +1MB from _start. */
121 1.2.4.2 bouyer lis 1,_start@h
122 1.2.4.2 bouyer ori 1,1,_start@l
123 1.2.4.2 bouyer addis 1,1,0x10
124 1.2.4.2 bouyer addi 1,1,-4
125 1.2.4.2 bouyer
126 1.2.4.2 bouyer bl brdsetup
127 1.2.4.2 bouyer mr 3,30
128 1.2.4.2 bouyer mr 4,31
129 1.2.4.2 bouyer mr 5,28
130 1.2.4.2 bouyer mr 6,29
131 1.2.4.2 bouyer bl main
132 1.2.4.2 bouyer
133 1.2.4.2 bouyer hang: b hang
134 1.2.4.2 bouyer /* NOTREACHED */
135 1.2.4.2 bouyer
136 1.2.4.2 bouyer dbat_sanity_check:
137 1.2.4.2 bouyer andi. 0,3,BAT_Vs
138 1.2.4.2 bouyer beq 2f
139 1.2.4.2 bouyer andi. 0,4,BAT_I|BAT_PP_RW
140 1.2.4.2 bouyer cmpwi 0,0,BAT_I|BAT_PP_RW
141 1.2.4.2 bouyer bnelr
142 1.2.4.2 bouyer rlwinm 0,3,15,4,14
143 1.2.4.2 bouyer andis. 3,3,0xfffe0000@ha /* BAT_EPI */
144 1.2.4.2 bouyer andis. 4,4,BAT_RPN@ha
145 1.2.4.2 bouyer cmplw 0,3,4
146 1.2.4.2 bouyer bnelr
147 1.2.4.2 bouyer add 4,4,0
148 1.2.4.2 bouyer oris 4,4,0x0001ffff@ha
149 1.2.4.2 bouyer ori 4,4,0x0001ffff@l
150 1.2.4.2 bouyer cmplw 0,3,5
151 1.2.4.2 bouyer bgt 1f
152 1.2.4.2 bouyer cmplw 0,5,4
153 1.2.4.2 bouyer bgt 1f
154 1.2.4.2 bouyer li 5,0
155 1.2.4.2 bouyer 1: cmplw 0,3,6
156 1.2.4.2 bouyer bgt 2f
157 1.2.4.2 bouyer cmplw 0,6,4
158 1.2.4.2 bouyer bgt 2f
159 1.2.4.2 bouyer li 6,0
160 1.2.4.2 bouyer 2: cmplw 0,5,6
161 1.2.4.2 bouyer blr
162 1.2.4.2 bouyer
163 1.2.4.2 bouyer /*
164 1.2.4.2 bouyer * run(startsym, endsym, howto, bootinfo, entry)
165 1.2.4.2 bouyer */
166 1.2.4.2 bouyer .globl run
167 1.2.4.2 bouyer run:
168 1.2.4.2 bouyer mtctr 7 /* hat trick jump to entry point */
169 1.2.4.2 bouyer bctr
170 1.2.4.2 bouyer
171 1.2.4.2 bouyer /*
172 1.2.4.2 bouyer * reverse endian access to mimic outw/outl/inw/inl
173 1.2.4.2 bouyer */
174 1.2.4.2 bouyer .globl out16rb
175 1.2.4.2 bouyer .globl iohtole16
176 1.2.4.2 bouyer out16rb:
177 1.2.4.2 bouyer iohtole16:
178 1.2.4.2 bouyer sthbrx 4,0,3
179 1.2.4.2 bouyer eieio
180 1.2.4.2 bouyer blr
181 1.2.4.2 bouyer
182 1.2.4.2 bouyer .globl out32rb
183 1.2.4.2 bouyer .globl iohtole32
184 1.2.4.2 bouyer out32rb:
185 1.2.4.2 bouyer iohtole32:
186 1.2.4.2 bouyer stwbrx 4,0,3
187 1.2.4.2 bouyer eieio
188 1.2.4.2 bouyer blr
189 1.2.4.2 bouyer
190 1.2.4.2 bouyer .global in16rb
191 1.2.4.2 bouyer .global iole16toh
192 1.2.4.2 bouyer in16rb:
193 1.2.4.2 bouyer iole16toh:
194 1.2.4.2 bouyer lhbrx 3,0,3
195 1.2.4.2 bouyer eieio
196 1.2.4.2 bouyer blr
197 1.2.4.2 bouyer
198 1.2.4.2 bouyer .global in32rb
199 1.2.4.2 bouyer .global iole32toh
200 1.2.4.2 bouyer in32rb:
201 1.2.4.2 bouyer iole32toh:
202 1.2.4.2 bouyer lwbrx 3,0,3
203 1.2.4.2 bouyer eieio
204 1.2.4.2 bouyer blr
205 1.2.4.2 bouyer
206 1.2.4.2 bouyer .data
207 1.2.4.2 bouyer #define xBATL(pa, wimg, pp) \
208 1.2.4.2 bouyer ((pa) | (wimg) | (pp))
209 1.2.4.2 bouyer #define xBATU(va, len, v) \
210 1.2.4.2 bouyer ((va) | ((len) & BAT_BL) | ((v) & BAT_V))
211 1.2.4.2 bouyer BAT123:
212 1.2.4.2 bouyer .long xBATL(0x80000000, BAT_I|BAT_G, BAT_PP_RW)
213 1.2.4.2 bouyer .long xBATU(0x80000000, BAT_BL_256M, BAT_Vs)
214 1.2.4.2 bouyer .long xBATL(0xfc000000, BAT_I|BAT_G, BAT_PP_RW)
215 1.2.4.2 bouyer .long xBATU(0xfc000000, BAT_BL_64M, BAT_Vs)
216 1.2.4.2 bouyer .long 0
217 1.2.4.2 bouyer .long 0
218