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
30#define ARCH_OFFSET	4
31
32__HEAD
33
34#define IPL_BS	0x730
35	.org	0
36	.long	0x00080000,0x80000000+iplstart	# The first 24 bytes are loaded
37	.long	0x02000018,0x60000050		# by ipl to addresses 0-23.
38	.long	0x02000068,0x60000050		# (a PSW and two CCWs).
39	.fill	80-24,1,0x40			# bytes 24-79 are discarded !!
40	.long	0x020000f0,0x60000050		# The next 160 byte are loaded
41	.long	0x02000140,0x60000050		# to addresses 0x18-0xb7
42	.long	0x02000190,0x60000050		# They form the continuation
43	.long	0x020001e0,0x60000050		# of the CCW program started
44	.long	0x02000230,0x60000050		# by ipl and load the range
45	.long	0x02000280,0x60000050		# 0x0f0-0x730 from the image
46	.long	0x020002d0,0x60000050		# to the range 0x0f0-0x730
47	.long	0x02000320,0x60000050		# in memory. At the end of
48	.long	0x02000370,0x60000050		# the channel program the PSW
49	.long	0x020003c0,0x60000050		# at location 0 is loaded.
50	.long	0x02000410,0x60000050		# Initial processing starts
51	.long	0x02000460,0x60000050		# at 0x200 = iplstart.
52	.long	0x020004b0,0x60000050
53	.long	0x02000500,0x60000050
54	.long	0x02000550,0x60000050
55	.long	0x020005a0,0x60000050
56	.long	0x020005f0,0x60000050
57	.long	0x02000640,0x60000050
58	.long	0x02000690,0x60000050
59	.long	0x020006e0,0x20000050
60
61	.org	0x200
62#
63# subroutine to set architecture mode
64#
65.Lsetmode:
66	mvi	__LC_AR_MODE_ID,1	# set esame flag
67	slr	%r0,%r0 		# set cpuid to zero
68	lhi	%r1,2			# mode 2 = esame (dump)
69	sigp	%r1,%r0,0x12		# switch to esame mode
70	bras	%r13,0f
71	.fill	16,4,0x0
720:	lmh	%r0,%r15,0(%r13)	# clear high-order half of gprs
73	sam31				# switch to 31 bit addressing mode
74	br	%r14
75
76#
77# subroutine to wait for end I/O
78#
79.Lirqwait:
80	mvc	0x1f0(16),.Lnewpsw	# set up IO interrupt psw
81	lpsw	.Lwaitpsw
82.Lioint:
83	br	%r14
84	.align	8
85.Lnewpsw:
86	.quad	0x0000000080000000,.Lioint
87.Lwaitpsw:
88	.long	0x020a0000,0x80000000+.Lioint
89
90#
91# subroutine for loading cards from the reader
92#
93.Lloader:
94	la	%r4,0(%r14)
95	la	%r3,.Lorb		# r2 = address of orb into r2
96	la	%r5,.Lirb		# r4 = address of irb
97	la	%r6,.Lccws
98	la	%r7,20
99.Linit:
100	st	%r2,4(%r6)		# initialize CCW data addresses
101	la	%r2,0x50(%r2)
102	la	%r6,8(%r6)
103	bct	7,.Linit
104
105	lctl	%c6,%c6,.Lcr6		# set IO subclass mask
106	slr	%r2,%r2
107.Lldlp:
108	ssch	0(%r3)			# load chunk of 1600 bytes
109	bnz	.Llderr
110.Lwait4irq:
111	bas	%r14,.Lirqwait
112	c	%r1,0xb8		# compare subchannel number
113	bne	.Lwait4irq
114	tsch	0(%r5)
115
116	slr	%r0,%r0
117	ic	%r0,8(%r5)		# get device status
118	chi	%r0,8			# channel end ?
119	be	.Lcont
120	chi	%r0,12			# channel end + device end ?
121	be	.Lcont
122
123	l	%r0,4(%r5)
124	s	%r0,8(%r3)		# r0/8 = number of ccws executed
125	mhi	%r0,10			# *10 = number of bytes in ccws
126	lh	%r3,10(%r5)		# get residual count
127	sr	%r0,%r3 		# #ccws*80-residual=#bytes read
128	ar	%r2,%r0
129
130	br	%r4			# r2 contains the total size
131
132.Lcont:
133	ahi	%r2,0x640		# add 0x640 to total size
134	la	%r6,.Lccws
135	la	%r7,20
136.Lincr:
137	l	%r0,4(%r6)		# update CCW data addresses
138	ahi	%r0,0x640
139	st	%r0,4(%r6)
140	ahi	%r6,8
141	bct	7,.Lincr
142
143	b	.Lldlp
144.Llderr:
145	lpsw	.Lcrash
146
147	.align	8
148.Lorb:	.long	0x00000000,0x0080ff00,.Lccws
149.Lirb:	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
150.Lcr6:	.long	0xff000000
151.Lloadp:.long	0,0
152	.align	8
153.Lcrash:.long	0x000a0000,0x00000000
154
155	.align	8
156.Lccws: .rept	19
157	.long	0x02600050,0x00000000
158	.endr
159	.long	0x02200050,0x00000000
160
161iplstart:
162	bas	%r14,.Lsetmode		# Immediately switch to 64 bit mode
163	lh	%r1,0xb8		# test if subchannel number
164	bct	%r1,.Lnoload		#  is valid
165	l	%r1,0xb8		# load ipl subchannel number
166	la	%r2,IPL_BS		# load start address
167	bas	%r14,.Lloader		# load rest of ipl image
168	l	%r12,.Lparm		# pointer to parameter area
169	st	%r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
170
171#
172# load parameter file from ipl device
173#
174.Lagain1:
175	l	%r2,.Linitrd		# ramdisk loc. is temp
176	bas	%r14,.Lloader		# load parameter file
177	ltr	%r2,%r2 		# got anything ?
178	bz	.Lnopf
179	chi	%r2,895
180	bnh	.Lnotrunc
181	la	%r2,895
182.Lnotrunc:
183	l	%r4,.Linitrd
184	clc	0(3,%r4),.L_hdr		# if it is HDRx
185	bz	.Lagain1		# skip dataset header
186	clc	0(3,%r4),.L_eof		# if it is EOFx
187	bz	.Lagain1		# skip dateset trailer
188	la	%r5,0(%r4,%r2)
189	lr	%r3,%r2
190	la	%r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line
191	mvc	0(256,%r3),0(%r4)
192	mvc	256(256,%r3),256(%r4)
193	mvc	512(256,%r3),512(%r4)
194	mvc	768(122,%r3),768(%r4)
195	slr	%r0,%r0
196	b	.Lcntlp
197.Ldelspc:
198	ic	%r0,0(%r2,%r3)
199	chi	%r0,0x20		# is it a space ?
200	be	.Lcntlp
201	ahi	%r2,1
202	b	.Leolp
203.Lcntlp:
204	brct	%r2,.Ldelspc
205.Leolp:
206	slr	%r0,%r0
207	stc	%r0,0(%r2,%r3)		# terminate buffer
208.Lnopf:
209
210#
211# load ramdisk from ipl device
212#
213.Lagain2:
214	l	%r2,.Linitrd		# addr of ramdisk
215	st	%r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
216	bas	%r14,.Lloader		# load ramdisk
217	st	%r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
218	ltr	%r2,%r2
219	bnz	.Lrdcont
220	st	%r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
221.Lrdcont:
222	l	%r2,.Linitrd
223
224	clc	0(3,%r2),.L_hdr		# skip HDRx and EOFx
225	bz	.Lagain2
226	clc	0(3,%r2),.L_eof
227	bz	.Lagain2
228
229#
230# reset files in VM reader
231#
232	stidp	.Lcpuid			# store cpuid
233	tm	.Lcpuid,0xff		# running VM ?
234	bno	.Lnoreset
235	la	%r2,.Lreset
236	lhi	%r3,26
237	diag	%r2,%r3,8
238	la	%r5,.Lirb
239	stsch	0(%r5)			# check if irq is pending
240	tm	30(%r5),0x0f		# by verifying if any of the
241	bnz	.Lwaitforirq		# activity or status control
242	tm	31(%r5),0xff		# bits is set in the schib
243	bz	.Lnoreset
244.Lwaitforirq:
245	bas	%r14,.Lirqwait		# wait for IO interrupt
246	c	%r1,0xb8		# compare subchannel number
247	bne	.Lwaitforirq
248	la	%r5,.Lirb
249	tsch	0(%r5)
250.Lnoreset:
251	b	.Lnoload
252
253#
254# everything loaded, go for it
255#
256.Lnoload:
257	l	%r1,.Lstartup
258	br	%r1
259
260.Linitrd:.long _end			# default address of initrd
261.Lparm:	.long  PARMAREA
262.Lstartup: .long startup
263.Lreset:.byte	0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
264	.byte	0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
265	.byte	0xc8,0xd6,0xd3,0xc4	# "change rdr all keep nohold"
266.L_eof: .long	0xc5d6c600	 /* C'EOF' */
267.L_hdr: .long	0xc8c4d900	 /* C'HDR' */
268	.align	8
269.Lcpuid:.fill	8,1,0
270
271#
272# SALIPL loader support. Based on a patch by Rob van der Heij.
273# This entry point is called directly from the SALIPL loader and
274# doesn't need a builtin ipl record.
275#
276	.org	0x800
277ENTRY(start)
278	stm	%r0,%r15,0x07b0		# store registers
279	bas	%r14,.Lsetmode		# Immediately switch to 64 bit mode
280	basr	%r12,%r0
281.base:
282	l	%r11,.parm
283	l	%r8,.cmd		# pointer to command buffer
284
285	ltr	%r9,%r9			# do we have SALIPL parameters?
286	bp	.sk8x8
287
288	mvc	0(64,%r8),0x00b0	# copy saved registers
289	xc	64(240-64,%r8),0(%r8)	# remainder of buffer
290	tr	0(64,%r8),.lowcase
291	b	.gotr
292.sk8x8:
293	mvc	0(240,%r8),0(%r9)	# copy iplparms into buffer
294.gotr:
295	slr	%r0,%r0
296	st	%r0,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r11)
297	st	%r0,INITRD_START+ARCH_OFFSET-PARMAREA(%r11)
298	j	startup 		# continue with startup
299.cmd:	.long	COMMAND_LINE		# address of command line buffer
300.parm:	.long	PARMAREA
301.lowcase:
302	.byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07
303	.byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
304	.byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17
305	.byte 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
306	.byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
307	.byte 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
308	.byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37
309	.byte 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f
310	.byte 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47
311	.byte 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f
312	.byte 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57
313	.byte 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f
314	.byte 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67
315	.byte 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f
316	.byte 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77
317	.byte 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f
318
319	.byte 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87
320	.byte 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
321	.byte 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97
322	.byte 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
323	.byte 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7
324	.byte 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf
325	.byte 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7
326	.byte 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf
327	.byte 0xc0,0x81,0x82,0x83,0x84,0x85,0x86,0x87	# .abcdefg
328	.byte 0x88,0x89,0xca,0xcb,0xcc,0xcd,0xce,0xcf	# hi
329	.byte 0xd0,0x91,0x92,0x93,0x94,0x95,0x96,0x97	# .jklmnop
330	.byte 0x98,0x99,0xda,0xdb,0xdc,0xdd,0xde,0xdf	# qr
331	.byte 0xe0,0xe1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7	# ..stuvwx
332	.byte 0xa8,0xa9,0xea,0xeb,0xec,0xed,0xee,0xef	# yz
333	.byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7
334	.byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
335
336#
337# startup-code at 0x10000, running in absolute addressing mode
338# this is called either by the ipl loader or directly by PSW restart
339# or linload or SALIPL
340#
341	.org	0x10000
342ENTRY(startup)
343	j	.Lep_startup_normal
344	.org	0x10008
345#
346# This is a list of s390 kernel entry points. At address 0x1000f the number of
347# valid entry points is stored.
348#
349# IMPORTANT: Do not change this table, it is s390 kernel ABI!
350#
351	.ascii	"S390EP"
352	.byte	0x00,0x01
353#
354# kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
355#
356	.org	0x10010
357ENTRY(startup_kdump)
358	j	.Lep_startup_kdump
359.Lep_startup_normal:
360	mvi	__LC_AR_MODE_ID,1	# set esame flag
361	slr	%r0,%r0 		# set cpuid to zero
362	lhi	%r1,2			# mode 2 = esame (dump)
363	sigp	%r1,%r0,0x12		# switch to esame mode
364	bras	%r13,0f
365	.fill	16,4,0x0
3660:	lmh	%r0,%r15,0(%r13)	# clear high-order half of gprs
367	sam31				# switch to 31 bit addressing mode
368	basr	%r13,0			# get base
369.LPG0:
370	xc	0x200(256),0x200	# partially clear lowcore
371	xc	0x300(256),0x300
372	xc	0xe00(256),0xe00
373	stck	__LC_LAST_UPDATE_CLOCK
374	spt	6f-.LPG0(%r13)
375	mvc	__LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
376	xc	__LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
377	# check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
378	.insn	s,0xb2b10000,0		# store facilities @ __LC_STFL_FAC_LIST
379	tm	__LC_STFL_FAC_LIST,0x01	# stfle available ?
380	jz	0f
381	la	%r0,1
382	.insn	s,0xb2b00000,__LC_STFL_FAC_LIST	# store facility list extended
383	# verify if all required facilities are supported by the machine
3840:	la	%r1,__LC_STFL_FAC_LIST
385	la	%r2,3f+8-.LPG0(%r13)
386	l	%r3,0(%r2)
3871:	l	%r0,0(%r1)
388	n	%r0,4(%r2)
389	cl	%r0,4(%r2)
390	jne	2f
391	la	%r1,4(%r1)
392	la	%r2,4(%r2)
393	ahi	%r3,-1
394	jnz	1b
395	j	4f
3962:	l	%r15,.Lstack-.LPG0(%r13)
397	ahi	%r15,-96
398	la	%r2,.Lals_string-.LPG0(%r13)
399	l	%r3,.Lsclp_print-.LPG0(%r13)
400	basr	%r14,%r3
401	lpsw	3f-.LPG0(%r13)		# machine type not good enough, crash
402.Lals_string:
403	.asciz	"The Linux kernel requires more recent processor hardware"
404.Lsclp_print:
405	.long	_sclp_print_early
406.Lstack:
407	.long	0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
408	.align 16
4093:	.long	0x000a0000,0x8badcccc
410
411# List of facilities that are required. If not all facilities are present
412# the kernel will crash. Format is number of facility words with bits set,
413# followed by the facility words.
414
415#if defined(CONFIG_MARCH_Z13)
416	.long 3, 0xc100eff2, 0xf46ce800, 0x00400000
417#elif defined(CONFIG_MARCH_ZEC12)
418	.long 3, 0xc100eff2, 0xf46ce800, 0x00400000
419#elif defined(CONFIG_MARCH_Z196)
420	.long 2, 0xc100eff2, 0xf46c0000
421#elif defined(CONFIG_MARCH_Z10)
422	.long 2, 0xc100eff2, 0xf0680000
423#elif defined(CONFIG_MARCH_Z9_109)
424	.long 1, 0xc100efc2
425#elif defined(CONFIG_MARCH_Z990)
426	.long 1, 0xc0002000
427#elif defined(CONFIG_MARCH_Z900)
428	.long 1, 0xc0000000
429#endif
4304:
431	/* Continue with 64bit startup code in head64.S */
432	sam64				# switch to 64 bit mode
433	jg	startup_continue
434
435	.align	8
4366:	.long	0x7fffffff,0xffffffff
437
438#include "head_kdump.S"
439
440#
441# params at 10400 (setup.h)
442#
443	.org	PARMAREA
444	.long	0,0			# IPL_DEVICE
445	.long	0,0			# INITRD_START
446	.long	0,0			# INITRD_SIZE
447	.long	0,0			# OLDMEM_BASE
448	.long	0,0			# OLDMEM_SIZE
449
450	.org	COMMAND_LINE
451	.byte	"root=/dev/ram0 ro"
452	.byte	0
453
454	.org	0x11000
455