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