Merge tag 'iio-for-4.13a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23...
[sfrench/cifs-2.6.git] / arch / s390 / kernel / head.S
1 /*
2  * Copyright IBM Corp. 1999, 2010
3  *
4  *    Author(s): Hartmut Penner <hp@de.ibm.com>
5  *               Martin Schwidefsky <schwidefsky@de.ibm.com>
6  *               Rob van der Heij <rvdhei@iae.nl>
7  *               Heiko Carstens <heiko.carstens@de.ibm.com>
8  *
9  * There are 5 different IPL methods
10  *  1) load the image directly into ram at address 0 and do an PSW restart
11  *  2) linload will load the image from address 0x10000 to memory 0x10000
12  *     and start the code thru LPSW 0x0008000080010000 (VM only, deprecated)
13  *  3) generate the tape ipl header, store the generated image on a tape
14  *     and ipl from it
15  *     In case of SL tape you need to IPL 5 times to get past VOL1 etc
16  *  4) generate the vm reader ipl header, move the generated image to the
17  *     VM reader (use option NOH!) and do a ipl from reader (VM only)
18  *  5) direct call of start by the SALIPL loader
19  *  We use the cpuid to distinguish between VM and native ipl
20  *  params for kernel are pushed to 0x10400 (see setup.h)
21  *
22  */
23
24 #include <linux/init.h>
25 #include <linux/linkage.h>
26 #include <asm/asm-offsets.h>
27 #include <asm/thread_info.h>
28 #include <asm/page.h>
29 #include <asm/ptrace.h>
30
31 #define ARCH_OFFSET     4
32
33 __HEAD
34
35 #define IPL_BS  0x730
36         .org    0
37         .long   0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded
38         .long   0x02000018,0x60000050           # by ipl to addresses 0-23.
39         .long   0x02000068,0x60000050           # (a PSW and two CCWs).
40         .fill   80-24,1,0x40                    # bytes 24-79 are discarded !!
41         .long   0x020000f0,0x60000050           # The next 160 byte are loaded
42         .long   0x02000140,0x60000050           # to addresses 0x18-0xb7
43         .long   0x02000190,0x60000050           # They form the continuation
44         .long   0x020001e0,0x60000050           # of the CCW program started
45         .long   0x02000230,0x60000050           # by ipl and load the range
46         .long   0x02000280,0x60000050           # 0x0f0-0x730 from the image
47         .long   0x020002d0,0x60000050           # to the range 0x0f0-0x730
48         .long   0x02000320,0x60000050           # in memory. At the end of
49         .long   0x02000370,0x60000050           # the channel program the PSW
50         .long   0x020003c0,0x60000050           # at location 0 is loaded.
51         .long   0x02000410,0x60000050           # Initial processing starts
52         .long   0x02000460,0x60000050           # at 0x200 = iplstart.
53         .long   0x020004b0,0x60000050
54         .long   0x02000500,0x60000050
55         .long   0x02000550,0x60000050
56         .long   0x020005a0,0x60000050
57         .long   0x020005f0,0x60000050
58         .long   0x02000640,0x60000050
59         .long   0x02000690,0x60000050
60         .long   0x020006e0,0x20000050
61
62         .org    0x200
63
64 #
65 # subroutine to wait for end I/O
66 #
67 .Lirqwait:
68         mvc     0x1f0(16),.Lnewpsw      # set up IO interrupt psw
69         lpsw    .Lwaitpsw
70 .Lioint:
71         br      %r14
72         .align  8
73 .Lnewpsw:
74         .quad   0x0000000080000000,.Lioint
75 .Lwaitpsw:
76         .long   0x020a0000,0x80000000+.Lioint
77
78 #
79 # subroutine for loading cards from the reader
80 #
81 .Lloader:
82         la      %r4,0(%r14)
83         la      %r3,.Lorb               # r2 = address of orb into r2
84         la      %r5,.Lirb               # r4 = address of irb
85         la      %r6,.Lccws
86         la      %r7,20
87 .Linit:
88         st      %r2,4(%r6)              # initialize CCW data addresses
89         la      %r2,0x50(%r2)
90         la      %r6,8(%r6)
91         bct     7,.Linit
92
93         lctl    %c6,%c6,.Lcr6           # set IO subclass mask
94         slr     %r2,%r2
95 .Lldlp:
96         ssch    0(%r3)                  # load chunk of 1600 bytes
97         bnz     .Llderr
98 .Lwait4irq:
99         bas     %r14,.Lirqwait
100         c       %r1,0xb8                # compare subchannel number
101         bne     .Lwait4irq
102         tsch    0(%r5)
103
104         slr     %r0,%r0
105         ic      %r0,8(%r5)              # get device status
106         chi     %r0,8                   # channel end ?
107         be      .Lcont
108         chi     %r0,12                  # channel end + device end ?
109         be      .Lcont
110
111         l       %r0,4(%r5)
112         s       %r0,8(%r3)              # r0/8 = number of ccws executed
113         mhi     %r0,10                  # *10 = number of bytes in ccws
114         lh      %r3,10(%r5)             # get residual count
115         sr      %r0,%r3                 # #ccws*80-residual=#bytes read
116         ar      %r2,%r0
117
118         br      %r4                     # r2 contains the total size
119
120 .Lcont:
121         ahi     %r2,0x640               # add 0x640 to total size
122         la      %r6,.Lccws
123         la      %r7,20
124 .Lincr:
125         l       %r0,4(%r6)              # update CCW data addresses
126         ahi     %r0,0x640
127         st      %r0,4(%r6)
128         ahi     %r6,8
129         bct     7,.Lincr
130
131         b       .Lldlp
132 .Llderr:
133         lpsw    .Lcrash
134
135         .align  8
136 .Lorb:  .long   0x00000000,0x0080ff00,.Lccws
137 .Lirb:  .long   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
138 .Lcr6:  .long   0xff000000
139 .Lloadp:.long   0,0
140         .align  8
141 .Lcrash:.long   0x000a0000,0x00000000
142
143         .align  8
144 .Lccws: .rept   19
145         .long   0x02600050,0x00000000
146         .endr
147         .long   0x02200050,0x00000000
148
149 iplstart:
150         mvi     __LC_AR_MODE_ID,1       # set esame flag
151         slr     %r0,%r0                 # set cpuid to zero
152         lhi     %r1,2                   # mode 2 = esame (dump)
153         sigp    %r1,%r0,0x12            # switch to esame mode
154         bras    %r13,0f
155         .fill   16,4,0x0
156 0:      lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
157         sam31                           # switch to 31 bit addressing mode
158         lh      %r1,0xb8                # test if subchannel number
159         bct     %r1,.Lnoload            #  is valid
160         l       %r1,0xb8                # load ipl subchannel number
161         la      %r2,IPL_BS              # load start address
162         bas     %r14,.Lloader           # load rest of ipl image
163         l       %r12,.Lparm             # pointer to parameter area
164         st      %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
165
166 #
167 # load parameter file from ipl device
168 #
169 .Lagain1:
170         l       %r2,.Linitrd            # ramdisk loc. is temp
171         bas     %r14,.Lloader           # load parameter file
172         ltr     %r2,%r2                 # got anything ?
173         bz      .Lnopf
174         chi     %r2,895
175         bnh     .Lnotrunc
176         la      %r2,895
177 .Lnotrunc:
178         l       %r4,.Linitrd
179         clc     0(3,%r4),.L_hdr         # if it is HDRx
180         bz      .Lagain1                # skip dataset header
181         clc     0(3,%r4),.L_eof         # if it is EOFx
182         bz      .Lagain1                # skip dateset trailer
183         la      %r5,0(%r4,%r2)
184         lr      %r3,%r2
185         la      %r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line
186         mvc     0(256,%r3),0(%r4)
187         mvc     256(256,%r3),256(%r4)
188         mvc     512(256,%r3),512(%r4)
189         mvc     768(122,%r3),768(%r4)
190         slr     %r0,%r0
191         b       .Lcntlp
192 .Ldelspc:
193         ic      %r0,0(%r2,%r3)
194         chi     %r0,0x20                # is it a space ?
195         be      .Lcntlp
196         ahi     %r2,1
197         b       .Leolp
198 .Lcntlp:
199         brct    %r2,.Ldelspc
200 .Leolp:
201         slr     %r0,%r0
202         stc     %r0,0(%r2,%r3)          # terminate buffer
203 .Lnopf:
204
205 #
206 # load ramdisk from ipl device
207 #
208 .Lagain2:
209         l       %r2,.Linitrd            # addr of ramdisk
210         st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
211         bas     %r14,.Lloader           # load ramdisk
212         st      %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
213         ltr     %r2,%r2
214         bnz     .Lrdcont
215         st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
216 .Lrdcont:
217         l       %r2,.Linitrd
218
219         clc     0(3,%r2),.L_hdr         # skip HDRx and EOFx
220         bz      .Lagain2
221         clc     0(3,%r2),.L_eof
222         bz      .Lagain2
223
224 #
225 # reset files in VM reader
226 #
227         stidp   .Lcpuid                 # store cpuid
228         tm      .Lcpuid,0xff            # running VM ?
229         bno     .Lnoreset
230         la      %r2,.Lreset
231         lhi     %r3,26
232         diag    %r2,%r3,8
233         la      %r5,.Lirb
234         stsch   0(%r5)                  # check if irq is pending
235         tm      30(%r5),0x0f            # by verifying if any of the
236         bnz     .Lwaitforirq            # activity or status control
237         tm      31(%r5),0xff            # bits is set in the schib
238         bz      .Lnoreset
239 .Lwaitforirq:
240         bas     %r14,.Lirqwait          # wait for IO interrupt
241         c       %r1,0xb8                # compare subchannel number
242         bne     .Lwaitforirq
243         la      %r5,.Lirb
244         tsch    0(%r5)
245 .Lnoreset:
246         b       .Lnoload
247
248 #
249 # everything loaded, go for it
250 #
251 .Lnoload:
252         l       %r1,.Lstartup
253         br      %r1
254
255 .Linitrd:.long _end                     # default address of initrd
256 .Lparm: .long  PARMAREA
257 .Lstartup: .long startup
258 .Lreset:.byte   0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
259         .byte   0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
260         .byte   0xc8,0xd6,0xd3,0xc4     # "change rdr all keep nohold"
261 .L_eof: .long   0xc5d6c600       /* C'EOF' */
262 .L_hdr: .long   0xc8c4d900       /* C'HDR' */
263         .align  8
264 .Lcpuid:.fill   8,1,0
265
266 #
267 # startup-code at 0x10000, running in absolute addressing mode
268 # this is called either by the ipl loader or directly by PSW restart
269 # or linload or SALIPL
270 #
271         .org    0x10000
272 ENTRY(startup)
273         j       .Lep_startup_normal
274         .org    0x10008
275 #
276 # This is a list of s390 kernel entry points. At address 0x1000f the number of
277 # valid entry points is stored.
278 #
279 # IMPORTANT: Do not change this table, it is s390 kernel ABI!
280 #
281         .ascii  "S390EP"
282         .byte   0x00,0x01
283 #
284 # kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
285 #
286         .org    0x10010
287 ENTRY(startup_kdump)
288         j       .Lep_startup_kdump
289 .Lep_startup_normal:
290         mvi     __LC_AR_MODE_ID,1       # set esame flag
291         slr     %r0,%r0                 # set cpuid to zero
292         lhi     %r1,2                   # mode 2 = esame (dump)
293         sigp    %r1,%r0,0x12            # switch to esame mode
294         bras    %r13,0f
295         .fill   16,4,0x0
296 0:      lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
297         sam64                           # switch to 64 bit addressing mode
298         basr    %r13,0                  # get base
299 .LPG0:
300         xc      0x200(256),0x200        # partially clear lowcore
301         xc      0x300(256),0x300
302         xc      0xe00(256),0xe00
303         xc      0xf00(256),0xf00
304         lctlg   %c0,%c15,0x200(%r0)     # initialize control registers
305         stck    __LC_LAST_UPDATE_CLOCK
306         spt     6f-.LPG0(%r13)
307         mvc     __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
308         l       %r15,.Lstack-.LPG0(%r13)
309         ahi     %r15,-STACK_FRAME_OVERHEAD
310         brasl   %r14,verify_facilities
311 # For uncompressed images, continue in
312 # arch/s390/kernel/head64.S. For compressed images, continue in
313 # arch/s390/boot/compressed/head.S.
314         jg      startup_continue
315
316 .Lstack:
317         .long   0x8000 + (1<<(PAGE_SHIFT+THREAD_SIZE_ORDER))
318         .align  8
319 6:      .long   0x7fffffff,0xffffffff
320
321 #include "head_kdump.S"
322
323 #
324 # params at 10400 (setup.h)
325 #
326         .org    PARMAREA
327         .long   0,0                     # IPL_DEVICE
328         .long   0,0                     # INITRD_START
329         .long   0,0                     # INITRD_SIZE
330         .long   0,0                     # OLDMEM_BASE
331         .long   0,0                     # OLDMEM_SIZE
332
333         .org    COMMAND_LINE
334         .byte   "root=/dev/ram0 ro"
335         .byte   0
336
337         .org    0x11000