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