1/*
2 * linux/arch/arm/boot/compressed/head-clps7500.S
3 *
4 * Copyright (C) 1999, 2000, 2001 Nexus Electronics Ltd
5 */
6
7
8		/* There are three different ways the kernel can be
9		   booted on a 7500 system: from Angel (loaded in RAM), from
10		   16-bit ROM or from 32-bit Flash.  Luckily, a single kernel
11		   image does for them all. */
12		/* This branch is taken if the CPU memory width matches the
13		   actual device in use.  The default at power on is 16 bits
14		   so we must be prepared for a mismatch. */
15		.section ".start", "ax"
162:
17		b	1f
18		.word	0xffff
19		.word	0xb632		@ mov r11, #0x03200000
20		.word	0xe3a0
21		.word	0x0000		@ mov r0, #0
22		.word	0xe3a0
23		.word	0x0080		@ strb r0, [r11, #0x80]
24		.word	0xe5cb
25		.word	0xf000		@ mov pc, #0
26		.word	0xe3a0
271:
28		adr	r1, 2b
29		teq	r1, #0
30		bne	.Langel
31		/* This is a direct-from-ROM boot.  Copy the kernel into
32		   RAM and run it there. */
33		mov	r0, #0x30
34		mcr	p15, 0, r0, c1, c0, 0
35		mov	r0, #0x13
36		msr	cpsr_cxsf, r0
37		mov	r12, #0x03000000	@ point to LEDs
38		orr	r12, r12, #0x00020000
39		orr	r12, r12, #0xba00
40		mov	r0, #0x5500
41		str	r0, [r12]
42		mov	r0, #0x10000000
43		orr	r0, r0, #0x8000
44		mov	r4, r0
45		ldr	r2, =_end
462:
47		ldr	r3, [r1], #4
48		str	r3, [r0], #4
49		teq	r0, r2
50		bne	2b
51		mov	r0, #0xff00
52		str	r0, [r12]
531:
54		mov	r12, #0x03000000	@ point to LEDs
55		orr	r12, r12, #0x00020000
56		orr	r12, r12, #0xba00
57		mov	r0, #0xfe00
58		str	r0, [r12]
59
60		adr	lr, 1f
61		mov	r0, #0
62		mov	r1, #14		/* MACH_TYPE_CLPS7500 */
63		mov	pc, lr
64.Langel:
65#ifdef CONFIG_ANGELBOOT
66		/* Call Angel to switch into SVC mode. */
67		mov	r0, #0x17
68		swi	0x123456
69#endif
70		/* Ensure all interrupts are off and MMU disabled */
71		mrs	r0, cpsr
72		orr	r0, r0, #0xc0
73		msr	cpsr_cxsf, r0
74
75		adr	lr, 1b
76		orr	lr, lr, #0x10000000
77		mov	r0, #0x30		@ MMU off
78		mcr	p15, 0, r0, c1, c0, 0
79		mov	r0, r0
80	 	mov	pc, lr
81
82		.ltorg
83
841:
85/* And the rest */
86#include "head.S"
87